2017-03-06 51 views
6

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.

+0

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

Trả lời

2

Đối với bất kỳ ai gặp sự cố này trong tương lai, đoạn mã phía trên không được sử dụng.

Từ tf.contrib.rnn.static_bidirectional_rnn tài liệu v1.1:

Returns:

A tuple (outputs, output_state_fw, output_state_bw) where: outputs is a length T list of outputs (one for each input), which are depth-concatenated forward and backward outputs. output_state_fw is the final state of the forward rnn. output_state_bw is the final state of the backward rnn.

Danh sách hiểu trên được mong đợi kết quả đầu ra LSTM, và cách chính xác để có được những là thế này:

outputs, _, _ = tf.contrib.rnn.static_bidirectional_rnn(lstmcell, lstmcell, ...) 
pred_mod = [tf.matmul(item, _weights['out_w']) + _biases['out_b'] 
      for item in outputs] 

này sẽ làm việc, bởi vì mỗi item trong outputs có hình dạng [batch_size, 2 * num_hidden] và có thể được nhân với trọng số theo số tf.matmul().


Tiện ích bổ sung: từ tensorflow v1.2 +, chức năng được khuyến nghị sử dụng nằm trong gói khác: tf.nn.static_bidirectional_rnn. Các tensors trở đều giống nhau, vì vậy mã không thay đổi nhiều:

outputs, _, _ = tf.nn.static_bidirectional_rnn(lstmcell, lstmcell, ...) 
pred_mod = [tf.matmul(item, _weights['out_w']) + _biases['out_b'] 
      for item in outputs] 
Các vấn đề liên quan