迁移学习resnet_resnet50迁移学习过程中的严重过度拟合

本文作者在尝试使用ResNet50进行迁移学习时遇到严重过度拟合问题,模型在训练集上表现良好,但在验证集上精度停滞不前且损失增加。作者尝试了多种方法,如数据扩增、调整全连接层大小,但未见成效。最终,作者发现问题是出在图像预处理阶段,通过改进预处理和使用线性SVC,训练和测试集的准确性分别达到60%和45%。

这是我第一次尝试用cns做一些事情,所以我可能做了一些非常愚蠢的事情-但是我不知道我错在哪里。。。在

这个模型似乎学习得很好,但是验证精度没有提高(甚至在第一个纪元之后),而且验证损失实际上随着时间的推移而增加。看起来我不是太适合(在1个时代之后?)-我们必须换个方式走吗。在

我正在训练一个CNN网络-我有大约10万张不同植物的图片(1000个班级),我想微调ResNet50来创建一个多类分类器。图片大小不一,我是这样加载的:from keras.preprocessing import image

def path_to_tensor(img_path):

# loads RGB image as PIL.Image.Image type

img = image.load_img(img_path, target_size=(IMG_HEIGHT, IMG_HEIGHT))

# convert PIL.Image.Image type to 3D tensor with shape (IMG_HEIGHT, IMG_HEIGHT, 3)

x = image.img_to_array(img)

# convert 3D tensor to 4D tensor with shape (1, IMG_HEIGHT, IMG_HEIGHT, 3) and return 4D tensor

return np.expand_dims(x, axis=0)

def paths_to_tensor(img_paths):

list_of_tensors = [path_to_tensor(img_path) for img_path in img_paths] #can use tqdm(img_paths) for data

return np.vstack(list_of_tensors)enter code here

数据库很大(无法放入内存中),必须创建自己的生成器来提供磁盘读取和扩充。(我知道Keras有.flow_from_directory()-但我的数据不是这样结构化的-它只是100k个图像和100k个元数据文件混合的转储)。我可能应该创建一个脚本来更好地组织它们,而不是创建我自己的生成器,但问题可能在其他地方。在

下面的生成器版本暂时不做任何扩充-只是重新缩放:

^{pr2}$

我是这样定义我的模型的:def get_model():

# define the model

base_net = ResNet50(input_shape=DIMENSIONS, weights='imagenet', include_top=False)

# Freeze the layers which you don't want to train. Here I am freezing all of them

for layer in base_net.layers:

layer.trainable = False

x = base_net.output

#for resnet50

x = Flatten()(x)

x = Dense(512, activation="relu")(x)

x = Dropout(0.5)(x)

x = Dense(1000, activation='softmax', name='predictions')(x)

model = Model(inputs=base_net.input, outputs=x)

# compile the model

model.compile(

loss='categorical_crossentropy',

optimizer=optimizers.Adam(1e-3),

metrics=['acc'])

return model

因此,我有1562088个可训练的参数,用于大约70k幅图像

然后我使用5倍交叉验证,但是模型在任何折叠上都不起作用,所以我不会在这里包括完整的代码,相关的位是:trial_fold = temp_model.fit_generator(

train_generator,

steps_per_epoch = len(X_train_path) // BATCH_SIZE,

epochs = 50,

verbose = 1,

validation_data = (xs_v,ys_v),#valid_generator,

#validation_steps= len(X_valid_path) // BATCH_SIZE,

callbacks = callbacks,

shuffle=True)

我做了各种各样的事情-确保我的发电机实际工作,尝试通过缩小完全连接层的大小来处理网络的最后几层,尝试增强-没有任何帮助。。。在

我不认为网络中的参数数量太多——我知道其他人也做过同样的事情,而且精度接近0.5,但我的模型似乎过于拟合了。任何关于如何解决这一问题的想法将不胜感激!在

更新1:

我已经决定停止重新发明东西,并按文件排序来使用.flow_from_directory()过程。为了确保导入的格式正确(由下面的Ioannis Nasios注释触发),我确保从keras的resnet50应用程序中预处理了_unit()。在

我还决定检查这个模型是否真的产生了一些有用的东西——我为我的数据集计算了botleneck特性,然后使用一个随机林来预测类。它确实奏效了,我的准确度达到了0.4左右

所以,我想我的图像输入格式肯定有问题。下一步,我将微调模型(使用新的顶层)以查看问题是否仍然存在。。。在

更新2:

我想问题出在图像预处理上。

最后我没有进行微调,只提取了botleneck层并训练了linear-SVC()——得到了约60%的train和45%的测试数据集的准确度。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值