import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import *
from tensorflow.keras.layers import *
1、保存
用model.save_weights(’/d¥¥¥¥t888.h5’)
2、加載再次訓練模型
加載和預測都需要先有原來模型的結構
from tensorflow.keras import backend as K
def create_model():
i1 = Input(shape=(200,), dtype='int32')
i2 = Input(shape=(200,), dtype='int32')
x1 = Embedding(len(embeddings_matrix_creative_id),200,weights=[embeddings_matrix_creative_id],trainable=False)(i1)
x2 = Embedding(len(embeddings_matrix_advertiser_id),150,weights=[embeddings_matrix_advertiser_id],trainable=False)(i2)
x1 = Bidirectional(LSTM(250, return_sequences=True))(x1)
# x1 = Attention()([x1,x1])
x2 = Bidirectional(LSTM(250, return_sequences=True))(x2)
# x2 = Attention()([x2,x2])
# att = Attention()([gru,gru])
e = Dot(axes=2)([x1, x2])
e1 = Softmax(axis=2)(e)
e2 = Softmax(axis=1)(e)
e1 = Lambda(K.expand_dims, arguments={'axis' : 3})(e1)
e2 = Lambda(K.expand_dims, arguments={'axis' : 3})(e2)
_x1 = Lambda(K.expand_dims, arguments={'axis' : 1})(x2)
_x1 = Multiply()([e1, _x1])
_x1 = Lambda(K.sum, arguments={'axis' : 2})(_x1)
_x2 = Lambda(K.expand_dims, arguments={'axis' : 2})(x1)
_x2 = Multiply()([e2, _x2])
_x2 = Lambda(K.sum, arguments={'axis' : 1})(_x2)
m1 = Concatenate()([x1, _x1, Subtract()([x1, _x1]), Multiply()([x1, _x1])])
m2 = Concatenate()([x2, _x2, Subtract()([x2, _x2]), Multiply()([x2, _x2])])
y1 = Bidirectional(LSTM(250, return_sequences=True))(m1)
# y1 = Attention()([y1,y1])
y2 = Bidirectional(LSTM(250, return_sequences=True))(m2)
# y2 = Attention()([y2,y2])
mx1 = Lambda(K.max, arguments={'axis' : 1})(y1)
av1 = Lambda(K.mean, arguments={'axis' : 1})(y1)
mx2 = Lambda(K.max, arguments={'axis' : 1})(y2)
av2 = Lambda(K.mean, arguments={'axis' : 1})(y2)
yc = Concatenate()([av1, mx1, av2, mx2])
# y = Dense(500, activation='relu')(y)
# y = Dropout(0.3)(y)
y = Dense(100, activation='relu')(yc)
y = Dropout(0.3)(y)
y = Dense(2, activation='sigmoid',name='train_gender')(y)
z = Dense(100, activation='relu')(yc)
z = Dropout(0.3)(z)
z = Dense(10, activation='softmax',name='train_age')(z)
model = Model([i1,i2],[y,z])
return model
model = create_model()
# model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
# model.load_weights('lstm_embeding_sex_1.h5')
# model = load_model('/data/nextcloud/dbc2017/files/last1.h5')
# model = Model([i1,i2],[y,z])
# model.summary()
model.compile(loss={"train_gender":"binary_crossentropy","train_age":"categorical_crossentropy"},
loss_weights={
'train_gender': 1.,
'train_age': 1.,
},optimizer='adam',metrics=['accuracy'])
model.load_weights('/data/nextcloud/dbc2017/files/last1.h5')
checkpoint=[callbacks.EarlyStopping(monitor='val_acc', patience=1),
callbacks.ModelCheckpoint('/data/nextcloud/dbc2017/files/best666.h5',monitor='val_acc',verbose=1,save_best_only=True,mode='max')]
model.fit([train_creative_id1, train_advertiser_id1],[yyy1,yyy_age1], epochs=1, batch_size=50,validation_split=0.2,
callbacks=checkpoint)
3、模型加載後預測
from tensorflow.keras import backend as K
def create_model():
i1 = Input(shape=(200,), dtype='int32')
i2 = Input(shape=(200,), dtype='int32')
x1 = Embedding(len(embeddings_matrix_creative_id),200,weights=[embeddings_matrix_creative_id],trainable=False)(i1)
x2 = Embedding(len(embeddings_matrix_advertiser_id),150,weights=[embeddings_matrix_advertiser_id],trainable=False)(i2)
x1 = Bidirectional(LSTM(250, return_sequences=True))(x1)
# x1 = Attention()([x1,x1])
x2 = Bidirectional(LSTM(250, return_sequences=True))(x2)
# x2 = Attention()([x2,x2])
# att = Attention()([gru,gru])
e = Dot(axes=2)([x1, x2])
e1 = Softmax(axis=2)(e)
e2 = Softmax(axis=1)(e)
e1 = Lambda(K.expand_dims, arguments={'axis' : 3})(e1)
e2 = Lambda(K.expand_dims, arguments={'axis' : 3})(e2)
_x1 = Lambda(K.expand_dims, arguments={'axis' : 1})(x2)
_x1 = Multiply()([e1, _x1])
_x1 = Lambda(K.sum, arguments={'axis' : 2})(_x1)
_x2 = Lambda(K.expand_dims, arguments={'axis' : 2})(x1)
_x2 = Multiply()([e2, _x2])
_x2 = Lambda(K.sum, arguments={'axis' : 1})(_x2)
m1 = Concatenate()([x1, _x1, Subtract()([x1, _x1]), Multiply()([x1, _x1])])
m2 = Concatenate()([x2, _x2, Subtract()([x2, _x2]), Multiply()([x2, _x2])])
y1 = Bidirectional(LSTM(250, return_sequences=True))(m1)
# y1 = Attention()([y1,y1])
y2 = Bidirectional(LSTM(250, return_sequences=True))(m2)
# y2 = Attention()([y2,y2])
mx1 = Lambda(K.max, arguments={'axis' : 1})(y1)
av1 = Lambda(K.mean, arguments={'axis' : 1})(y1)
mx2 = Lambda(K.max, arguments={'axis' : 1})(y2)
av2 = Lambda(K.mean, arguments={'axis' : 1})(y2)
yc = Concatenate()([av1, mx1, av2, mx2])
# y = Dense(500, activation='relu')(y)
# y = Dropout(0.3)(y)
y = Dense(100, activation='relu')(yc)
y = Dropout(0.3)(y)
y = Dense(2, activation='sigmoid',name='train_gender')(y)
z = Dense(100, activation='relu')(yc)
z = Dropout(0.3)(z)
z = Dense(10, activation='softmax',name='train_age')(z)
model = Model([i1,i2],[y,z])
return model
model = create_model()
# model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
# model.load_weights('lstm_embeding_sex_1.h5')
# model = load_model('/data/nextcloud/dbc2017/files/last1.h5')
# model = Model([i1,i2],[y,z])
# model.summary()
model.compile(loss={"train_gender":"binary_crossentropy","train_age":"categorical_crossentropy"},
loss_weights={
'train_gender': 1.,
'train_age': 1.,
},optimizer='adam',metrics=['accuracy'])
model.load_weights('/data/nextcloud/dbc2017/files/last1.h5')
qq_results1 = model.predict([test_creative_id1, test_advertiser_id1])
另外:predict預測出來的是概率,需要argmax進行轉化
qq_sex_results2 = np.argmax(np.squeeze(qq_results1[0]),1)
sex_results = pd.DataFrame(qq_sex_results2+1)