我最近开始研究深度学习,并对我对RNN和LSTM的理论和深入实际实施的理解充满信心。我写了一个非常简单的RNN,它学会了将两个二进制数加在一起,只使用numpy。我现在正在尝试熟悉TensorFlow API,以便我不再需要从头开始构建模型。
尽管我对自己对NN和编程能力的理解充满信心,但在理解TensorFlow抽象模型的高级别以及如何使用数据时,我仍然非常沮丧。结构化的。我遇到的墙的一个例子是在下面的代码中,我试图实现一个简单的RNN,它接收一个列表/整数序列列表,然后学习如何将单个序列分类为增加或减少。 generate_data()
输出两个列表:
data
位于[[1, 2, 3], [9, 8, 7]]
的表单中,是输入序列。labels
是1
s或0
s的列表 - a 1表示相应的序列正在增加,0表示减少。 x
是输入序列的占位符,y
是相应标签的占位符。我的思考过程是RNN接收的每个输入序列为x
,单列张量,每行是序列的单个整数 - 展开的RNN中的单个时间步长。然后,RNN将在RNN的每次完全前向传播之后输出单个积分(0
或1
)(在处理了整个x
张量之后。
我收到一个错误,在最后一行输入必须是一个序列。我无法理解这个单列张量不被认为是一个序列,以及它是如何形成它以使它成为一个序列。
作为旁注,我所遇到的下一个最大的误解是,在我读过RNN的所有理论解释中,有3个加权矩阵 - 一个从输入到隐藏状态,一个从隐藏状态到输出,一个在每个时间步的隐藏状态。我在TensorFlow中看到的所有编码示例似乎只有一个加权矩阵。这是怎么回事? TensorFlow如何使用这个单个矩阵作为3个深层次矩阵的抽象?我在W = tf.Variable(tf.random_normal([sequence_len, output_dim]))
行中正确地塑造了这个矩阵吗?
from __future__ import print_function
import tensorflow as tf
from tensorflow.contrib import rnn
import random
sequence_len = 5 # Input Dimension
max_num = 1000 # Must be >= than (sequence_len - 1)
output_dim = 1
hidden_dim = 16
batch_size = 1000
def generate_data(sample_size, seq_len=sequence_len, max = max_num):
data = []
labels = []
for _ in range(sample_size):
type = (1 if random.random() < 0.5 else 0)
temp = []
if type == 1:
labels.append(1)
temp.append(random.randint(0, max_num - seq_len + 1))
for i in range(1, seq_len):
temp.append(random.randint(temp[i - 1] + 1, max_num - seq_len + i + 1))
data.append(temp)
if type == 0:
labels.append(0)
temp.append(random.randint(0 + seq_len - 1, max_num))
for i in range(1, seq_len):
temp.append(random.randint( 0 + seq_len - i - 1, temp[i - 1] - 1))
data.append(temp)
return data, labels
input_data, labels = generate_data(100000)
x = tf.placeholder(tf.int32, [None, sequence_len])
y = tf.placeholder(tf.int32, [None, output_dim])
W = tf.Variable(tf.random_normal([sequence_len, output_dim]))
b = tf.Variable(tf.random_normal([output_dim]))
cell = rnn.BasicRNNCell(hidden_dim)
outputs, states = tf.nn.static_rnn(cell, x, dtype=tf.int32)
答案 0 :(得分:1)
tf.static_rnn
需要Tensors
的{{1}}列表,因此它可以确定您的RNN的长度(请注意,这必须在运行时之前确定,这就是您需要通过的原因Tensors
而不是Tensor
的python列表:
输入:输入的长度为T的列表,每个输入都是形状张量[batch_size,input_size]或这些元素的嵌套元组。
outputs, states = tf.nn.static_rnn(cell, [x], dtype=tf.int32)
应该有用。
关于您的附带问题,部分答案可以在documentation:
中找到def call(self, inputs, state):
"""Most basic RNN: output = new_state = act(W * input + U * state + B)."""
output = self._activation(_linear([inputs, state], self._num_units, True))
return output, output
但它实际上取决于您选择使用的RNNCell
。这是模型的一部分,它将实现input
到state
,state
到state
和state
到output
逻辑。