NLP之RNN的原理讲解(python示例)

目录

    • 代码示例
    • 代码解读
    • 知识点介绍

代码示例

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import SimpleRNNCell

# 第t时刻要训练的数据
xt = tf.Variable(np.random.randint(2, 3, size=[1, 1]), dtype=tf.float32)
print(xt)
# https://www.cnblogs.com/Renyi-Fan/p/13722276.html

cell = SimpleRNNCell(units=1, activation=None, use_bias=True, kernel_initializer='ones', recurrent_initializer='ones',
                     bias_initializer=tf.keras.initializers.Constant(value=3))
cell.build(input_shape=[None, 1])
print('variables', cell.variables)
print('config:', cell.get_config())

print(tf.nn.tanh(tf.constant([-float("inf"), 6, float("inf")])))

# 第t时刻运算
ht_1 = tf.ones([1, 1])
out, ht = cell(xt, ht_1)  # LSTM
print(out, ht[0])
print(id(out), id(ht[0]))

# 第t+1时刻运算
cell2 = SimpleRNNCell(units=1, activation=None, use_bias=True, kernel_initializer='ones',
                      recurrent_initializer=tf.keras.initializers.Constant(value=3), bias_initializer='ones')
xt2 = tf.Variable(np.random.randint(3, 4, size=[1, 1]), dtype=tf.float32)
out2, ht2 = cell2(xt2, ht[0])
print(out2, ht2[0])

代码解读

这段代码主要演示了如何使用 TensorFlow 中的 SimpleRNNCell 来模拟简单的循环神经网络(RNN)的单步操作。让我们一步步地解析代码。

  1. 导入所需的库:

    import numpy as np
    import tensorflow as tf
    from tensorflow.keras.layers import SimpleRNNCell
    
  2. 生成随机输入数据:
    这里的 xt 表示 t 时刻的输入。它是一个随机生成的 1x1 的矩阵,数值在 2 到 3 之间。

    xt = tf.Variable(np.random.randint(2, 3, size=[1, 1]), dtype=tf.float32)
    print(xt)
    
  3. 创建一个 SimpleRNNCell:

    • units=1 表示输出空间或隐藏状态的维度是 1。
    • 不使用激活函数 (activation=None)。
    • 所有的权重和偏置都初始化为 1,除了偏置被特意初始化为 3。
    cell = SimpleRNNCell(units=1, activation=None, use_bias=True, kernel_initializer='ones', recurrent_initializer='ones',
                         bias_initializer=tf.keras.initializers.Constant(value=3))
    cell.build(input_shape=[None, 1])
    print('variables', cell.variables)
    print('config:', cell.get_config())
    
  4. 演示 tanh 函数:
    这里展示了当输入为负无穷大、6 和正无穷大时,tanh 函数的输出值。

    print(tf.nn.tanh(tf.constant([-float("inf"), 6, float("inf")])))
    
  5. 模拟 t 时刻的 RNN 运算:

    • ht_1 是 t-1 时刻的隐藏状态,这里初始化为全 1 的 1x1 矩阵。
    • 使用 cell 来进行计算,返回 t 时刻的输出 out 和隐藏状态 ht
    ht_1 = tf.ones([1, 1])
    out, ht = cell(xt, ht_1)
    print(out, ht[0])
    print(id(out), id(ht[0]))
    
  6. 模拟 t+1 时刻的 RNN 运算:

    • 创建一个新的 SimpleRNNCell,但隐藏层到隐藏层的权重初始化为 3,而不是 1。
    • xt2 是 t+1 时刻的输入,它是一个随机生成的 1x1 的矩阵,数值在 3 到 4 之间。
    • 使用 cell2 来进行计算,返回 t+1 时刻的输出 out2 和隐藏状态 ht2
    cell2 = SimpleRNNCell(units=1, activation=None, use_bias=True, kernel_initializer='ones',
                          recurrent_initializer=tf.keras.initializers.Constant(value=3), bias_initializer='ones')
    xt2 = tf.Variable(np.random.randint(3, 4, size=[1, 1]), dtype=tf.float32)
    out2, ht2 = cell2(xt2, ht[0])
    print(out2, ht2[0])
    

简而言之,该代码段展示了如何在 TensorFlow 中使用 SimpleRNNCell 来模拟简单的 RNN 在连续两个时间步的运算,并展示了如何通过不同的权重和偏置初始化来创建不同的 RNN cells。

知识点介绍

tf.Variable 是 TensorFlow(TF)中的一个核心概念,它用于表示在 TF 计算过程中可能会发生变化的数据。在 TF 中,计算通常是通过计算图(graph)来定义的,而 tf.Variable 允许我们将可以变化的状态添加到这些计算图中。

以下是 tf.Variable 的一些关键点:

  1. 可变性:与 TensorFlow 的常量(tf.constant)不同,tf.Variable 表示的值是可变的。这意味着在训练过程中,可以更新、修改或赋予其新值。

  2. 用途tf.Variable 通常用于表示模型的参数,例如神经网络中的权重和偏置。

  3. 初始化:当创建一个 tf.Variable 时,你必须为它提供一个初始值。这个初始值可以是一个固定值,也可以是其他任何 TensorFlow 计算的结果。

  4. 赋值:使用 assignassign_add 等方法,你可以修改 tf.Variable 的值。

  5. 存储和恢复tf.Variable 的值可以被存储到磁盘并在之后恢复,这是通过 TensorFlow 的保存和恢复机制实现的,这样可以方便地保存和加载模型。

示例:

import tensorflow as tf

# 创建一个初始化为1的变量
v = tf.Variable(1.0)

# 使用变量
result = v * 2.0

# 修改变量的值
v.assign(2.0)  # 现在 v 的值为 2.0

总之,tf.Variable 是 TensorFlow 中表示可变状态的主要方式,尤其是在模型训练中,它用于存储和更新模型的参数。

你可能感兴趣的:(#,1.,自然语言处理&知识图谱,自然语言处理,rnn,python)