![](/img/trans.png)
[英]TensorFlow Recommenders - ValueError: Shape must be rank 2 but is rank 3
[英]Tensorflow : ValueError: Shape must be rank 2 but is rank 3
我是tensorflow的新手,我正在嘗試將一些雙向LSTM的代碼從舊版本的tensorflow更新到最新版本(1.0),但是我得到了這個錯誤:
形狀必須是等級2,但對於'MatMul_3'(op:'MatMul')具有輸入形狀的等級3:[100,?,400],[400,2]。
該錯誤發生在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]
任何幫助贊賞。
對於將來遇到此問題的任何人, 不應使用上面的代碼段。
從tf.contrib.rnn.static_bidirectional_rnn
v1.1文檔:
返回:
元組
(outputs, output_state_fw, output_state_bw)
其中:outputs是輸出的長度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]
的形狀[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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.