Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow打印固定形状问题?_Python_Tensorflow - Fatal编程技术网

Python Tensorflow打印固定形状问题?

Python Tensorflow打印固定形状问题?,python,tensorflow,Python,Tensorflow,我遇到了一个非常奇怪的问题,希望找一个更熟悉的人。我正在尝试一个基本的LSTM,通过以下编码进行一些二进制分类: class FakeData(object): def __init__(self, n): self.x = np.random.randint(4, size=(n, 90, 4)) blah = np.random.randint(2, size=(n)) self.y = np.zeros((n,2))

我遇到了一个非常奇怪的问题,希望找一个更熟悉的人。我正在尝试一个基本的LSTM,通过以下编码进行一些二进制分类:

class FakeData(object):
    def __init__(self, n):
        self.x = np.random.randint(4, size=(n, 90, 4))
        blah = np.random.randint(2, size=(n))
        self.y = np.zeros((n,2))
        self.y[:,0] = blah
        self.y[:,1] = 1 - blah
        self.mask = np.arange(n)
        self.cnt = 0
        self.n = n

    def getdata(self, n):
        if self.cnt + n > self.n:
            np.randoom.shuffle(self.mask)
            self.cnt = 0
        mask = self.mask[self.cnt : self.cnt + n]
        return self.x[mask], self.y[mask]

n_data = 10000
batch_size = 10
fd = FakeData(n_data)
n_units = 200
n_classes = 2

x = tf.placeholder(tf.float32, shape=[None, 90, 4])
y_ = tf.placeholder(tf.float32, shape=[None, n_classes])
dropout = tf.placeholder(tf.float32)

w_out = tf.Variable(tf.truncated_normal([n_units, n_classes]))
b_out = tf.Variable(tf.truncated_normal([n_classes]))

lstm = tf.contrib.rnn.LSTMCell(n_units)
cell = tf.contrib.rnn.DropoutWrapper(lstm, output_keep_prob=1.0 - dropout)

new_x = tf.unstack(x, 90, 1)
new_x = tf.Print(new_x, [tf.shape(new_x)], message='newx is: ')
output, state = tf.nn.dynamic_rnn(cell, new_x, dtype=tf.float32)
output = tf.Print(output, [tf.shape(output)], message='output is: ')

logits = tf.matmul(output[-1], w_out) + b_out
logits = tf.Print(logits, [tf.shape(logits)], message='logits is: ')
preds = tf.nn.softmax(logits)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, 
    labels=y_))
training = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

correct = tf.equal(tf.argmax(preds, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

#
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(10):
        batch_x, batch_y = fd.getdata(batch_size)
        sess.run([training], feed_dict={x: batch_x, y_: batch_y, dropout: 0})
        if i % 100 == 0:
            print "Accuracy {}".format(accuracy.eval(feed_dict={x: batch_x, 
                y_: batch_y, dropout: 0}))
我遇到的具体问题是,出于某种原因,当我在没有tf.Print行的情况下运行代码时,会出现某种奇怪的形状转换错误
ValueError:维度必须是2,但对于形状为:[?、4]、[3]的“转置”(op:“转置”)而言是3。
在线
output,state=tf.nn.dynamic\u rnn(cell,new\u x,dtype=tf.float32)

但是,当我包含tf.Print行时,它会正确地记录形状,并且能够运行整个会话。我错过什么了吗

为清晰起见,形状应为:
输入:nx90x4
新x:90 x n x 4
输出:90 x n x 200

logits:nx2

在此处添加答案,以防将来有人遇到此问题


事实证明,许多浮动的旧RNN示例都使用unstack。然而,这将把它变成一个张量列表,而动态rnn不能将其作为输入。印刷品将其从二维张量列表转换为三维张量,以便能够正确处理。解决方案是以其他方式对数据进行维度转换,如:


new_x=tf.transpose(x,perm=(1,0,2))
(感谢rvinas)

结果表明,许多浮动的旧RNN示例使用unstack。然而,这将把它变成一个张量列表,而动态rnn不能将其作为输入。印刷品将其从二维张量列表转换为三维张量,以便能够正确处理。解决方案是以其他方式(即转置)对数据进行维度转换。好的,
new_x=tf.transpose(x,perm=(1,0,2))
就可以了。你们想把这个作为一个答案发布并接受吗?有些人也可能在
tf.Print()
上遇到这种隐式转换,可能会发现这些信息很有价值。