keras doc 9 预处理等

图片预处理

图片生成器ImageDataGenerator

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()的例子

(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)的例子

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

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

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

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

keras.preprocessing.text.text_to_word_sequence(text, 
    filters=base_filter(), lower=True, split=" ")

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

参数

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

返回值

字符串列表


one-hot编码

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

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

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

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模型必要的两个参数之一

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()时传递一个预定义优化器名。在后者情形下,优化器的参数将使用默认值。

# pass optimizer by name: default parameters will be usedmodel.compile(loss='mean_squared_error', optimizer='sgd')

所有优化器都可用的参数

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

# all parameter gradients will be clipped to# a maximum norm of 1.sgd = SGD(lr=0.01, clipnorm=1.)
# 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

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

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

参数

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

RMSprop

keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)

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

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

参数

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

Adagrad

keras.optimizers.Adagrad(lr=0.01, epsilon=1e-06)

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

Adagrad

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

Adadelta

keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-06)

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

参数

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

参考文献


Adam

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

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

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/

原文发布于微信公众号 - CreateAMind(createamind)

原文发表时间:2016-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余林丰

12.高斯消去法(1)——矩阵编程基础

对于一阶线性方程的求解有多种方式,这里将介绍利用高斯消去法解一阶线性方程组。在介绍高斯消去法前需要对《线性代数》做一下温习,同时在代码中对于矩阵的存储做一个简...

2507
来自专栏钱塘大数据

R语言的常用函数速查

一、基本 1.数据管理 vector:向量 numeric:数值型向量 logical:逻辑型向量character;字符型向量 list:列表 data....

3359
来自专栏数值分析与有限元编程

有限元 | 二次样条梁单元

样条梁单元是样条函数与有限元法相结合的产物。有限元法将结构分割成若干单元,位移场采用分段插值或者分区插值。常用的插值方法有Lagrange插值,Hermite插...

3938
来自专栏专知

【干货】计算机视觉实战系列03——用Python做图像处理

【导读】专知成员Hui上一次为大家介绍Matplotlib的使用,包括绘图,绘制点和线,以及图像的轮廓和直方图,这一次为大家详细讲解Numpy工具包中的各种工具...

47510
来自专栏机器学习和数学

[编程经验] Tensorflow中的共享变量机制小结

今天说一下tensorflow的变量共享机制,首先为什么会有变量共享机制? 这个还是要扯一下生成对抗网络GAN,我们知道GAN由两个网络组成,一个是生成器网络G...

8203
来自专栏人工智能

十五:多层感知机与布尔函数

今天没有别的话,好好学习,多多转发! 本期内容是 【多层感知机与布尔函数】 场景描述 神经网络概念的诞生很大程度上受到了神经科学的启发。生物学研究表明,大脑皮层...

3138
来自专栏小樱的经验随笔

Vijos P1497 立体图【模拟】

立体图 描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友讲解立体图,请你帮他画出立体图。 小渊有一块面积为m*n的...

3776
来自专栏木东居士的专栏

Bloom Filter 的数学背景

1733
来自专栏上善若水

002计算机图形学之直线画线算法

主要思想是,由于我们在缓存区上画点,全部是整数。那么在画线的时候,当斜率k小于1的时候,下一个点是取(x+1,y+1)还是(x+1,y)取决于点(x+1,y+0...

2752
来自专栏编程

扣丁学堂浅谈Python视频教程之random模块详解

今天扣丁学堂小编给大家详细介绍一下关于Python视频教程之random模块详解,,首先用于生成伪随机数之所以称之为伪随机数,是因为真正意义上的随机数(或者随机...

23410

扫码关注云+社区

领取腾讯云代金券