我正在尝试使用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 one和输出之间添加一些额外的Dense层:
x = Dense(32,activation='relu')(model1.layers[-2].output)
outputs = model1.layers[-1](x)
但是,当我运行它时,我得到了这个:
ValueError:输入0与图层dense_1不兼容:输入形状的预期轴-1具有值784但是有形状(无,32)
有人可以解释一下发生了什么以及如何/如果我可以为已经训练过的模型添加图层?
谢谢
1 回答
Dense
图层严格用于特定输入维度 . 定义后,该维度无法更改(它需要不同数量的权重) .因此,如果您真的想在已经使用的密集层之前添加图层,则需要确保最后一个新图层的输出与展平输出的形状相同 . (它说你需要784,所以你的新最后一个密集层需要784个单位) .
Another approach
由于你要添加中间层,保留最后一层是没有意义的:它是专门为某个输入训练的,如果你改变输入,那么你需要再次训练它 .
嗯...既然你需要再次训练它,为什么还要保留呢?只需创建一个适合新旧图层形状的新图形 .