我正在尝试学习使用 Keras 模型 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'])
Run Code Online (Sandbox Code Playgroud)
它的架构是
InputLayer -> BatchNormalization -> Flatten -> Dense
在对它进行一些训练批次之后,我想在 Flatten 和输出之间添加一些额外的 Dense 层:
x = Dense(32,activation='relu')(model1.layers[-2].output)
outputs = model1.layers[-1](x)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,我得到了这个:
ValueError:输入 0 与层密集_1 不兼容:输入形状的预期轴 -1 具有值 784 但得到形状(无,32)
有人可以解释一下发生了什么以及如何/是否可以向已经训练好的模型添加层?
谢谢
一个Dense层是严格为某个输入维度制作的。该维度在您定义后无法更改(它需要不同数量的权重)。
因此,如果您真的想在已使用的密集层之前添加层,则需要确保最后一个新层的输出与展平的输出具有相同的形状。(它说你需要 784,所以你新的最后一个密集层需要 784 个单位)。
另一种方法
由于您要添加中间层,因此保留最后一层是没有意义的:它是专门针对某个输入进行训练的,如果您更改了输入,则需要再次对其进行训练。
嗯……既然要再练一遍,为什么要留着呢?只需创建一个适合您之前新图层形状的新图层即可。
| 归档时间: |
|
| 查看次数: |
5514 次 |
| 最近记录: |