Tôi mới sử dụng tensorflow và tôi đang cố gắng cập nhật một số mã cho LSTM hai chiều từ phiên bản cũ của tensorflow thành mới nhất (1.0), nhưng tôi gặp lỗi này:Tensorflow: ValueError: Hình dạng phải xếp hạng 2 nhưng xếp hạng 3
Shape must be rank 2 but is rank 3 for 'MatMul_3' (op: 'MatMul') with input shapes: [100,?,400], [400,2].
Lỗi xảy ra trên 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]
Bất kỳ trợ giúp nào được đánh giá cao.
tính toán gì bạn đang cố gắng để thực hiện? 'Tf.matmul()' của TensorFlow có thể thực hiện các phép nhân ma trận riêng lẻ hoặc phép nhân ma trận lô, nhưng nó cần thông tin về các hình dạng để biết nó nên làm gì. – mrry