我正在尝试在Keras + Tensorflow中对Places-205数据集的选定子集进行传输学习,仅包含27个类别。我正在使用在ImageNet上预先训练过的InceptionV3,DenseNet121和ResNet50,并添加了几个额外的层来适应我的课程。如果模型是ResNet,我添加Flatten + Dense进行分类,如果是DenseNet或Inceptionv3,我添加Global Avg Pool + Dense(relu)+ Dense(分类)。 这是代码段:
x = base_model.output
if FLAGS.model in 'resnet50':
x = Flatten(name="flatten")(x)
else:
x = GlobalAveragePooling2D()(x)
# Let's add a fully-connected layer
x = Dense(1024, activation = 'relu')(x)
# And a logistic layer
predictions = Dense(classes, activation = 'softmax')(x)
对于DenseNet和Inceptionv3,培训是可以的,验证准确率达到70%,但对于ResNet,验证准确度保持固定在0.0369 / 0.037(这是我的课程数量的1/27)。它似乎总是预测一个类,但它很奇怪,因为它的训练进展顺利,非特定的模型代码与DenseNet和InceptionV3完全相同,它们按预期工作。
你知道为什么会这样吗?
非常感谢!
答案 0 :(得分:0)
与您@Ciprian Andrei Focsaneanu一样,我遇到了类似的问题,而我发现已经奏效的是使之前的层(在完全连接的层之前)是可训练的,因为ResNet50的过滤器/功能不适合我的应用程序。
奇怪的是,我还训练了VGG16模型,该模型最初是在相同的图像(imagenet)上使用的,但是它的过滤器对我的应用程序有效,但是我偏离了题名。
以下是启发我执行此操作的页面的链接:https://datascience.stackexchange.com/questions/16840/multi-class-neural-net-always-predicting-1-class-after-optimization
希望这会有所帮助!