Python 如何使用一个预先训练的MLP中的最后一个隐藏层权重作为输入,使用Keras进行新的MLP(转移学习)?

Python 如何使用一个预先训练的MLP中的最后一个隐藏层权重作为输入,使用Keras进行新的MLP(转移学习)?,python,machine-learning,keras,keras-layer,transfer-learning,Python,Machine Learning,Keras,Keras Layer,Transfer Learning,我想用简单的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') n

我想用简单的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  # index of desired layer
input_shape = net.layers[idx].get_input_shape_at(0) # get the input shape of desired layer
input_layer = net.layers[idx]
input_layer.trainable = False

transf_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)
让这项工作成功的诀窍是什么?

我只想用它来构建这样一个模型:

shared_layer = net.layers[0] # you want the first layer, so index = 0
shared_layer.trainable = False

inp = Input(the_shape_of_one_input_sample) # e.g. (2048,)
x = shared_layer(inp)
x = Dense(800, ...)(x)
out = Dense(1, ...)(x)

model = Model(inp, out)

# the rest is the same...

您在第二个模型中使用的共享层需要2D输入,但您正在为模型提供3D输入?!拜托,谁?对于熟悉Keras的人来说,回答起来一定很简单。你读了我的评论吗?@今天读我的编辑。第二个模型中最后一个
密集的
层应该有1个单位,而不是
输入形状[0]
单位,对吗?我觉得你把事情弄得有点复杂了。有更好的方法可以做到这一点。如果第一个网络有两个隐藏层,而我想将它们都转移到新的网络中,那该怎么办?@tevang它是一样的:你得到这些层,然后将它们应用到张量上(即前几层的输出)。例如,
x=shared\u layer1(inp)
然后
x=shared\u layer2(x)
。是的,就是这样!非常感谢你!