无法理解TensorFlow如何接收和处理数据

时间:2017-07-25 09:28:26

标签: python tensorflow neural-network deep-learning recurrent-neural-network

我最近开始研究深度学习,并对我对RNN和LSTM的理论和深入实际实施的理解充满信心。我写了一个非常简单的RNN,它学会了将两个二进制数加在一起,只使用numpy。我现在正在尝试熟悉TensorFlow API,以便我不再需要从头开始构建模型。

尽管我对自己对NN和编程能力的理解充满信心,但在理解TensorFlow抽象模型的高级别以及如何使用数据时,我仍然非常沮丧。结构化的。我遇到的墙的一个例子是在下面的代码中,我试图实现一个简单的RNN,它接收一个列表/整数序列列表,然后学习如何将单个序列分类为增加或减少。 generate_data()输出两个列表:

  • data位于[[1, 2, 3], [9, 8, 7]]的表单中,是输入序列。
  • labels1 s或0 s的列表 - a 1表示相应的序列正在增加,0表示减少。

x是输入序列的占位符,y是相应标签的占位符。我的思考过程是RNN接收的每个输入序列为x,单列张量,每行是序列的单个整数 - 展开的RNN中的单个时间步长。然后,RNN将在RNN的每次完全前向传播之后输出单个积分(01)(在处理了整个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)

1 个答案:

答案 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。这是模型的一部分,它将实现inputstatestatestatestateoutput逻辑。