如何使用Functional API向现有Keras模型添加层?

hts6caw3  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(223)

我正在尝试使用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 -> Dense

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

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

但是,当我运行它时,我得到了这个:

ValueError: Input 0 is incompatible with layer dense_1: expected axis -1 of input 
shape to have value 784 but got shape (None, 32)

这是怎么回事,如何/如果我可以添加层到一个已经训练好的模型?

kupeojn6

kupeojn61#

Dense层是严格针对某个输入维度制作的。该维度在定义后无法更改(它需要不同数量的权重)。
因此,如果你真的想在一个已经使用的密集层之前添加层,你需要确保最后一个新层的输出与flatten的输出形状相同。(它说你需要784,所以你的新的最后一个密集层需要784个单位)。

另一种方法

因为你在添加中间层,所以保留最后一层是没有意义的:它是专门针对某个输入进行训练的,如果你改变了输入,那么你需要再次训练它。
既然你需要再训练一次,为什么要留着它?只需创建一个新的,将适合您的新的先前层的形状。

相关问题