2017-04-22 3 views
1

Ich möchte zwei verschiedene LSTMs trainieren, damit sie in einem Dialogkontext interagieren (dh man erzeugt eine Sequenz, die als Kontext für das zweite Rnn verwendet wird, die beantwortet wird usw.). Allerdings weiß ich nicht, wie man sie separat auf Tensorflow ausbildet (ich denke, dass ich die Logik hinter den TF-Graphen nicht vollständig verstanden habe). Wenn ich meinen Code ausführe, erhalte ich den folgenden Fehler:Wie trainiert man verschiedene LSTM auf derselben Tensorflow-Sitzung?

Variable rnn/basic_lstm_cell/Gewichte existiert bereits, nicht erlaubt. Wollten Sie in VarScope reuse = True setzen?

Der Fehler passiert, wenn ich meine zweite RNN erstellen. Weißt du, wie das zu beheben ist?

Mein Code ist folgende:

#User LSTM 
no_units=100 
_seq_user = tf.placeholder(tf.float32, [batch_size, max_length_user, user_inputShapeLen], name='seq') 
_seq_length_user = tf.placeholder(tf.int32, [batch_size], name='seq_length') 

cell = tf.contrib.rnn.BasicLSTMCell(
     no_units) 

output_user, hidden_states_user = tf.nn.dynamic_rnn(
    cell, 
    _seq_user, 
    dtype=tf.float32, 
    sequence_length=_seq_length_user 
) 
out2_user = tf.reshape(output_user, shape=[-1, no_units]) 
out2_user = tf.layers.dense(out2_user, user_outputShapeLen) 

out_final_user = tf.reshape(out2_user, shape=[-1, max_length_user, user_outputShapeLen]) 
y_user_ = tf.placeholder(tf.float32, [None, max_length_user, user_outputShapeLen]) 


softmax_user = tf.nn.softmax(out_final_user, dim=-1) 
loss_user = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out_final_user, labels=y_user_)) 
optimizer = tf.train.AdamOptimizer(learning_rate=10**-4) 
minimize = optimizer.minimize(loss_user) 

init = tf.global_variables_initializer() 
sess = tf.Session() 
sess.run(init) 

for i in range(epoch): 
    print 'Epoch: ', i 
    batch_X, batch_Y, batch_sizes = lstm.batching(user_train_X, user_train_Y, sizes_user_train) 
    for data_, target_, size_ in zip(batch_X, batch_Y, batch_sizes): 
     sess.run(minimize, {_seq_user:data_, _seq_length_user:size_, y_user_:target_}) 

#System LSTM 
no_units_system=100 
_seq_system = tf.placeholder(tf.float32, [batch_size, max_length_system, system_inputShapeLen], name='seq_') 
_seq_length_system = tf.placeholder(tf.int32, [batch_size], name='seq_length_') 

cell_system = tf.contrib.rnn.BasicLSTMCell(
     no_units_system) 

output_system, hidden_states_system = tf.nn.dynamic_rnn(
    cell_system, 
    _seq_system, 
    dtype=tf.float32, 
    sequence_length=_seq_length_system 
) 
out2_system = tf.reshape(output_system, shape=[-1, no_units]) 
out2_system = tf.layers.dense(out2_system, system_outputShapeLen) 

out_final_system = tf.reshape(out2_system, shape=[-1, max_length_system, system_outputShapeLen]) 
y_system_ = tf.placeholder(tf.float32, [None, max_length_system, system_outputShapeLen]) 

softmax_system = tf.nn.softmax(out_final_system, dim=-1) 
loss_system = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out_final_system, labels=y_system_)) 
optimizer = tf.train.AdamOptimizer(learning_rate=10**-4) 
minimize = optimizer.minimize(loss_system) 

for i in range(epoch): 
    print 'Epoch: ', i 
    batch_X, batch_Y, batch_sizes = lstm.batching(system_train_X, system_train_Y, sizes_system_train) 
    for data_, target_, size_ in zip(batch_X, batch_Y, batch_sizes): 
     sess.run(minimize, {_seq_system:data_, _seq_length_system:size_, y_system_:target_}) 

Antwort

0

In Bezug auf den Geltungsbereich von Variablen Fehler, versuchen Sie für jede Kurve unterschiedliche Variablenumfang. mit demselben Namen für verschiedene Python Objekte

with tf.variable_scope('User_LSTM'): your user_lstm graph

with tf.variable_scope('System_LSTM'): your system_lstm graph

Auch vermeiden. (ex. optimizer) Die zweite Deklaration überschreibt die erste Deklaration, die Sie verwirrt, wenn Sie Tensorboard verwenden.

Übrigens, ich würde empfehlen, das Modell Ende-zu-Ende-Mode zu trainieren, anstatt zwei Sitzungen getrennt zu führen. Versuchen Sie, den Ausgangstensor des ersten LSTM in den zweiten LSTM mit Einzeloptimierer und Verlustfunktion zu führen.

0

Um kurz zu sein, um das Problem zu lösen (Variable rnn/basic_lstm_cell/weights already exists), , was Sie brauchen, sind 2 getrennte variable Bereiche (wie von @ J-min erwähnt). Da im Tensorflow Variablen nach ihren Namen organisiert sind und diese beiden Variablensätze in den beiden Bereichen verwalten, kann Tensorflow sie voneinander unterscheiden.

Und von train them separately on tensorflow, nehme ich an, dass Sie zwei verschiedene Verlustfunktionen definieren und diese zwei LSTM-Netzwerke mit zwei Optimierern optimieren möchten, die jeweils einer der Verlustfunktionen zuvor entsprechen.

Unter solchen Umständen müssen Sie die Listen dieser beiden Sätze von Variablen erhalten, und diese Listen zu Ihrem Optimierer übergeben, wie das

opt1 = GradientDescentOptimizer(learning_rate=0.1) 
opt_op1 = opt.minimize(loss1, var_list=<list of variables from scope 1>) 

opt2 = GradientDescentOptimizer(learning_rate=0.1) 
opt_op2 = opt.minimize(loss2, var_list=<list of variables from scope 2>) 
Verwandte Themen