2017-10-03 4 views
0

私は言語モデリングに取り組んでおり、ボキャブラリは大きいです。ですからテンソルフローのsampled_softmax_lossを使いたいと思います。問題はsampled_softmax_loss関数の引数です重み偏見は、だから私は、私は自動的に計算グラフの建物にそれらを追加する必要があることを推測するkerasはグラフに外部学習可能変数を追加します。

(それらの値は、トレーニング後に変更されません)トレーニング可能ではないようだということですkerasモデルでは、私は多くの時間を費やし、それを行うための適切な方法をまだ見つけていない。

だから、もう一度。 はケラス計算グラフに外部の訓練可能なtf.Variablesを追加したいと思います。誰もがそうする方法を知っていますか?

私のモデル(頭と尾)

input_sentence = Input(shape=(INPUT_LENGTH,), dtype='int32') 
words = Embedding(embedding_matrix.shape[0], embedding_matrix.shape[1], 
        weights=[embedding_matrix], trainable=True)(input_sentence) 

... 

context = Dense(256, activation='tanh')(context) 

model = Model(inputs=input_sentence, outputs=context, name=name) 

損失

def softmax_fine_loss(labels, logits, transposed_W=None, b=None): 
    res = tf.map_fn(lambda (__labels, __logits): tf.nn.sampled_softmax_loss(transposed_W, b, __labels, __logits, 
                     num_sampled=1000, num_classes=OUTPUT_COUNT+1), 
       (labels, logits), dtype=tf.float32) 
    return res 

loss = lambda labels, logits: softmax_fine_loss(labels, logits, transposed_W=transposed_W, b=b) 

model_truncated.compile(optimizer=optimizer, loss=loss, sample_weight_mode='temporal') 

答えて

1

は、私は最終的に

は、我々はと偏見B重みWにを訓練する必要があるとしましょう、回避策を発見しました私たちのモデルで

回避策は、私たちのモデルのtrainableのレイヤーの1つに追加するだけです。

model.layers[-1].trainable_weights.extend([W, b]) 

私たちがモデルに

model.compile(...) 

をコンパイルすることができたときには、例えば、私はシーケンシャルモデルで実験してきた、トレーニング可能な層に変数を追加にとって非常に重要である、と[W、B]を追加アクティベーションレイヤーには実際に訓練可能にはなりません。

関連する問題