2017-11-07 3 views
2

Ich versuche, einen RNN-Klassifikator zu machen, der 3 verschiedene Zeitreihen mit jeweils 3 Dimensionen als Eingabe hat und die Zeitreihen unterschiedliche Längen haben können. Um das zu lösen, modellierte ich 3 RNNs und verband sie in der letzten Schicht.Wie erstellt man unabhängige LSTM-Zellen im Tensorflow?

Allerdings erhalte ich folgende Fehlermeldung:

ValueError: Variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel already exists, disallowed. Did you mean to set reuse=True in VarScope?

timeSeries = ['outbound', 'rest', 'return'] 
n_steps = { 
    'outbound': 3159, 
    'rest': 3603, 
    'return': 3226 
} 
n_inputs = 3 
n_neurons = 20 
n_outputs = 2 
n_layers = 1 

learning_rate = 0.001 


y = tf.placeholder(tf.int32, [None], name="y") 
X = {} 
seq_length = {} 
for timeSeriesName in timeSeries: 
    with tf.name_scope(timeSeriesName + "_placeholders") as scope: 
     X[timeSeriesName] = tf.placeholder(tf.float32, [None, n_steps[timeSeriesName], n_inputs]) 
     seq_length[timeSeriesName] = tf.placeholder(tf.int32, [None]) 


outputs = {} 
states = {} 
top_layer_h_state = {} 
lstm_cells = {} 
multi_cell = {} 
finalRNNlayers = [] 
for timeSeriesName in timeSeries: 
    with tf.name_scope(timeSeriesName) as scope: 
     lstm_cells[timeSeriesName] = [tf.contrib.rnn.BasicLSTMCell(num_units=n_neurons) 
             for layer in range(n_layers)] 
     multi_cell[timeSeriesName] = tf.contrib.rnn.MultiRNNCell(lstm_cells[timeSeriesName]) 
     outputs[timeSeriesName], states[timeSeriesName] = tf.nn.dynamic_rnn(
      multi_cell[timeSeriesName], X[timeSeriesName], dtype=tf.float32, 
      sequence_length=seq_length[timeSeriesName]) 
     top_layer_h_state[timeSeriesName] = states[timeSeriesName][-1][1] 
     finalRNNlayers.append(top_layer_h_state[timeSeriesName]) 

with tf.name_scope("3Stages_mixed") as scope: 
    concat3_top_layer_h_states = tf.concat(finalRNNlayers, axis=1) 
    logits = tf.layers.dense(concat3_top_layer_h_states, n_outputs, name="softmax") 

ich jede Zeitreihe wollen mit ihren eigenen Gewichte unabhängig LSTM Zellen haben jeweils, so dass die Wiederverwendung keine Option ist, wie sollte dieser Fehler behoben sein?

The full traceback of the error can be found here.

Antwort

2

Änderung tf.name_scope(timeSeriesName) zu tf.variable_scope(timeSeriesName). Der Unterschied zwischen tf.name_scope und tf.variable_scope wird in this quesion diskutiert. In Ihrem Fall ist es wichtig, dass tf.get_variable die Namensbereiche ignoriert und die LSTM-Zellenparameter genau mit tf.get_variable erstellt werden.

Beispielcode, um zu sehen, den Unterschied:

import tensorflow as tf 

state = tf.zeros([32, 6]) 

input1 = tf.placeholder(tf.float32, [32, 10]) 
input2 = tf.placeholder(tf.float32, [32, 10]) 

# Works ok: 
with tf.variable_scope('scope-1'): 
    tf.nn.rnn_cell.BasicLSTMCell(3, state_is_tuple=False)(input1, state) 
with tf.variable_scope('scope-2'): 
    tf.nn.rnn_cell.BasicLSTMCell(3, state_is_tuple=False)(input2, state) 

# Fails: 
with tf.name_scope('name-1'): 
    tf.nn.rnn_cell.BasicLSTMCell(3, state_is_tuple=False)(input1, state) 
with tf.name_scope('name-2'): 
    tf.nn.rnn_cell.BasicLSTMCell(3, state_is_tuple=False)(input2, state) 
Verwandte Themen