使用cifar 100数据预训练cifar 10网络

时间:2019-11-14 05:36:46

标签: python tensorflow keras deep-learning

为了进行微调,您将使用CIFAR-100数据集的“总线”和“老虎”类中的数据。您的任务是找出如何微调 预训练的CNN模型,使用训练数据(我认为每个班级有500张图片)“公共汽车”和“老虎”班级来微调网络, 并使用相同2类的测试数据(每类100张图像)验证准确性。可以对所选内容进行微调 预训练模型的各层。微调最后一层,最后两层,最后三层时,您需要记录测试的准确性 层,最后四层以及所有五层

我的第一个问题是如何仅使用cifar100的公共汽车和老虎机并训练模型? 第二个问题是如何微调最后一层,最后两层等。

我正在进行cifar 10的培训,然后想在cifar100上的公共汽车和老虎上进行微调。

1 个答案:

答案 0 :(得分:1)

  

我的第一个问题是如何仅使用cifar100的公共汽车和老虎机并训练模型?

实际上,这取决于您要实现的目标。注意,在CIFAR10中没有Tiger或Bus类。您可以在CIFAR10上使用经过预训练的网络为两个类别(老虎和公共汽车)创建新的分类器,或将它们添加到现有的10个类别中,结果您将获得12个类别的分类器。在这两种情况下,您都必须将最后一层的大小从10修改为2或12。

您只需要使用可能会从CIFAR100集合中使用标签来代表老虎或公共汽车的图片,然后将它们添加到您的训练集中即可。

  

第二个问题是如何微调最后一层,最后两层等。

您可以冻结在培训期间不希望修改的图层。冻结意味着在训练过程中不会通过损失函数的梯度来更新所考虑层中的权重。

如何执行此操作取决于您使用的框架。例如,在Keras中,您可以将不想训练的图层的 trainable 参数设置为false。请参阅下面的示例,如何冻结简单CNN中除最后两层以外的所有层。

from keras import Sequential
from keras.layers import Conv2D, Flatten, Dense

model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=(32, 32, 3)))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(Conv2D(16, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(10, activation='softmax'))

for layer in model.layers[:-2]:
    layer.trainable = False