前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >keras doc 9 预处理等

keras doc 9 预处理等

作者头像
用户1908973
发布2018-07-25 11:27:49
1.1K0
发布2018-07-25 11:27:49
举报
文章被收录于专栏:CreateAMindCreateAMind

图片预处理

图片生成器ImageDataGenerator

代码语言:javascript
复制
keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,
    samplewise_center=False,
    featurewise_std_normalization=False,
    samplewise_std_normalization=False,
    zca_whitening=False,
    rotation_range=0.,
    width_shift_range=0.,
    height_shift_range=0.,
    shear_range=0.,
    zoom_range=0.,
    channel_shift_range=0.,
    fill_mode='nearest',
    cval=0.,
    horizontal_flip=False,
    vertical_flip=False,
    rescale=None,
    dim_ordering=K.image_dim_ordering())

用以生成一个batch的图像数据,支持实时数据提升。训练时该函数会无限生成数据,直到达到规定的epoch次数为止。

参数

  • featurewise_center:布尔值,使输入数据集去中心化(均值为0)
  • samplewise_center:布尔值,使输入数据的每个样本均值为0
  • featurewise_std_normalization:布尔值,将输入除以数据集的标准差以完成标准化
  • samplewise_std_normalization:布尔值,将输入的每个样本除以其自身的标准差
  • zca_whitening:布尔值,对输入数据施加ZCA白化
  • rotation_range:整数,数据提升时图片随机转动的角度
  • width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度
  • height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度
  • shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)
  • zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]
  • channel_shift_range:浮点数,随机通道偏移的幅度
  • fill_mode:;‘constant’,‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理
  • cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值
  • horizontal_flip:布尔值,进行随机水平翻转
  • vertical_flip:布尔值,进行随机竖直翻转
  • rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)
  • dim_ordering:‘tf’和‘th’之一,规定数据的维度顺序。‘tf’模式下数据的形状为samples, width, height, channels,‘th’下形状为(samples, channels, width, height).该参数的默认值是Keras配置文件~/.keras/keras.jsonimage_dim_ordering值,如果你从未设置过的话,就是'th'

方法

  • fit(X, augment=False, rounds=1):计算依赖于数据的变换所需要的统计信息(均值方差等),只有使用featurewise_centerfeaturewise_std_normalizationzca_whitening时需要此函数。
    • X:numpy array,样本数据
    • augment:布尔值,确定是否使用随即提升过的数据
    • round:若设augment=True,确定要在数据上进行多少轮数据提升,默认值为1
  • flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='jpeg'):接收numpy数组和标签为参数,生成经过数据提升或标准化后的batch数据,并在一个无限循环中不断的返回batch数据
    • X:数据
    • y:标签
    • batch_size:整数,默认32
    • shuffle:布尔值,是否随机打乱数据,默认为True
    • save_to_dir:None或字符串,该参数能让你将提升后的图片保存起来,用以可视化
    • save_prefix:字符串,保存提升后图片时使用的前缀, 仅当设置了save_to_dir时生效
    • save_format:"png"或"jpeg"之一,指定保存图片的数据格式,默认"jpeg"
    • _yields:形如(x,y)的tuple,x是代表图像数据的numpy数组.y是代表标签的numpy数组.该迭代器无限循环.
  • flow_from_directory(directory): 以文件夹路径为参数,生成经过数据提升/归一化后的数据,在一个无限循环中无限产生batch数据
    • directory: 目标文件夹路径,对于每一个类,该文件夹都要包含一个子文件夹.子文件夹应只包含JPG或PNG格式的图片.详情请查看此脚本
    • target_size: 整数tuple,默认为(256, 256). 图像将被resize成该尺寸
    • color_mode: 颜色模式,为"grayscale","rgb"之一,默认为"rgb".代表这些图片是否会被转换为单通道或三通道的图片.
    • classes: 可选参数,为子文件夹的列表,如['dogs','cats']默认为None. 若未提供,则该类别列表将自动推断(类别的顺序将按照字母表顺序映射到标签值)
    • class_mode: "categorical", "binary", "sparse"或None之一. 默认为"categorical. 该参数决定了返回的标签数组的形式, "categorical"会返回2D的one-hot编码标签,"binary"返回1D的二值标签."sparse"返回1D的整数标签,如果为None则不返回任何标签, 生成器将仅仅生成batch数据, 这种情况在使用model.predict_generator()model.evaluate_generator()等函数时会用到.
    • batch_size: batch数据的大小,默认32
    • shuffle: 是否打乱数据,默认为True
    • seed: 可选参数,打乱数据时的随机数种子
    • save_to_dir: None或字符串,该参数能让你将提升后的图片保存起来,用以可视化
    • save_prefix:字符串,保存提升后图片时使用的前缀, 仅当设置了save_to_dir时生效
    • save_format:"png"或"jpeg"之一,指定保存图片的数据格式,默认"jpeg"

例子

使用.flow()的例子

代码语言:javascript
复制
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_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)# compute quantities required for featurewise normalization# (std, mean, and principal components if ZCA whitening is applied)datagen.fit(X_train)# fits the model on batches with real-time data augmentation:model.fit_generator(datagen.flow(X_train, Y_train, batch_size=32),
                    samples_per_epoch=len(X_train), nb_epoch=nb_epoch)# here's a more "manual" examplefor e in range(nb_epoch):    print 'Epoch', e
    batches = 0
    for X_batch, Y_batch in datagen.flow(X_train, Y_train, batch_size=32):
        loss = model.train(X_batch, Y_batch)
        batches += 1
        if batches >= len(X_train) / 32:            # we need to break the loop by hand because
            # the generator loops indefinitely
            break

使用.flow_from_directory(directory)的例子

代码语言:javascript
复制
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,
        samples_per_epoch=2000,
        nb_epoch=50,
        validation_data=validation_generator,
        nb_val_samples=800)

序列预处理

填充序列pad_sequences

代码语言:javascript
复制
keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32')

将长为nb_samples的序列(标量序列)转化为形如(nb_samples,nb_timesteps)2D numpy array。如果提供了参数maxlennb_timesteps=maxlen,否则其值为最长序列的长度。其他短于该长度的序列都会在后部填充0以达到该长度。

参数

  • sequences:浮点数或整数构成的两层嵌套列表
  • maxlen:None或整数,为序列的最大长度。大于此长度的序列将被截短,小于此长度的序列将在后部填0.
  • dtype:返回的numpy array的数据类型
  • padding:‘pre’或‘post’,确定当需要补0时,在序列的起始还是结尾补
  • truncating:‘pre’或‘post’,确定当需要截断序列时,从起始还是结尾截断
  • value:浮点数,此值将在填充时代替默认的填充值0

返回值

返回形如(nb_samples,nb_timesteps)的2D张量


跳字skipgrams

代码语言:javascript
复制
keras.preprocessing.sequence.skipgrams(sequence, vocabulary_size, 
    window_size=4, negative_samples=1., shuffle=True, 
    categorical=False, sampling_table=None)

skipgrams将一个词向量下标的序列转化为下面的一对tuple:

  • 对于正样本,转化为(word,word in the same window)
  • 对于负样本,转化为(word,random word from the vocabulary)

【Tips】根据维基百科,n-gram代表在给定序列中产生连续的n项,当序列句子时,每项就是单词,此时n-gram也称为shingles。而skip-gram的推广,skip-gram产生的n项子序列中,各个项在原序列中不连续,而是跳了k个字。例如,对于句子:

“the rain in Spain falls mainly on the plain”

其 2-grams为子序列集合:

the rain,rain in,in Spain,Spain falls,falls mainly,mainly on,on the,the plain

其 1-skip-2-grams为子序列集合:

the in, rain Spain, in falls, Spain mainly, falls on, mainly the, on plain.

更多详情请参考Efficient Estimation of Word Representations in Vector Space【@BigMoyan】

参数

  • sequence:下标的列表,如果使用sampling_tabel,则某个词的下标应该为它在数据库中的顺序。(从1开始)
  • vocabulary_size:整数,字典大小
  • window_size:整数,正样本对之间的最大距离
  • negative_samples:大于0的浮点数,等于0代表没有负样本,等于1代表负样本与正样本数目相同,以此类推(即负样本的数目是正样本的negative_samples倍)
  • shuffle:布尔值,确定是否随机打乱样本
  • categorical:布尔值,确定是否要使得返回的标签具有确定类别
  • sampling_table:形如(vocabulary_size,)的numpy array,其中sampling_table[i]代表没有负样本或随机负样本。等于1为与正样本的数目相同 采样到该下标为i的单词的概率(假定该单词是数据库中第i常见的单词)

输出

函数的输出是一个(couples,labels)的元组,其中:

  • couples是一个长为2的整数列表:[word_index,other_word_index]
  • labels是一个仅由0和1构成的列表,1代表other_word_indexword_index的窗口,0代表other_word_index是词典里的随机单词。
  • 如果设置categoricalTrue,则标签将以one-hot的方式给出,即1变为[0,1],0变为[1,0]

获取采样表make_sampling_table

代码语言:javascript
复制
keras.preprocessing.sequence.make_sampling_table(size, sampling_factor=1e-5)

该函数用以产生skipgrams中所需要的参数sampling_table。这是一个长为size的向量,sampling_table[i]代表采样到数据集中第i常见的词的概率(为平衡期起见,对于越经常出现的词,要以越低的概率采到它)

参数

  • size:词典的大小
  • sampling_factor:此值越低,则代表采样时更缓慢的概率衰减(即常用的词会被以更低的概率被采到),如果设置为1,则代表不进行下采样,即所有样本被采样到的概率都是1。

文本预处理

句子分割text_to_word_sequence

代码语言:javascript
复制
keras.preprocessing.text.text_to_word_sequence(text, 
    filters=base_filter(), lower=True, split=" ")

本函数将一个句子拆分成单词构成的列表

参数

  • text:字符串,待处理的文本
  • filters:需要滤除的字符的列表或连接形成的字符串,例如标点符号。默认值为base_filter(),包含标点符号,制表符和换行符等
  • lower:布尔值,是否将序列设为小写形式
  • split:字符串,单词的分隔符,如空格

返回值

字符串列表


one-hot编码

代码语言:javascript
复制
keras.preprocessing.text.one_hot(text, n,
    filters=base_filter(), lower=True, split=" ")

本函数将一段文本编码为one-hot形式的码,即仅记录词在词典中的下标。

【Tips】 从定义上,当字典长为n时,每个单词应形成一个长为n的向量,其中仅有单词本身在字典中下标的位置为1,其余均为0,这称为one-hot。【@Bigmoyan】

为了方便起见,函数在这里仅把“1”的位置,即字典中词的下标记录下来。

参数

  • n:整数,字典长度

返回值

整数列表,每个整数是[1,n]之间的值,代表一个单词(不保证唯一性,即如果词典长度不够,不同的单词可能会被编为同一个码)。


分词器Tokenizer

代码语言:javascript
复制
keras.preprocessing.text.Tokenizer(nb_words=None, filters=base_filter(), 
    lower=True, split=" ")

Tokenizer是一个用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类。

构造参数

  • text_to_word_sequence同名参数含义相同
  • nb_words:None或整数,处理的最大单词数量。若被设置为整数,则分词器将被限制为处理数据集中最常见的nb_words个单词

类方法

  • fit_on_texts(texts)
    • texts:要用以训练的文本列表
  • texts_to_sequences(texts)
    • texts:待转为序列的文本列表
    • 返回值:序列的列表,列表中每个序列对应于一段输入文本
  • texts_to_sequences_generator(texts)
    • 本函数是texts_to_sequences的生成器函数版
    • texts:待转为序列的文本列表
    • 返回值:每次调用返回对应于一段输入文本的序列
  • texts_to_matrix(texts, mode):
    • texts:待向量化的文本列表
    • mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默认为‘binary’
    • 返回值:形如(len(texts), nb_words)的numpy array
  • fit_on_sequences(sequences):
    • sequences:要用以训练的序列列表
  • sequences_to_matrix(sequences):
    • texts:待向量化的文本列表
    • mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默认为‘binary’
    • 返回值:形如(len(sequences), nb_words)的numpy array

目标函数objectives

目标函数,或称损失函数,是编译一个模型必须的两个参数之一:

代码语言:javascript
复制
model.compile(loss='mean_squared_error', optimizer='sgd')

可以通过传递预定义目标函数名字指定目标函数,也可以传递一个Theano/TensroFlow的符号函数作为目标函数,该函数对每个数据点应该只返回一个标量值,并以下列两个参数为参数:

  • y_true:真实的数据标签,Theano/TensorFlow张量
  • y_pred:预测值,与y_true相同shape的Theano/TensorFlow张量

真实的优化目标函数是在各个数据点得到的损失函数值之和的均值

请参考目标实现代码获取更多信息

可用的目标函数

  • mean_squared_error或mse
  • mean_absolute_error或mae
  • mean_absolute_percentage_error或mape
  • mean_squared_logarithmic_error或msle
  • squared_hinge
  • hinge
  • binary_crossentropy(亦称作对数损失,logloss)
  • categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)的二值序列
  • sparse_categorical_crossentrop:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:np.expand_dims(y,-1)
  • kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异.
  • poisson:即(predictions - targets * log(predictions))的均值
  • cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数

【Tips】过一段时间(等我或者谁有时间吧……)我们将把各种目标函数的表达式和常用场景总结一下。

优化器optimizers

优化器是编译Keras模型必要的两个参数之一

代码语言:javascript
复制
model = Sequential()
model.add(Dense(64, init='uniform', input_dim=10))
model.add(Activation('tanh'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)

可以在调用model.compile()之前初始化一个优化器对象,然后传入该函数(如上所示),也可以在调用model.compile()时传递一个预定义优化器名。在后者情形下,优化器的参数将使用默认值。

代码语言:javascript
复制
# pass optimizer by name: default parameters will be usedmodel.compile(loss='mean_squared_error', optimizer='sgd')

所有优化器都可用的参数

参数clipnormclipvalue是所有优化器都可以使用的参数,用于对梯度进行裁剪.示例如下:

代码语言:javascript
复制
# all parameter gradients will be clipped to# a maximum norm of 1.sgd = SGD(lr=0.01, clipnorm=1.)
代码语言:javascript
复制
# all parameter gradients will be clipped to# a maximum value of 0.5 and# a minimum value of -0.5.sgd = SGD(lr=0.01, clipvalue=0.5)

SGD

代码语言:javascript
复制
keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量

参数

  • lr:大于0的浮点数,学习率
  • momentum:大于0的浮点数,动量参数
  • decay:大于0的浮点数,每次更新后的学习率衰减值
  • nesterov:布尔值,确定是否使用Nesterov动量

RMSprop

代码语言:javascript
复制
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)

除学习率可调整外,建议保持优化器的其他默认参数不变

该优化器通常是面对递归神经网络时的一个良好选择

参数

  • lr:大于0的浮点数,学习率
  • rho:大于0的浮点数
  • epsilon:大于0的小浮点数,防止除0错误

Adagrad

代码语言:javascript
复制
keras.optimizers.Adagrad(lr=0.01, epsilon=1e-06)

建议保持优化器的默认参数不变

Adagrad

  • lr:大于0的浮点数,学习率
  • epsilon:大于0的小浮点数,防止除0错误

Adadelta

代码语言:javascript
复制
keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-06)

建议保持优化器的默认参数不变

参数

  • lr:大于0的浮点数,学习率
  • rho:大于0的浮点数
  • epsilon:大于0的小浮点数,防止除0错误

参考文献


Adam

代码语言:javascript
复制
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)

该优化器的默认值来源于参考文献

参数

  • lr:大于0的浮点数,学习率
  • beta_1/beta_2:浮点数, 0<beta<1,通常很接近1
  • epsilon:大于0的小浮点数,防止除0错误

参考文献


Adamax

代码语言:javascript
复制
keras.optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08)

Adamax优化器来自于Adam的论文的Section7,该方法是基于无穷范数的Adam方法的变体。

默认参数由论文提供

参数

  • lr:大于0的浮点数,学习率
  • beta_1/beta_2:浮点数, 0<beta<1,通常很接近1
  • epsilon:大于0的小浮点数,防止除0错误

参考文献


Nadam

代码语言:javascript
复制
keras.optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.004)

Nesterov Adam optimizer: Adam本质上像是带有动量项的RMSprop,Nadam就是带有Nesterov 动量的Adam RMSprop

默认参数来自于论文,推荐不要对默认参数进行更改。

参数

  • lr:大于0的浮点数,学习率
  • beta_1/beta_2:浮点数, 0<beta<1,通常很接近1
  • epsilon:大于0的小浮点数,防止除0错误

参考文献

【Tips】很快(过两天)我们会将各种优化器的算法及特点总结一下,敬请关注

内容摘自 http://keras-cn.readthedocs.io/en/latest/preprocessing/image/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CreateAMind 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图片预处理
    • 图片生成器ImageDataGenerator
      • 参数
      • 方法
      • 例子
  • 序列预处理
    • 填充序列pad_sequences
      • 参数
      • 返回值
    • 跳字skipgrams
      • 参数
      • 输出
    • 获取采样表make_sampling_table
      • 参数
  • 文本预处理
    • 句子分割text_to_word_sequence
      • 参数
      • 返回值
    • one-hot编码
      • 参数
      • 返回值
    • 分词器Tokenizer
      • 构造参数
      • 类方法
  • 目标函数objectives
    • 可用的目标函数
    • 优化器optimizers
      • 所有优化器都可用的参数
        • SGD
          • 参数
        • RMSprop
          • 参数
        • Adagrad
          • Adagrad
        • Adadelta
          • 参数
          • 参考文献
        • Adam
          • 参数
          • 参考文献
        • Adamax
          • 参数
          • 参考文献
        • Nadam
          • 参数
          • 参考文献
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档