项目实战:Keras 用法记录

1. 数据增强

1.1 是什么

在将数据导入到计算机内存之后、加载到模型之前,训练集部分进行数据增强并和验证集一起加载至模型进行训练。

Keras并不是在记忆体中对整个图像数据集执行图像转换操作,而是设计通过深度学习模型训练过程进行迭代,从而能够动态地创建增强的图像数据。

1.2 怎么做

官方:图像预处理-ImageDataGenerator 类

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。如果是 None0,不进行缩放,否则将数据乘以所提供的值(在应用任何其他转换之前)。
    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. 保留用于验证的图像的比例(严格在01之间)。
    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

  1. TimeDistributed包装器
  2. how-to-work-with-time-distributed-data-in-a-neural-network
  3. 手把手教你开发CNN LSTM模型,并应用在Keras中(附代码)

通过视频识别表情

5. 具体该如何微调迁移神经网络?

在这里插入图片描述

参考:
keras callbacks使用攻略

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值