精华内容
下载资源
问答
  • 这样的话肯定就是记忆了,在训练过程中肯定是acc好得不得了,如果测试集也是这样增强的,那也是好得不得了,到实际数据估计就嗝屁了;如果仅仅训练集增强,而验证集/测试集没有这样,那么效果估计不好,甚至你会怀疑...

    上一篇说起,图像数据增强的作用到底是什么?

    这其中是不是有点自欺欺人呢?这样的话肯定就是记忆了,在训练过程中肯定是acc好得不得了,如果测试集也是这样增强的,那也是好得不得了,到实际数据估计就嗝屁了;如果仅仅训练集增强,而验证集/测试集没有这样,那么效果估计不好,甚至你会怀疑过拟合了??训练集acc好啊,验证集啥也不是,差一大截。

    这种情况怎么应对,且不表。待我找个实例再说,此文主要说实际识别中图像数据增强,这样会不会增加识别的acc呢?对所有结果做一个mean,就是最终结果。请看图像数据增强的一些操作,以我哥为例:【欣赏不了2000年热情演唱会的都不是真粉】

    1-剪切

    【看来有必要将我cv的书拿出来撕掉封面的薄膜了,已经一年了,之前买了好多书都没看】

    一般可能绝大多数的图片都是0~255的,也就是8位。【我真的不想用tf来读图,或者数据处理,我觉得tf就只是深度学习的,因为它需要sess.run,处理下就需要这个玩意费劲】

    tf有crop的方法我不想用,只能自己造了,小明哥造个小轮子还是绰绰有余。

    cv的操作,CV的都不是RGB的,resize的hw。

    搞定。

    2-翻转[水平和上下],为了表示对我哥的充分尊重,不放倒立的图了,数据来源于此,下同

     

    我能说cv2这玩意是个垃圾吗?动不动就变色。。。。。第4个的操作是对左边的图上下翻转,第2个图是对左边的图左右翻转,同样的操作,结果cv2就这鬼样子。卧槽。再次转成RGB的。plt和PIL都是对RGB

     

    因为上面用的np的翻转,我试试cv2的

     

    3-旋转角度[这个我做的不好,有阴影,稍微会点的都做的没有阴影或很少有,缩放的比例也合适]

    如果是方形图则似乎没有,矩形的可能有空白

    12点钟y方向逆时针旋转

    4-加噪声,高斯噪声

    这样算来,第一个还可以增加空白,可以是补零,可以是噪声

    这样的话,原图,剪切,左右,噪声,就四个图,先这样试试看,回到博文https://blog.csdn.net/SPESEG/article/details/103292299

     

    冬天该很好

    你若尚在场

    天空多灰

    我们亦放亮

    一起坐坐谈谈来日动向

    漠视外间低温

    这样唱

     

    另外有相关问题可以加入QQ群讨论,不设微信群

    QQ群:868373192 

    语音图像深度学习群

    展开全文
  • 这是一款基于Web和移动设备的神奇宝贝主题游戏,可测试您在随机图像阵列中进行跟踪和选择的能力和记忆力。 尝试捕获尽可能多的神奇宝贝! 但小心点。 不要多次单击同一一个! 怎么玩: 启动后,屏幕上将随机显示一...
  • Keras并不是在记忆体中对整个图像数据集执行图像转换操作,而是设计通过深度学习模型训练过程进行迭代,从而能够动态地创建增强的图像数据。 怎么做 官方:图像预处理-ImageDataGenerator 类 ImageDataGenerator ...

    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使用攻略

    展开全文
  • 假设让你盯着一个人的视频连续看上 100 个小时,接着又给你看一眼另外一个人的照片,接着让你凭着记忆画出来刚才的照片,你一定画的会很像第一个人的。使用的模型是 Autoencoder。核心思想:GAN 1 这个模型所做的是...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

怎么训练图像记忆