2016-11-12 2 views
0

Я довольно новичок с тензорным потоком. Я разработал простые модели, но пока не пробовал что-то вроде многослойного LSTM, поэтому приветствуем любые отзывы :)Как использовать sampled_softmax_loss в Tensorflow

В настоящее время я пытаюсь перекодировать модель уровня персонажа, построенную sherjilozair с самого начала, просто потому, что я хотел знать, как использовать shadoworflow (ранее я создал собственную небольшую DL-библиотеку, назначенную cs231n). Теперь я в настоящее время изо всех сил пытаюсь создать простую двухслойную модель LSTM и не знаю, что не так. Вот код, который я написал до сих пор:

class Model(): 
    def __init__(self, batch_size, seq_length, lstm_size, num_layers, grad_clip, vocab_size): 
     self.lr = tf.Variable(0.0, trainable=False)   

     #Define input and output 
     self.input_data = tf.placeholder(tf.float32, [batch_size, seq_length]) 
     self.output_data = tf.placeholder(tf.float32, [batch_size, seq_length]) #although int would be better for character level.. 

     #Define the model 
     cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=lstm_size) #can choose if basic or otherwise later on... 
     self.cell = cell = rnn_cell.MultiRNNCell([cell] * num_layers) 
     self.initial_state = cell.zero_state(batch_size, tf.float32) 


     with tf.variable_scope("lstm"): 
      softmax_w = tf.get_variable("softmax_w", [lstm_size, vocab_size]) 
      softmax_b = tf.get_variable("softmax_b", [vocab_size]) 

     #_, enc_state = rnn.rnn(cell, encoder_inputs, dtype=dtype) 
     #outputs, states = rnn_decoder(decoder_inputs, enc_state, cell) 


     outputs, states = seq2seq.basic_rnn_seq2seq(
          [self.input_data], 
          [self.output_data], 
          cell, 
          scope='lstm' 
         ) 


     #see how attention helps improving this model state... 

     #was told that we should actually use samples softmax loss 
     self.loss = tf.nn.sampled_softmax_loss(
            softmax_w, 
            softmax_b, 
            outputs, 
            self.output_data, 
            batch_size, 
            vocab_size 
       ) 

И я сейчас получаю проблемы с tf.nn.sampled_softmax_loss. Я прошел долгий путь с отладкой и не понимаю входные соглашения Tensorflow. Нужно ли мне каждый раз вводить список тензоров?

я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "Model.py", line 76, in <module> 
vocab_size=82 
    File "Model.py", line 52, in __init__ 
vocab_size 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/nn.py", line 1104, in sampled_softmax_loss 
name=name) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/nn.py", line 913, in _compute_sampled_logits 
array_ops.expand_dims(inputs, 1), 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 506, in expand_dims 
return _op_def_lib.apply_op("ExpandDims", input=input, dim=dim, name=name) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 411, in apply_op 
as_ref=input_arg.is_ref) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 566, in convert_to_tensor 
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", line 179, in _constant_tensor_conversion_function 
return constant(v, dtype=dtype, name=name) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", line 162, in constant 
tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape)) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 332, in make_tensor_proto 
_AssertCompatible(values, dtype) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 269, in _AssertCompatible 
    raise TypeError("List of Tensors when single Tensor expected") 
TypeError: List of Tensors when single Tensor expected 

Я не уверен, что я делаю неправильно, либо с входами, или генерации переменных и т.д. Проблема - как сказал - кажется, в sampled_softmax_loss функция, но я действительно не уверен .. я звоню класс со следующими параметрами (так же, как заполнители, просто чтобы проверить, если модель «работоспособной»):

Model = Model(batch_size=32, 
       seq_length=128, 
       lstm_size=512, 
       num_layers=2, 
       grad_clip=5, 
       vocab_size=82 
      ) 

Кроме того, если у меня есть любые другие ошибки и т. д., пожалуйста, дайте мне знать в комментариях! Это моя первая модель с seq2seq-моделями в тензорном потоке, поэтому любые советы очень ценятся!

ответ

2

Данная особая ошибка касательно прохождения outputs, который представляет собой список, когда tf.nn.sampled_softmax_loss ожидает один тензор.

Функция seq2seq.basic_rnn_seq2seq возвращает список тензоров размера [batch_size x output_size] в качестве первого выхода. Предполагая, что каждый из ваших выходов одномерно, вы хотите, чтобы сцепить список вывода, используя tf.concat (создание тензора размера [seq_len x batch_size x 1]), tf.squeeze последнего измерения (в результате [seq_len x batch_size]) и tf.transpose сделать output имеют размера [batch_size x seq_len], так же, как self.output_data.

Чтобы отладить проблему, напечатайте размеры тензоров, используя print(output.get_shape()).