zoukankan      html  css  js  c++  java
  • keras实例学习-双向LSTM进行imdb情感分类

    源码:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py

    keras中文文档

    1.imdb数据集

     数据集来自 IMDB 的 25,000 条电影评论,以情绪(正面/负面)标记。评论已经过预处理,并编码为词索引(整数)的序列表示。为了方便起见,将词按数据集中出现的频率进行索引,例如整数 3 编码数据中第三个最频繁的词。

    这允许快速筛选操作,例如:「只考虑前 10,000 个最常用的词,但排除前 20 个最常见的词」。

    作为惯例,0 不代表特定的单词,而是被用于编码任何未知单词。

    from keras.datasets import imdb
    
    (x_train, y_train), (x_test, y_test) = imdb.load_data(path="imdb.npz",
                                                          num_words=None,
                                                          skip_top=0,
                                                          maxlen=None,
                                                          seed=113,
                                                          start_char=1,
                                                          oov_char=2,
                                                          index_from=3)
    • 返回:

      • 2 个元组:
      • x_train, x_test: 序列的列表,即词索引的列表。如果指定了 num_words 参数,则可能的最大索引值是 num_words-1。如果指定了 maxlen 参数,则可能的最大序列长度为 maxlen
      • y_train, y_test: 整数标签列表 (1 或 0)。
    • 参数:

      • path: 如果你本地没有该数据集 (在 '~/.keras/datasets/' + path),它将被下载到此目录。
      • num_words: 整数或 None。要考虑的最常用的词语。任何不太频繁的词将在序列数据中显示为 oov_char 值。
      • skip_top: 整数。要忽略的最常见的单词(它们将在序列数据中显示为 oov_char 值)。
      • maxlen: 整数。最大序列长度。 任何更长的序列都将被截断。
      • seed: 整数。用于可重现数据混洗的种子。
      • start_char: 整数。序列的开始将用这个字符标记。设置为 1,因为 0 通常作为填充字符。
      • oov_char: 整数。由于 num_words 或 skip_top 限制而被删除的单词将被替换为此字符。
      • index_from: 整数。使用此数以上更高的索引值实际词汇索引的开始。

     //主要还是关注num_words和maxlen两个参数吧,这两个都在我的ibdm_Bilstm.ipynb里试了。

    num_words=2000,意思是只取下标为前2000的,出现次数最频繁的前2000个单词;maxlen=500是针对评论来说的,只取长度≤500的。

    2.数据预处理

    x_train=sequence.pad_sequences(x_train,maxlen=maxlen)
    keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.0)

    将多个序列截断或补齐为相同长度

    该函数将一个 num_samples 的序列(整数列表)转化为一个 2D Numpy 矩阵,其尺寸为 (num_samples, num_timesteps)。 num_timesteps 要么是给定的 maxlen 参数,要么是最长序列的长度

    比 num_timesteps 短的序列将在末端以 value 值补齐。

    比 num_timesteps 长的序列将会被截断以满足所需要的长度。补齐或截断发生的位置分别由参数 pading 和 truncating 决定。

    向前补齐为默认操作。

    参数

    • sequences: 列表的列表,每一个元素是一个序列。
    • maxlen: 整数,所有序列的最大长度。
    • dtype: 输出序列的类型。 要使用可变长度字符串填充序列,可以使用 object
    • padding: 字符串,'pre' 或 'post' ,在序列的前端补齐还是在后端补齐。
    • truncating: 字符串,'pre' 或 'post' ,移除长度大于 maxlen 的序列的值,要么在序列前端截断,要么在后端。
    • value: 浮点数,表示用来补齐的值。

    返回

    • x: Numpy 矩阵,尺寸为 (len(sequences), maxlen)

    异常

    • ValueError: 如果截断或补齐的值无效,或者序列条目的形状无效。

    //默认补齐和截断都是在序列前端pre的。

    3. Sequential顺序模型

    顺序模型是多个网络层的线性堆叠。

    你可以通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型。见

    4. Embedding层

    keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)

     将正整数(索引值)转换为固定尺寸的稠密向量。 例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]。

     该层只能用作模型中的第一层。

    参数

    • input_dim: int > 0。词汇表大小, 即,最大整数 index + 1。
    • output_dim: int >= 0。词向量的维度。
    • embeddings_initializerembeddings 矩阵的初始化方法 (详见 initializers)。默认是均匀分布。
    • embeddings_regularizerembeddings matrix 的正则化方法 (详见 regularizer)。
    • embeddings_constraintembeddings matrix 的约束函数 (详见 constraints)。
    • mask_zero: 是否把 0 看作为一个应该被遮蔽的特殊的 "padding" 值。 这对于可变长的 循环神经网络层 十分有用。 如果设定为 True,那么接下来的所有层都必须支持 masking,否则就会抛出异常。 如果 mask_zero 为 True,作为结果,索引 0 就不能被用于词汇表中 (input_dim 应该与 vocabulary + 1 大小相同)。
    • input_length: 输入序列的长度,当它是固定的时。 如果你需要连接 Flatten 和 Dense 层,则这个参数是必须的 (没有它,dense 层的输出尺寸就无法计算)。

    输入尺寸

    尺寸为 (batch_size, sequence_length) 的 2D 张量。

    输出尺寸

    尺寸为 (batch_size, sequence_length, output_dim) 的 3D 张量。

    5.Bidirectional

    keras.layers.Bidirectional(layer, merge_mode='concat', weights=None)

    RNN 的双向封装器,对序列进行前向和后向计算。

    参数

    • layerRecurrent 实例。
    • merge_mode: 前向和后向 RNN 的输出的结合模式。 为 {'sum', 'mul', 'concat', 'ave', None} 其中之一。 如果是 None,输出不会被结合,而是作为一个列表被返回。

    异常

    • ValueError: 如果参数 merge_mode 非法。

     6.LSTM

    keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', 
    bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
    recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)

     //这个参数也太多了吧。

    参数

    • units: 正整数,输出空间的维度。(也就是一个里面有多少个size吧)
    • activation: 要使用的激活函数 (详见 activations)。 如果传入 None,则不使用激活函数 (即 线性激活:a(x) = x)。
    • recurrent_activation: 用于循环时间步的激活函数 (详见 activations)。 默认:分段线性近似 sigmoid (hard_sigmoid)。 如果传入 None,则不使用激活函数 (即 线性激活:a(x) = x)。
    • use_bias: 布尔值,该层是否使用偏置向量。
    • kernel_initializerkernel 权值矩阵的初始化器, 用于输入的线性转换 (详见 initializers)。

     给出部分,其中units是必须的。

    model.add(Bidirectional(LSTM(64)))

     7.Dropout

    keras.layers.Dropout(rate, noise_shape=None, seed=None)

    将 Dropout 应用于输入。

    Dropout 包括在训练中每次更新时, 将输入单元的按比率随机设置为 0, 这有助于防止过拟合。

    参数

    • rate: 在 0 和 1 之间浮动。需要丢弃的输入比例。
    • noise_shape: 1D 整数张量, 表示将与输入相乘的二进制 dropout 掩层的形状。 例如,如果你的输入尺寸为 (batch_size, timesteps, features),然后 你希望 dropout 掩层在所有时间步都是一样的, 你可以使用 noise_shape=(batch_size, 1, features)
    • seed: 一个作为随机种子的 Python 整数。

    //这里timesteps应该是可以说是上例中的句子长度10,共进行10个时间步能够将句子读完。

    model.add(Dropout(0.5))

    8.Dense

    keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, 
    bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

    常用的全连接层。

    Dense 实现以下操作: output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。

    • 注意: 如果该层的输入的秩大于2,那么它首先被展平然后 再计算与 kernel 的点乘。

    参数

    • units: 正整数,输出空间维度。
    • activation: 激活函数 (详见 activations)。 若不指定,则不使用激活函数 (即,「线性」激活: a(x) = x)。
    • use_bias: 布尔值,该层是否使用偏置向量。
    • kernel_initializerkernel 权值矩阵的初始化器 (详见 initializers)。
    • bias_initializer: 偏置向量的初始化器 (see initializers).
    • kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数 (详见 regularizer)。
    • bias_regularizer: 运用到偏置向的的正则化函数 (详见 regularizer)。
    • activity_regularizer: 运用到层的输出的正则化函数 (它的 "activation")。 (详见 regularizer)。
    • kernel_constraint: 运用到 kernel 权值矩阵的约束函数 (详见 constraints)。
    • bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。

    输入尺寸

    nD 张量,尺寸: (batch_size, ..., input_dim)。 最常见的情况是一个尺寸为 (batch_size, input_dim)的 2D 输入。

    输出尺寸

    nD 张量,尺寸: (batch_size, ..., units)。 例如,对于尺寸为 (batch_size, input_dim) 的 2D 输入, 输出的尺寸为 (batch_size, units)

    //但是实际上,参数里并没有input_dim这个参数,为什么在应用时会有呢?如下: //运行是没有问题的。

    model = Sequential()
    model.add(Dense(32, input_shape=(16,)))
    # 现在模型就会以尺寸为 (*, 16) 的数组作为输入,
    # 其输出数组的尺寸为 (*, 32)
    
    # 在第一层之后,你就不再需要指定输入的尺寸了:
    model.add(Dense(32))
  • 相关阅读:
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 47 全排列 II(二)
    Java实现 LeetCode 47 全排列 II(二)
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/10669837.html
Copyright © 2011-2022 走看看