在这一点上,decode_cell输出是每个时间步长的一个hidden_units大小的向量。 然而,对于训练和预测,我们需要大小为vocab_size的logits。 合理的事情是将线性层(没有激活功能的完全连接层)放在LSTM输出的顶部,以获得非归一化的逻辑。 这个层被称为投影层。 decoder_logits = tf.contrib.layers.linear(decoder_outputs, vocab_size)decoder_prediction = tf.argmax(decoder_logits, 2) 优化 decoder_logits <tf.Tensor 'fully_connected/Reshape_1:0' shape=(?, ?, 10) dtype=float32> RNN输出形状为[max_time,batch_size,hidden_units]的张量,其中投影层映射到[max_time,batch_size,vocab_size]。 vocab_size部分是静态的,而max_time和batch_size是动态的。 stepwise_cross_entropy = tf.nn.softmax_cross_entropy_with_logits( labels=tf.one_hot(decoder_targets, depth=vocab_size, dtype=tf.float32), logits=decoder_logits,)loss = tf.reduce_mean(stepwise_cross_entropy)train_op = tf.train.AdamOptimizer().minimize(loss)sess.run(tf.global_variables_initializer()) 测试 当构建图形时,当静态形状不匹配时,TF将抛出错误。 但是,当我们尝试通过图形运行某些东西时,往往只会发现动态形状之间的不匹配。 所以让我们尝试运行一些东西。 为此,我们需要准备一些数据,我们将会投入到占位符中。 - 编码器形状如何固定为最大 - 解码器形状如何由输入进行仲裁和确定,但编码器应该可能会更长 - 如何解码器输入值也是仲裁的,以及我们如何使用指令,以及这些0是什么,可以使用什么(移位Gold序列,波束搜索) batch_ = [[ 6], [ 3, 4], [ 9, 8, 7]]batch_, batch_length_ = helpers.batch(batch_)print( 'batch_encoded:n'+ str(batch_))din_, dlen_ = helpers.batch(np.ones(shape=( 3, 1), dtype=np.int32), max_sequence_length= 4)print( 'decoder inputs:n'+ str(din_))pred_ = sess.run(decoder_prediction, feed_dict={ encoder_inputs: batch_, decoder_inputs: din_, })print( 'decoder predictions:n'+ str(pred_)) batch_encoded:[[6 3 9] [0 4 8] [0 0 7]]decoder inputs:[[1 1 1] [0 0 0] [0 0 0] [0 0 0]]decoder predictions:[[9 3 9] [9 0 9] [0 0 0] [0 0 0]] toy task 我们将教我们的模型记忆和再现输入序列。 序列将是随机的,具有不同的长度。 由于随机序列不包含任何结构,模型将无法利用数据中的任何模式。 它将简单地在思维向量中编码序列,然后从中解码。 batch_size = 100batches = helpers.random_sequences(length_from= 3, length_to= 8,vocab_lower= 2, vocab_upper= 10,batch_size=batch_size)print( 'head of the batch:') forseq innext(batches)[: 10]: print(seq) head of the batch:[7, 2, 4, 5, 7, 6][5, 4, 8, 2, 9, 8, 2][3, 6, 9, 4, 4, 7][8, 8, 6, 7, 4][5, 8, 5, 9, 2, 8, 8, 5][9, 4, 6][2, 8, 6, 8, 4, 4, 6][8, 6, 2][6, 3, 9, 4][5, 4, 4]defnext_feed():batch = next(batches) encoder_inputs_, _ = helpers.batch(batch) decoder_targets_, _ = helpers.batch( [(sequence) + [EOS] forsequence inbatch] ) decoder_inputs_, _ = helpers.batch( [[EOS] + (sequence) forsequence inbatch] ) return{ encoder_inputs: encoder_inputs_, decoder_inputs: decoder_inputs_, decoder_targets: decoder_targets_, } 给定encoder_inputs [5,6,7],decode_target将为[5,6,7,1],其中1为EOS,decode_inputs为[1,5,6,7] - decode_inputs滞后1步, 将以前的指令作为当前步骤的输入。 loss_track = []max_batches = 3001 batches_in_epoch = 1000 try: forbatch inrange(max_batches): fd = next_feed() _, l = sess.run([train_op, loss], fd) loss_track.append(l) ifbatch == 0orbatch % batches_in_epoch == 0: print( 'batch {}'.format(batch)) print( ' minibatch loss: {}'.format(sess.run(loss, fd))) predict_ = sess.run(decoder_prediction, fd) fori, (inp, pred) inenumerate(zip(fd[encoder_inputs].T, predict_.T)): print( ' sample {}:'.format(i + 1)) print( ' input > {}'.format(inp)) print( ' predicted > {}'.format(pred)) ifi >= 2: breakprint() exceptKeyboardInterrupt: print( 'training interrupted') (责任编辑:本港台直播) |