在卷积神经网络中,我们经常要对数据进行增强,从而扩充我们的数据量。个人比较喜欢用tensorflow.keras来实现,所有代码可在jupyter上实现。
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.preprocessing.image import img_to_array, load_img
import matplotlib.pyplot as plt
datagen = ImageDataGenerator(
rotation_range = 40, # 随机旋转角度
width_shift_range = .2, # 随机水平平移
height_shift_range = .2, # 随机竖直平移
rescale = 1./255, # 数值归一化
shear_range = .2, # 随机裁剪
zoom_range =.2, # 随机放大
horizontal_flip = True, # 水平翻转
fill_mode='nearest') # 填充方式
#导入图片
img = load_img('apple1.jpg')
plt.imshow(img, 'gary')
plt.axis('off')
plt.show()
#将图片转换为numpy格式
x = img_to_array(img)
x.shape
结果为(180, 189, 3)
此时的x为三维,而数据增强的输入要求为4为,我们可以通过以下方式升维,
#方法一
x = x.reshape(1,x.shape[0], x.shape[1],x.shape[2])
#方法二,要导入numpy
x = np.reshape(x,(1,x.shape[0], x.shape[1],x.shape[2]))
#方法三,要导入numpy
x = np.expand_dims(x, axis = 0)
结果为(1, 180, 189, 3)
i = 0
for batch in datagen.flow(x, batch_size = 1, save_to_dir = 'temp', save_prefix = 'apple', save_format= 'jpg'):
i = i+1
if i >9:
break
datagen.flow中的x要求是4维的,这必须注意.batch_size = 1,表示每次循环值产生一张图片,若batch_size = 100,那么每次循环就产生100张图片。save_to_dir = ‘temp’,表示生成图片的存放位置,temp这个文件夹必须提前建好,否则会报错。save_format = ‘jpg’,表示图片的后缀。