我是转学的新手,我对如何为其设置代码有一些疑问。我也阅读了其他类似问题的帖子,但是这些都没有帮助我解决问题。
我已经在自己获得的大型数据集上从头开始训练了CNN。为此,我仅将权重保存在hdf5文件中。
现在,我想使用相同的CNN架构来建立一个模型,该模型可以对可用数据较少的其他数据进行分类。
这是新模型的体系结构:
# Input
inputs = Input(shape =(200, 1), name = 'ip_inputs')
# Feature Extraction
conv1 = Conv1D(40, 3, kernel_initializer = 'he_normal', activation = 'relu', strides = 2, padding = 'same', name = 'ip_C1') (inputs)
batchnorm1 = BatchNormalization(name = 'ip_BN1') (conv1)
# Flatten
flatten = Flatten(name = 'ip_F') (batchnorm1)
# Classification
dense1 = Dense(300, activation = 'relu', kernel_initializer = 'he_normal', name = 'ip_FC1') (flatten)
dropout1 = Dropout(0.4, name = 'D1') (dense1)
dense2 = Dense(300, activation = 'relu', kernel_initializer = 'he_normal', name = 'ip_FC2') (dropout1)
dropout2 = Dropout(0.3, name = 'D2') (dense2)
predictions = Dense(16, activation='softmax', kernel_initializer = 'he_normal', name = 'ip_FC6') (dropout2)
# Model
model = Model(inputs=inputs, outputs=predictions)
我从头开始训练的旧模型具有相似的体系结构,但输入和输出形状不同。
使用
model.load_weights(weights_path, by_name = True)
我加载以前保存的重量。
但是,我不知道如何正确进行转学。有人可以针对以下问题提供一些建议吗?
trainable = false
?谢谢您的指教!
答案 0 :(得分:0)
使用具有相同结构的转移学习等同于在较新的数据上重新训练模型。
具有完全相同的结构,我想不出比以前训练中存储的更好的权重初始化,因此我将按照您当前的工作来加载所有权重。
要重新训练的层数选择应基于您的特定数据。
在一种极端情况下,您可以重新训练整个模型(所有层)。在这种情况下,您将调整对数据的更深层次的了解,以更好地适应新数据集。该过程的计算负担很大,因为您必须计算所有梯度以更新所有参数。
在另一个极端,您只能重新训练最后一层。在这种情况下,trianing会快得多(所涉及的计算要少得多),但是您的模型受到约束,无法像以前那样非常相似地理解数据,这将导致对新数据有更肤浅的了解。
通常,最好的选择是介于两者之间,但这始终取决于您的特定数据。