炼丹记之实战LSTM搭炉炼丹

写在前面:炉是垃圾炉,丹是垃圾丹(结的丹中age最高只有0.369,还没我用catboost刷出来的高)

腾讯2020广告算法大赛地址:https://algo.qq.com/

前一篇博文写了如何构造embedding vector,并且把vector转成了DataFrame格式,戳这里:炼丹记之在非典型NLP领域使用word2vec构造特征

搭炉前的废话一:在实际操作的时候由于生成的creative_id二进制corpus被我不小心重写为空了,需要重新计算,所以这次造鼎炼丹用的是之前计算好的ad_id的64维embeding vector(格式是DataFrame)。

搭炉前的废话二:由于比赛还没结束,官方不允许分享baseline,所以这里只演示下搭炉的方式以及用gensim embeding得到的vector输入lstm时需要注意的地方。

以下是粗略的炉(比实际操作的时候省去了很多层跟调整后的参数):

注 :代码中的注释都是本人踩过的坑,跟我一样是新手的要特别注意

import numpy as np
import keras
from keras import optimizers
from keras.models import Sequential
from keras.layers import Dense, Dropout,Activation,BatchNormalization
from keras.layers import Embedding
from keras.layers import LSTM

#timesteps*input_dim的值需要等于训练数据特征个数,比如这次是64维
timesteps = 4
input_dim = 16
np_train_set_X = np_train_set_X.reshape((np_train_set_X.shape[0], timesteps, input_dim))

"""
## Build the model
"""
model = Sequential()
#input_shape输入为三维数据(samples,timesteps,input_dim)
#其中samples为训练数据的行数,比如这次是90万条
#再次提醒,timesteps*input_dim的值需要等于训练数据特征个数,比如这次是64维
model.add(LSTM(512,input_shape=(timesteps, input_dim), return_sequences=True, name = 'lstm1'))
model.add(LSTM(units=128, name = 'lstm2'))
model.add(Dense(units=32, activation='relu', name = 'Dense1'))
#输出层,10分类任务,units需要等于分类个数的大小
#输出层,10分类任务,activation选择使用softmax
model.add(Dense(units=10, activation='softmax', name = 'Dense2'))
model.summary()
#由于是10分类,loss选择categorical_crossentropy
model.compile( optimizer="adam",  loss="categorical_crossentropy", metrics=["accuracy"])

my_callbacks = [
    keras.callbacks.EarlyStopping(patience=2),
    keras.callbacks.ModelCheckpoint(filepath='./kerasmodel/model.ad_id.{epoch:04d}-{val_accuracy:.4f}',save_best_only=True, monitor='val_accuracy',mode='auto'),
    keras.callbacks.TensorBoard(log_dir='./kerasmodel/logs/'),
]
#特别需要注意的是np_train_set_X的格式为numpy 的array 格式
#np_train_Y是one-hot后的label,是numpy array格式,比如这次的len(np_train_Y[0])=10
history = model.fit(np_train_set_X, np_train_Y, batch_size=32, epochs=5, validation_split=0.2, shuffle=True, workers=90, use_multiprocessing=True, callbacks=my_callbacks )

最后炼了一炉丹,最好的丹中age只有0.369,还没我用catboost刷出来的高。不过好在终于大致弄清了DL LSTM分类炼丹的大致流程,也算收货不少。

最后:服务器没有GPU,用CPU来炼丹,就问你怕不怕!哈哈~~好在内存够,CPU也还过得去,一个epoch 20多分钟差不多能跑完

猜你喜欢

转载自blog.csdn.net/lanxuxml/article/details/106791069