如何在不重新初始化模型的情况下两次训练神经网络?

假设我有这样的模型:

def mask_layer(tensor):return layers.Multiply()([tensor, tf.ones([1, 128])])def get_model():inp_1 = keras.Input(shape=(64, 101, 1), name="input")x = layers.Conv2D(256, kernel_size=(3, 3), kernel_regularizer=l2(1e-6), strides=(3, 3), padding="same")(inp_1)x = layers.LeakyReLU(alpha=0.3)(x)x = layers.Conv2D(128, kernel_size=(3, 3), kernel_regularizer=l2(1e-6), strides=(3, 3), padding="same")(x)x = layers.LeakyReLU(alpha=0.3)(x)x = layers.Flatten()(x)x = layers.Dense(512)(x)x = layers.LeakyReLU(alpha=0.3)(x)x = layers.Dense(256)(x)x = layers.LeakyReLU(alpha=0.3)(x)x= layers.Dense(128, name="output1")(x)mask = layers.Lambda(mask_layer, name="lambda_layer")(x)out2 = layers.Dense(40000, name="output2")(mask)model = keras.Model(inp_1, [mask, output2], name="2_out_model")model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),               loss="mean_squared_error")plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True)model.summary()return model

然后,我训练我的网络:

model = get_model()es = tf.keras.callbacks.EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)history = model.fit(X_train, [Y_train, Z_train], validation_data=(X_val, [Y_val, Z_val]), epochs=500,                    batch_size=32,                    callbacks=[es])test_loss, _, _ = model.evaluate(X_test, [Y_test, Z_test], verbose=1)

我想用另一组训练数据重新训练已经训练过的网络,但要改变Lambda层的定义,假设这次函数返回的是:

return layers.Multiply()([tensor, tf.ones([1, 128])*1.2])

我是否需要重新调用”get_model()”函数(因为我重新定义了一个层)然后再次训练?这样做不会有重新初始化模型权重的风险吗?提前感谢你 🙂


回答:

你的Lambda层不是可训练的层,所以你可以安全地将训练好的权重移动到另一个模型(具有相同的结构)中,但更改你的Lambda层

以下是示例:

def mask_layer1(tensor):    return layers.Multiply()([tensor, tf.ones([1, 128])])def mask_layer2(tensor):    return layers.Multiply()([tensor, tf.ones([1, 128])*1.2])def get_model(mask_kind):    inp = keras.Input(shape=(64, 101, 1), name="input")        x = layers.Conv2D(256, kernel_size=(3, 3), kernel_regularizer=l2(1e-6),                       strides=(3, 3), padding="same")(inp)    x = layers.LeakyReLU(alpha=0.3)(x)    x = layers.Conv2D(128, kernel_size=(3, 3), kernel_regularizer=l2(1e-6),                       strides=(3, 3), padding="same")(x)    x = layers.LeakyReLU(alpha=0.3)(x)    x = layers.Flatten()(x)    x = layers.Dense(512)(x)    x = layers.LeakyReLU(alpha=0.3)(x)    x = layers.Dense(256)(x)    x = layers.LeakyReLU(alpha=0.3)(x)    x = layers.Dense(128, name="output1")(x)        if mask_kind == 1:        mask = layers.Lambda(mask_layer1, name="lambda_layer")(x)    elif mask_kind == 2:        mask = layers.Lambda(mask_layer2, name="lambda_layer")(x)    else:        mask = x        out = layers.Dense(40000, name="output2")(mask)    model = keras.Model(inp, [mask, out], name="2_out_model")    model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),                   loss="mean_squared_error")        return modelmodel1 = get_model(mask_kind=1)model1.fit(...)model2 = get_model(mask_kind=2)model2.set_weights(model1.get_weights())model2.fit(...)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注