Keras模型 - 功能API - 将图层添加到现有模型

时间:2018-02-02 14:37:47

标签: keras

我正在努力学习使用Keras Model API修改经过训练的模型,以便在旅途中对其进行微调:

一个非常基本的模型:

inputs = Input((x_train.shape[1:]))
x = BatchNormalization(axis=1)(inputs)
x = Flatten()(x)
outputs = Dense(10, activation='softmax')(x)
model1 = Model(inputs, outputs)
model1.compile(optimizer=Adam(lr=1e-5), loss='categorical_crossentropy', metrics=['categorical_accuracy'])

它的架构是

  

InputLayer - > BatchNormalization - >展平 - >密

在我对它进行一些训练后,我想在Flatten one和输出之间添加一些额外的Dense层:

x = Dense(32,activation='relu')(model1.layers[-2].output)
outputs = model1.layers[-1](x)

然而,当我运行它时,我明白了:

  

ValueError:输入0与图层dense_1不兼容:输入形状的预期轴-1具有值784但形状为(无,32)

有人可以解释一下发生了什么以及如何/如果我可以将图层添加到已经训练过的模型中?

谢谢

1 个答案:

答案 0 :(得分:3)

严格按照某个输入维度制作Dense图层。定义后,该维度无法更改(它需要不同数量的权重)。

因此,如果您真的想在已经使用的密集层之前添加图层,则需要确保最后一个新图层的输出与展平输出的形状相同。 (它说你需要784,所以你的新的最后密集层需要784个单位)。

另一种方法

由于你要添加中间层,保留最后一层是没有意义的:它是专门为某个输入训练的,如果你改变输入,那么你需要再次训练它。

嗯......既然你需要再次训练它,为什么还要保留呢?只需创建一个适合新旧图层形状的新图形。