图片输入大小问题-keras/PIL.Image

之前在做keras训练任务的时候都没有考虑过图像数据的输入大小问题,但在实验中发现这也是一个容易陷坑的问题。

1.keras封装好的模型,当include_top=False时,迁移权重训练,图像的输入也不用必须是默认的尺寸。可以是比默认尺寸大的任意尺寸,比默认尺寸小的话,就要考虑够不够计算一系列的卷积池化操作了。

  • 权重保存的是卷积“核”的权重,只要卷积核的大小数目不变,即网络模型不变,就可以做迁移学习,图像输入大小只是改变每一层的具体图像块,不影响保存的权重形状

2.图像通过PIL.Image模块直接resize的话,默认resize方式是"nearest",可选项还有"bilinear","bicubic",最近邻采样公式:pixel_B(X,Y)=pixel_A(X*(m/M),Y*(n/N)),所以!做两次resize和一次直接resize的结果很可能不同!

3.keras训练及预测时的图像处理过程如下代码所示,即都是直接调用Image库的resize,与上述的PIL.Image操作相同

# 图片打分predicet
from keras.preprocessing import image
image.load_img()
# 当有target_size时,会进行resize,否则只是读取
img = img.resize(width_height_tuple, resample)

# 训练时候的图片输入
train_generator = train_datagen.flow_from_directory()#生成数据流
hist = model.fit_generate()#生成一个bacth的数据,调用image.load_img()

4.综合上述2,3两点,在实验过程中就遇到了以下问题:
用全部数据训练,达到训练准确率99%,当然这肯定是过拟合了的。但是在训练得到的模型提取全连接层特征用xgb重新分类的时候,居然准确率只有67%?
研究了一天后发现,是数据输入的问题。

  • 实验一:训练数据1024,模型输入224,通过模型load_img()直接resize成224,预测的时候同样拿1024数据predict,如2所说,没有问题,xgb的结果也是99%

  • 实验二:预先通过Image将1024的图像resize到512,再通过模型load_img()resize到224,预测的时候错误输入1024的图像,predicet的时候直接resize到224,所以出现了67%结果的错误。

下图可详细说明这个过程。同个区域不同过程的操作,结果不同

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_23590921/article/details/80912350