如何使用预训练的MLP的最后一个隐藏层权重作为输入来训练新的MLP(迁移学习)?

我想使用简单的MLP模型进行迁移学习。首先,我在大量数据上训练了一个具有1个隐藏层的前馈网络:

net = Sequential()net.add(Dense(500, input_dim=2048, kernel_initializer='normal', activation='relu'))net.add(Dense(1, kernel_initializer='normal'))net.compile(loss='mean_absolute_error', optimizer='adam')net.fit(x_transf,         y_transf,        epochs=1000,         batch_size=8,         verbose=0)

然后,我想将这个独特的隐藏层作为输入传递给一个新网络,在这个新网络中,我希望添加第二层。重用的层不应该被训练。

idx = 1  # 所需层的索引input_shape = net.layers[idx].get_input_shape_at(0) # 获取所需层的输入形状input_layer = net.layers[idx]input_layer.trainable = Falsetransf_model = Sequential()transf_model.add(input_layer)transf_model.add(Dense(input_shape[1], activation='relu'))transf_model.compile(loss='mean_absolute_error', optimizer='adam')transf_model.fit(x,                  y,                 epochs=10,                  batch_size=8,                  verbose=0)

编辑:上述代码返回了以下错误:

ValueError: Error when checking target: expected dense_9 to have shape (None, 500) but got array with shape (436, 1)

有什么技巧可以让这个工作起来呢?


回答:

我会简单地使用功能API来构建这样的模型:

shared_layer = net.layers[0] # 你想要第一层,所以索引是0shared_layer.trainable = Falseinp = Input(the_shape_of_one_input_sample) # 例如 (2048,)x = shared_layer(inp)x = Dense(800, ...)(x)out = Dense(1, ...)(x)model = Model(inp, out)# 其余部分相同...

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中创建了一个多类分类项目。该项目可以对…

发表回复

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