我正在努力学习使用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)
有人可以解释一下发生了什么以及如何/如果我可以将图层添加到已经训练过的模型中?
谢谢
答案 0 :(得分:3)
严格按照某个输入维度制作Dense
图层。定义后,该维度无法更改(它需要不同数量的权重)。
因此,如果您真的想在已经使用的密集层之前添加图层,则需要确保最后一个新图层的输出与展平输出的形状相同。 (它说你需要784,所以你的新的最后密集层需要784个单位)。
另一种方法
由于你要添加中间层,保留最后一层是没有意义的:它是专门为某个输入训练的,如果你改变输入,那么你需要再次训练它。
嗯......既然你需要再次训练它,为什么还要保留呢?只需创建一个适合新旧图层形状的新图形。