Tensorflow:ValueError:形状必须排名2但排名3
Posted
技术标签:
【中文标题】Tensorflow:ValueError:形状必须排名2但排名3【英文标题】:Tensorflow : ValueError: Shape must be rank 2 but is rank 3 【发布时间】:2017-07-26 02:07:13 【问题描述】:我是 tensorflow 的新手,我正在尝试将双向 LSTM 的一些代码从旧版本的 tensorflow 更新到最新版本 (1.0),但出现此错误:
形状必须是等级 2,但对于输入形状为 [100,?,400], [400,2] 的“MatMul_3”(操作:“MatMul”)是等级 3。
错误发生在 pred_mod 上。
_weights =
# Hidden layer weights => 2*n_hidden because of foward + backward cells
'w_emb' : tf.Variable(0.2 * tf.random_uniform([max_features,FLAGS.embedding_dim], minval=-1.0, maxval=1.0, dtype=tf.float32),name='w_emb',trainable=False),
'c_emb' : tf.Variable(0.2 * tf.random_uniform([3,FLAGS.embedding_dim],minval=-1.0, maxval=1.0, dtype=tf.float32),name='c_emb',trainable=True),
't_emb' : tf.Variable(0.2 * tf.random_uniform([tag_voc_size,FLAGS.embedding_dim], minval=-1.0, maxval=1.0, dtype=tf.float32),name='t_emb',trainable=False),
'hidden_w': tf.Variable(tf.random_normal([FLAGS.embedding_dim, 2*FLAGS.num_hidden])),
'hidden_c': tf.Variable(tf.random_normal([FLAGS.embedding_dim, 2*FLAGS.num_hidden])),
'hidden_t': tf.Variable(tf.random_normal([FLAGS.embedding_dim, 2*FLAGS.num_hidden])),
'out_w': tf.Variable(tf.random_normal([2*FLAGS.num_hidden, FLAGS.num_classes]))
_biases =
'hidden_b': tf.Variable(tf.random_normal([2*FLAGS.num_hidden])),
'out_b': tf.Variable(tf.random_normal([FLAGS.num_classes]))
#~ input PlaceHolders
seq_len = tf.placeholder(tf.int64,name="input_lr")
_W = tf.placeholder(tf.int32,name="input_w")
_C = tf.placeholder(tf.int32,name="input_c")
_T = tf.placeholder(tf.int32,name="input_t")
mask = tf.placeholder("float",name="input_mask")
# Tensorflow LSTM cell requires 2x n_hidden length (state & cell)
istate_fw = tf.placeholder("float", shape=[None, 2*FLAGS.num_hidden])
istate_bw = tf.placeholder("float", shape=[None, 2*FLAGS.num_hidden])
_Y = tf.placeholder("float", [None, FLAGS.num_classes])
#~ transfortm into Embeddings
emb_x = tf.nn.embedding_lookup(_weights['w_emb'],_W)
emb_c = tf.nn.embedding_lookup(_weights['c_emb'],_C)
emb_t = tf.nn.embedding_lookup(_weights['t_emb'],_T)
_X = tf.matmul(emb_x, _weights['hidden_w']) + tf.matmul(emb_c, _weights['hidden_c']) + tf.matmul(emb_t, _weights['hidden_t']) + _biases['hidden_b']
inputs = tf.split(_X, FLAGS.max_sent_length, axis=0, num=None, name='split')
lstmcell = tf.contrib.rnn.BasicLSTMCell(FLAGS.num_hidden, forget_bias=1.0,
state_is_tuple=False)
bilstm = tf.contrib.rnn.static_bidirectional_rnn(lstmcell, lstmcell, inputs,
sequence_length=seq_len, initial_state_fw=istate_fw, initial_state_bw=istate_bw)
pred_mod = [tf.matmul(item, _weights['out_w']) + _biases['out_b'] for item in bilstm]
任何帮助表示赞赏。
【问题讨论】:
您要执行什么计算? TensorFlow 的tf.matmul()
可以执行单个矩阵乘法或批量矩阵乘法,但它需要有关形状的信息才能知道它应该执行哪一个。
【参考方案1】:
对于以后遇到此问题的任何人,不应使用上面的 sn-p。
来自tf.contrib.rnn.static_bidirectional_rnn
v1.1 文档:
返回:
元组
(outputs, output_state_fw, output_state_bw)
其中:输出是长度为 T 的输出列表(每个输入一个),它们是深度连接的前向和后向输出。 output_state_fw 是前向 rnn 的最终状态。 output_state_bw 是后向 rnn 的最终状态。
上面的列表理解需要 LSTM 输出,而获得这些输出的正确方法是:
outputs, _, _ = tf.contrib.rnn.static_bidirectional_rnn(lstmcell, lstmcell, ...)
pred_mod = [tf.matmul(item, _weights['out_w']) + _biases['out_b']
for item in outputs]
这会起作用,因为outputs
中的每个item
都具有[batch_size, 2 * num_hidden]
的形状,并且可以乘以tf.matmul()
的权重。
附加组件:从 tensorflow v1.2+ 开始,推荐使用的函数在另一个包中:tf.nn.static_bidirectional_rnn
。返回的张量是一样的,所以代码变化不大:
outputs, _, _ = tf.nn.static_bidirectional_rnn(lstmcell, lstmcell, ...)
pred_mod = [tf.matmul(item, _weights['out_w']) + _biases['out_b']
for item in outputs]
【讨论】:
以上是关于Tensorflow:ValueError:形状必须排名2但排名3的主要内容,如果未能解决你的问题,请参考以下文章
如何修复Tensorflow中的“ValueError:操作数无法与形状(2592,)(4,)一起广播”?
TensorFlow ValueError:无法为形状为 '(?, 64, 64, 3)' 的张量 u'Placeholder:0' 提供形状 (64, 64, 3) 的值
TensorFlow ValueError:无法为形状为 '(?, 64, 64, 3)' 的张量 u'Placeholder:0' 提供形状 (64, 64, 3) 的值
Tensorflow ValueError:层“顺序”的输入0与层不兼容:预期形状=(无,20,20,3),找到形状=(无,20,3)
TensorFlow ValueError:logits 和标签必须具有相同的形状 ((25, 1) vs (1, 1))
ValueError: 标签形状必须为 [batch_size, labels_dimension],得到 (128, 2)