目录
1. 数据增强
1.1 是什么
在将数据导入到计算机内存之后、加载到模型之前,训练集部分进行数据增强并和验证集一起加载至模型进行训练。
Keras并不是在记忆体中对整个图像数据集执行图像转换操作,而是设计通过深度学习模型训练过程进行迭代,从而能够动态地创建增强的图像数据。
1.2 怎么做
1.2.1 ImageDataGenerator 图片生成器
通过实时数据增强生成张量图像数据批次。数据将不断循环(按批次)。
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
zca_epsilon=1e-06,
rotation_range=0,
width_shift_range=0.0,
height_shift_range=0.0,
brightness_range=None,
shear_range=0.0,
zoom_range=0.0,
channel_shift_range=0.0,
fill_mode='nearest',
cval=0.0,
horizontal_flip=False,
vertical_flip=False,
rescale=None,
preprocessing_function=None,
data_format=None,
validation_split=0.0,
dtype=None)
参数:
featurewise_center: 布尔值。将输入数据的均值设置为 0,逐特征进行。
samplewise_center: 布尔值。将每个样本的均值设置为 0。
featurewise_std_normalization: Boolean. 布尔值。将输入除以数据标准差,逐特征进行。
samplewise_std_normalization: 布尔值。将每个输入除以其标准差。
zca_epsilon: ZCA 白化的 epsilon 值,默认为 1e-6。
zca_whitening: 布尔值。是否应用 ZCA 白化。
rotation_range: 整数。随机旋转的度数范围。
width_shift_range: 浮点数、一维数组或整数
float: 如果 <1,则是除以总宽度的值,或者如果 >=1,则为像素值。
1-D 数组: 数组中的随机元素。
int: 来自间隔 (-width_shift_range, +width_shift_range) 之间的整数个像素。
width_shift_range=2 时,可能值是整数 [-1, 0, +1],与 width_shift_range=[-1, 0, +1] 相同;而 width_shift_range=1.0 时,可能值是 [-1.0, +1.0) 之间的浮点数。
height_shift_range: 浮点数、一维数组或整数
float: 如果 <1,则是除以总宽度的值,或者如果 >=1,则为像素值。
1-D array-like: 数组中的随机元素。
int: 来自间隔 (-height_shift_range, +height_shift_range) 之间的整数个像素。
height_shift_range=2 时,可能值是整数 [-1, 0, +1],与 height_shift_range=[-1, 0, +1] 相同;而 height_shift_range=1.0 时,可能值是 [-1.0, +1.0) 之间的浮点数。
shear_range: 浮点数。剪切强度(以弧度逆时针方向剪切角度)。
zoom_range: 浮点数 或 [lower, upper]。随机缩放范围。如果是浮点数,[lower, upper] = [1-zoom_range, 1+zoom_range]。
channel_shift_range: 浮点数。随机通道转换的范围。
fill_mode: {"constant", "nearest", "reflect" or "wrap"} 之一。默认为 'nearest'。输入边界以外的点根据给定的模式填充:
'constant': kkkkkkkk|abcd|kkkkkkkk (cval=k)
'nearest': aaaaaaaa|abcd|dddddddd
'reflect': abcddcba|abcd|dcbaabcd
'wrap': abcdabcd|abcd|abcdabcd
cval: 浮点数或整数。用于边界之外的点的值,当 fill_mode = "constant" 时。
horizontal_flip: 布尔值。随机水平翻转。
vertical_flip: 布尔值。随机垂直翻转。
rescale: 重缩放因子。默认为 None。如果是 None 或 0,不进行缩放,否则将数据乘以所提供的值(在应用任何其他转换之前)。
preprocessing_function: 应用于每个输入的函数。这个函数会在任何其他改变之前运行。这个函数需要一个参数:一张图像(秩为 3 的 Numpy 张量),并且应该输出一个同尺寸的 Numpy 张量。
data_format: 图像数据格式,{"channels_first", "channels_last"} 之一。"channels_last" 模式表示图像输入尺寸应该为 (samples, height, width, channels),"channels_first" 模式表示输入尺寸应该为 (samples, channels, height, width)。默认为 在 Keras 配置文件 ~/.keras/keras.json 中的 image_data_format 值。如果你从未设置它,那它就是 "channels_last"。
validation_split: 浮点数。Float. 保留用于验证的图像的比例(严格在0和1之间)。
dtype: 生成数组使用的数据类型。
1.2.2 批量返回
-
.flow(x, y)——原始图片来自 数组
数据生成器本身实际上是一个迭代器,当被呼叫时返回一个批量的图像资料。我们可以通过调用flow()函数来配置返回批量的大小并获取到相应批量的图像资料。
(x_train, y_train), (x_test, y_test) = cifar10.load_data() y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) datagen = ImageDataGenerator( featurewise_center=True, featurewise_std_normalization=True, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True) # 计算特征归一化所需的数量 # (如果应用 ZCA 白化,将计算标准差,均值,主成分) datagen.fit(x_train) # 使用实时数据增益的批数据对模型进行拟合: model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), steps_per_epoch=len(x_train) / 32, epochs=epochs) # 这里有一个更 「手动」的例子 for e in range(epochs): print('Epoch', e) batches = 0 for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32): model.fit(x_batch, y_batch) batches += 1 if batches >= len(x_train) / 32: # 我们需要手动打破循环, # 因为生成器会无限循环 break
-
.flow_from_directory(directory)——原始图片来自本地
train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(150, 150), batch_size=32, class_mode='binary') validation_generator = test_datagen.flow_from_directory( 'data/validation', target_size=(150, 150), batch_size=32, class_mode='binary') model.fit_generator( train_generator, steps_per_epoch=2000, epochs=50, validation_data=validatio
1.2.3 调用fit_generator()函数
model.fit_generator():使用实时数据增益的批数据对模型进行拟合:
model.fit_generator(datagen.flow(X_train,y_train,batch_size=batch_size),
steps_per_epoch=len(X_train) / batch_size,
epochs = nb_epoch)
具体用法实例
1.3 为什么
- 解决数据量不足的问题
缓解过拟合 - 解决数据不均衡问题
使用 flow_from_directory ,从本地加载,参考。
2. 回调函数
fit 函数
fit 函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况。
hist = model.fit(X, y,validation_split=0.2)
print(hist.history)
callback 函数
我们之前训练的过程是先训练一遍,然后得到一个验证集的识别率变化趋势,从而知道最佳的epoch,设置epoch,再训练一遍,得到最终结果,这样很浪费时间。
一个好方法就是在测试识别率不再上升的时候,我们终止训练就可以了,callback可以帮助我们做到这一点,callback是一个obj类型的,它可以让模型去拟合,也常在各个点被调用。它和所有模型的状态和表现的数据,能够采取措施打断训练,保存模型,加载不同的权重,或者替代模型状态。
callbacks可以用来做这些事情:
- 模型断点续训:保存当前模型的所有权重
- 提早结束:当模型的损失不再下降的时候就终止训练,当然,会保存最优的模型。
- 动态调整训练时的参数,比如优化的学习速度。
- 等等
早停
EarlyStopping:
当验证损失不再继续降低时中断训练;
当监测值不再改善时中止训练
最优模型保存
callback:
帮助保存模型结构、训练出来的权重、及优化器状态
一个问题:
callback monitor 该选择 val_acc 还是 val_loss?
可以两者同时监控!
调整学习率
- ReduceLROnPlateau()
当标准评估停止提升时,降低学习速率,以lr = lr*factor的形式被减少
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
patience=5, min_lr=0.001)
model.fit(X_train, Y_train, callbacks=[reduce_lr])
-
LearningRateScheduler()
学习速率定时器:该回调函数是用于动态设置学习率 。
自定义衰减函数:schedule:函数,该函数以epoch号为参数(从0算起的整数),返回一个新学习率(浮点数)def step_decay(epoch): initial_lrate = 0.01 drop = 0.5 epochs_drop = 10.0 lrate = initial_lrate * math.pow(drop,math.floor((1+epoch)/epochs_drop)) return lrate lrate = LearningRateScheduler(step_decay) sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False) model.fit(train_set_x, train_set_y, validation_split=0.1, nb_epoch=200, batch_size=256, callbacks=[lrate])
那么问题来了:用Adam还需要学习率衰减(learning rate decay)么?
答案是,可要可不要,重要性没那么大——>参靠
3数据保存
如何将的导入的图片数据保存以便能随时使用:h5py
import h5py
X= np.random.rand(100, 1000, 1000).astype('float32')
y = np.random.rand(1, 1000, 1000).astype('float32')
# Create a new file
f = h5py.File('data.h5', 'w')
f.create_dataset('X_train', data=X)
f.create_dataset('y_train', data=y)
f.close()
# Load hdf5 dataset
f = h5py.File('data.h5', 'r')
X = f['X_train']
Y = f['y_train']
f.close()
更多:h5py官网
4. TimeDistributed 怎么用
如何连接cnn和rnn
- TimeDistributed包装器
- how-to-work-with-time-distributed-data-in-a-neural-network
- 手把手教你开发CNN LSTM模型,并应用在Keras中(附代码)
通过视频识别表情
5. 具体该如何微调迁移神经网络?
…