訓練模型:keras非Sequential模型的保存加載再訓練和預測

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import *
from tensorflow.keras.layers import *

一、保存
用model.save_weights(’/d¥¥¥¥t888.h5’)html

二、加載再次訓練模型
加載和預測都須要先有原來模型的結構code

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)


三、模型加載後預測妙筆閣
https://www.mbgtxt.com/28_28123/16888841.htmlhtm

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進行轉化ip

qq_sex_results2 = np.argmax(np.squeeze(qq_results1[0]),1)
sex_results = pd.DataFrame(qq_sex_results2+1)