【问题标题】:Trouble with understanding how TensorFlow receives and processes data无法理解 TensorFlow 如何接收和处理数据
【发布时间】:2017-07-25 09:28:25
【问题描述】:

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

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

  • data[[1, 2, 3], [9, 8, 7]] 的形式,是输入序列。
  • labels1s 或 0s 的列表 - 1 表示相应的序列正在增加,0 表示减少。

x 是输入序列的占位符,y 是相应标签的占位符。我的思考过程是让 RNN 以x 接收每个输入序列,这是一个单列张量,每行是序列的一个整数——展开的 RNN 中的一个时间步长。然后,RNN 将在 RNN 的每次完全前向传播之后(在处理完一个完整的 x 张量之后)输出一个整数(01)。

我收到一个错误,在最后一行输入必须是一个序列。我无法理解这个单列张量如何不被视为一个序列,以及它需要如何塑造才能成为一个序列。

作为旁注,我的下一个最大误解是,在我读过的所有关于 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)

【问题讨论】:

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


    【解决方案1】:

    tf.static_rnn 需要 Tensors 的列表与 documentation 一样,因此它可以确定 RNN 的长度(请注意,这必须在运行前确定,这就是为什么您需要传递 @987654326 的 python 列表@ 而不是 Tensor):

    输入:长度为 T 的输入列表,每个输入的形状为 [batch_size, input_size] 的张量,或此类元素的嵌套元组。

    outputs, states = tf.nn.static_rnn(cell, [x], dtype=tf.int32) 应该可以工作。

    关于你的附带问题,部分答案可以在implementation of BasicRNNCell

    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 逻辑。

    【讨论】:

    • 谢谢,这似乎有效。我将继续使用我的 RNN,如果我有任何其他问题或误解,请告诉您。
    • 我今天设法让我的神经网络工作,但我通过分析一个非常不同的玩具示例的代码来做到这一点,并尽我所见地实施类似的做法配件。不幸的是,我的模型根本没有学习。它的准确性是完全随机波动的。正如我所说,我是 TensorFlow 的新手,无法理解为什么它没有正确训练,因为这是我在 TensorFlow 中运行的第一个模型。这是我的代码:pastebin.com/9hJKyVgW
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多