2

いくつかのレイヤーでは再帰性(例えばLSTM)、他のレイヤーでは通常の接続(FC)を持つニューラルネットワークを作りたいと思っています。 Tensorflowでこれを行う方法が見つかりません。 FCレイヤーしか持っていないのであれば動作しますが、反復レイヤーを1つだけ正しく追加する方法はわかりません。TensorflowでFCNNとRNNを組み合わせる方法は?

私は、次の方法でネットワークを作成します。

with tf.variable_scope("autoencoder_variables", reuse=None) as scope: 

    for i in xrange(self.__num_hidden_layers + 1): 
    # Train weights 
    name_w = self._weights_str.format(i + 1) 
    w_shape = (self.__shape[i], self.__shape[i + 1]) 
    a = tf.multiply(4.0, tf.sqrt(6.0/(w_shape[0] + w_shape[1]))) 
    w_init = tf.random_uniform(w_shape, -1 * a, a) 
    self[name_w] = tf.Variable(w_init, 
           name=name_w, 
           trainable=True) 
    # Train biases 
    name_b = self._biases_str.format(i + 1) 
    b_shape = (self.__shape[i + 1],) 
    b_init = tf.zeros(b_shape) 
    self[name_b] = tf.Variable(b_init, trainable=True, name=name_b) 

    if i+1 == self.__recurrent_layer: 
     # Create an LSTM cell 
     lstm_size = self.__shape[self.__recurrent_layer] 
     self['lstm'] = tf.contrib.rnn.BasicLSTMCell(lstm_size) 

それは順番にバッチを処理する必要があります。以下の関数は、入力としてバッチのシーケンスを取り、バッチのシーケンスを生成する必要があり

def single_run(self, input_pl, state, just_middle = False): 
    """Get the output of the autoencoder for a single batch 

    Args: 
    input_pl:  tf placeholder for ae input data of size [batch_size, DoF] 
    state:  current state of LSTM memory units 
    just_middle : will indicate if we want to extract only the middle layer of the network 
    Returns: 
    Tensor of output 
    """ 

    last_output = input_pl 

    # Pass through the network 
    for i in xrange(self.num_hidden_layers+1): 

    if(i!=self.__recurrent_layer): 
     w = self._w(i + 1) 
     b = self._b(i + 1) 
     last_output = self._activate(last_output, w, b) 

    else: 
     last_output, state = self['lstm'](last_output,state) 

    return last_output 

:私は、全体のシーケンスを処理する機能によって、後で呼び出される処理ワンタイムステップのための機能を有します出力として:

def process_sequences(self, input_seq_pl, dropout, just_middle = False): 
    """Get the output of the autoencoder 

    Args: 
    input_seq_pl:  input data of size [batch_size, sequence_length, DoF] 
    dropout:   dropout rate 
    just_middle :  indicate if we want to extract only the middle layer of the network 
    Returns: 
    Tensor of output 
    """ 

    if(~just_middle): # if not middle layer 
    numb_layers = self.__num_hidden_layers+1 
    else: 
    numb_layers = FLAGS.middle_layer 

    with tf.variable_scope("process_sequence", reuse=None) as scope: 

    # Initial state of the LSTM memory. 
    state = initial_state = self['lstm'].zero_state(FLAGS.batch_size, tf.float32) 

    tf.get_variable_scope().reuse_variables() # THIS IS IMPORTANT LINE 

    # First - Apply Dropout 
    the_whole_sequences = tf.nn.dropout(input_seq_pl, dropout) 

    # Take batches for every time step and run them through the network 
    # Stack all their outputs 
    with tf.control_dependencies([tf.convert_to_tensor(state, name='state') ]): # do not let paralelize the loop 
     stacked_outputs = tf.stack([ self.single_run(the_whole_sequences[:,time_st,:], state, just_middle) for time_st in range(self.sequence_length) ]) 

    # Transpose output from the shape [sequence_length, batch_size, DoF] into [batch_size, sequence_length, DoF] 

    output = tf.transpose(stacked_outputs , perm=[1, 0, 2]) 

    return output 

問題は可変スコープとそのプロパティ "再使用"です。

このコードをそのまま実行すると、次のエラーが発生します。 '変数列/ process_sequence/basic_lstm_cell/weightsが存在しないか、tf.get_variable()で作成されていません。 VarScopeでreuse = Noneを設定することを意味しましたか? 「

私は変数再利用することを教えライン、コメントアウトした場合、私は次のエラーを取得しています(tf.get_variable_scopeを()reuse_variables()。): 」、可変電車/ process_sequence/basic_lstm_cell /重量は、すでに存在して許可されていません。 VarScopeでreuse = Trueを設定することを意味しましたか?

LSTMセルを初期化するためには "reuse = None"が必要で、LSTMセルを呼び出すには "reuse = True"が必要です。

適切に行う方法を理解してください。

答えて

0

それは、私は次のコードで公式Tensorflow RNNの例(https://www.tensorflow.org/tutorials/recurrent)からハックを使用してこの問題を解決したようだ

with tf.variable_scope("RNN"): 
    for time_step in range(num_steps): 
    if time_step > 0: tf.get_variable_scope().reuse_variables() 
    (cell_output, state) = cell(inputs[:, time_step, :], state) 
    outputs.append(cell_output) 

ハックがある、我々は(、tf.get_variable_scope LSTM初めて実行するとき).reuseがFalseに設定されているため、新しいLSTMセルが作成されます。次回に実行するときは、tf.get_variable_scope()。reuseをTrueに設定して、すでに作成されているLSTMを使用しています。

0

私は問題があなたがtf.Variableで変数を作成していると思います。代わりにtf.get_variableを使用してください - これで問題は解決しますか?

+0

LSTMセルに問題が発生します。 LSTMセルの作成中にtf.get_variableを使用するにはどうすればよいですか? (今私は次のようにします:self ['lstm'] = tf.contrib.rnn.BasicLSTMCell(lstm_size)) –

関連する問題