2016-09-21 66 views
3

我想训练一个可以改变数组大小的数据。例如,假设我们希望训练句子。第一句话是“我是约翰”,第二句是“我知道”。如果句子转换成张量。第一件事会变成[“我”,“上午”,“约翰”],下一个将会是[“我”,“知道”]。因此,第一个数组需要3个n_input作为占位符的形状。但是,第二个阵列需要2个。如何在非确定性数组大小的占位符中设置形状

x = tf.placeholder("float", [None, n_input]) 
y = tf.placeholder("float", [None, n_classes]) 

我需要上述代码来定义占位符。但是,我无法确定n_input。

此外,形状中的无是什么意思? BATCH_SIZE? 请帮帮我。

+0

你的问题还不清楚。似乎你想使用循环神经网络来训练可变长度的序列,但你似乎有点丢失,也许你可以开始使用Tensorflow教程? – jean

+0

可变输入大小的方法并不常见。如果您的数据在形状上非常多样化,请考虑使用RNN(如上面提到的牛仔裤)或尝试使用缩放/填充,但它不是文本处理的好方法。 –

+0

请仔细阅读文档,您会发现“形状:要输入张量的形状(可选)。如果没有指定形状,可以输入任何形状的张量。” – lerner

回答

4

从技术上说,占位符根本不需要形状。它可以被定义为这样。

x =tf.placeholder(tf.float32, shape=[]) 

在这种情况下,占位符本身没有形状信息。如果您知道张量的尺寸,但不是实际的数字形状,我们用None替换该尺寸的数值,因为它可以具有可变尺寸。

x =tf.placeholder(tf.float32, shape=[None, None, None]) 

这会影响到一些下游的静态形状分析认为tensorflow确实获得形状信息,但否则按预期应该仍然工作。

+0

谢谢。我有一个转置问题。在mnist教程中,首先占位符x被设置为[None,n_steps,n_input],这意味着输入数据数组(batch_size,n_step,n_input,据我所知)。作为mnist教程的下一步,x是[1,0 ,2]。我认为x数组将被转换为(n_step,batch_size,n_input)。我的问题是为什么转置是需要的。 – hackartist

+0

我不确定你指的是哪个mnist教程。请你提供一个链接?如果问题已解决,请将其标记为已完成 – Steven

+0

@hackartist此转置在RNN-MNIST教程中完成,因为rnn函数需要n_step x [batch_size,n_input]的列表,这在TensorFlow API但是如果你使用“newer”dynamic_rnn函数,那么这个换位就不再需要了。 – bsautermeister

0

在像您这样的场景中,我们通常会将第二维(time_steps或输入长度)设置为常数(例如句子的最大长度),并且直接使用填充或零填充空格。然后你可以设置占位符为:

x = tf.placeholder(tf.int32, [None, max_input_steps]) 
y = tf.placeholder(tf.int32, [None, nax_output_steps]) 
相关问题