修改tensorflow中的seq2seq的投影图层 - python

时间:2018-03-20 21:47:41

标签: python tensorflow machine-learning neural-network recurrent-neural-network

我正在尝试修改我的NMT(神经机器翻译)模型的投影层。我希望能够在不重新初始化所有权重的情况下更新单位数。我按照发现here的tensorflow NMT教程中的教程进行了操作。这是我的解码器的代码:

# Decoder
train_decoder = tf.contrib.seq2seq.BasicDecoder(
    decoder_cell, train_helper, decoder_initial_state)

maximum_iterations = tf.round(tf.reduce_max(encoder_input_lengths) * 2)

# Dynamic decoding
train_outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(train_decoder)

# Projection layer -- THIS IS WHAT I WANT TO MODIFY
projection_layer = layers_core.Dense(
    len(language_base.vocabulary), use_bias=False)

train_logits = projection_layer(train_outputs.rnn_output)

train_crossent = tf.nn.sparse_softmax_cross_entropy_with_logits(
    labels=decoder_outputs, logits=train_logits)

# Target weights
target_weights = tf.sequence_mask(
    decoder_input_lengths, params.tgt_max_len, dtype=train_logits.dtype)
target_weights = tf.transpose(target_weights)

# Loss function
train_loss = (tf.reduce_sum(train_crossent * target_weights) /
    tf.to_float(params.batch_size))

# Calculate and clip gradients
train_vars = tf.trainable_variables()
gradients = tf.gradients(train_loss, train_vars)
clipped_gradients, _ = tf.clip_by_global_norm(
    gradients, params.max_gradient_norm)

# Optimization
optimizer = tf.train.AdamOptimizer(params.learning_rate)
update_step = optimizer.apply_gradients(
    zip(clipped_gradients, train_vars))

1 个答案:

答案 0 :(得分:0)

Tensorflow并没有真正让你改变变量的形状(这里与单位数量相关)而不需要付出一些努力。

相反,你最好在训练的早期阶段预先分配比平时更多的单位并屏蔽你不会使用的单位,并随时更新你的面具(使用变量来存储掩码,以便更新它。