我从https://github.com/flyyufelix/cnn_finetune获取代码并对其进行了重新设计,以便现在有两个并行的DenseNet-121,每个模型的最后一个全局平均值集合后的图层被移除。
两个模型都是这样连接在一起的:
print("Begin model 1")
model = densenet121_model(img_rows=img_rows, img_cols=img_cols, color_type=channel, num_classes=num_classes)
print("Begin model 2")
model2 = densenet121_nw_model(img_rows=img_rows, img_cols=img_cols, color_type=channel, num_classes=num_classes)
mergedOut = Add()([model.output,model2.output])
#mergedOut = Flatten()(mergedOut)
mergedOut = Dense(num_classes, name='cmb_fc6')(mergedOut)
mergedOut = Activation('softmax', name='cmb_prob')(mergedOut)
newModel = Model([model.input,model2.input], mergedOut)
adam = Adam(lr=1e-3, decay=1e-6, amsgrad=True)
newModel.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])
# Start Fine-tuning
newModel.fit([X_train,X_train], Y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
shuffle=True,
verbose=1,
validation_data=([X_valid,X_valid],Y_valid)
)
第一个模型的图层被冻结,并且平行的模型可以在第一个模型的基础上学习额外的特征,从而提高准确性。
然而,即使在100个时代, 训练准确率几乎达到100%,但验证浮动率约为9%。
我不太确定可能是什么原因以及如何解决它,考虑到我已经从SGD更改了优化器(相同的概念,2个密集网络,第一个训练在ImageNet上,第二个没有权重开始相同的结果)到亚当(2个密集网,都在图像网上预先训练过。)
Epoch 101/1000
1000/1000 [==============================] - 1678s 2s/step - loss: 0.0550 - acc: 0.9820 - val_loss: 12.9906 - val_acc: 0.0900
Epoch 102/1000
1000/1000 [==============================] - 1703s 2s/step - loss: 0.0567 - acc: 0.9880 - val_loss: 12.9804 - val_acc: 0.1100