keras实例学习-双向LSTM进行imdb情感分类

keras实例学习-双向LSTM进行imdb情感分类,第1张

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))

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/588054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存