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

被折叠的 条评论
为什么被折叠?



