2017-10-19 8 views
1

何が起こっているのか把握しようと時間を費やしていますが、まだこのエラーが発生しています。ここに私が得るエラーはウェイトが存在しないか、tf.get_variable()で作成されていません

ValueError: Variable rnn/multi_rnn_cell/cell_1/basic_lstm_cell/weights does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?

ここに私のサンプルコードは、誰も私が間違っていることを知っていますか?あなたがそうでなければ

def cell():   
    return rnn.BasicLSTMCell(n_hidden,forget_bias=0.1) 

、単に以下を使用し、セルを再利用する必要がない場合は、再利用する必要がある場合は

x = tf.placeholder(tf.float32,[None,n_steps,n_input]) 
y = tf.placeholder(tf.float32,[None,n_classes]) 
weights = { 
    'out': tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'out': tf.Variable(tf.random_normal([n_classes])) 
} 

def RNN(x, weights, biases): 

    x = tf.unstack(x, n_steps, 1) 

    lstm_cell = rnn.MultiRNNCell([cell() for y in range(2)] , state_is_tuple=True) 


    # Get lstm cell output 
    outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32) 

    # Linear activation, using rnn inner loop last output 
    return tf.matmul(outputs[-1], weights['out']) + biases['out'] 

def cell():   
    return rnn.BasicLSTMCell(n_hidden,forget_bias=0.1, reuse=True) 

pred = RNN(x, weights, biases) 
+0

'tf.variable_scope(...)で何をしようとしていますか?両方のLSTM細胞で体重を再利用しようとしていますか?その場合、同じセルオブジェクトを再利用するだけです。そうでなければ、 'tf.variable_scope'を削除してください。これはTFを混乱させるからです(同じ変数スコープの2つのインスタンス化の下でopsを作成しているので、名前が矛盾します)。[here](https://github.com/テンソルフロー/テンソルフロー/ issue/6007#issuecomment-315030061))。 – jdehesa

+0

ありがとう、@jdehesa私はそれなしで試してみましたが、それはまだ同じ問題について不満です。私は私の質問を編集しました。 –

+0

ああ、待って、セルで 'reuse = True'を使っているのを見たことがありませんでした。これは、必要な変数を手前で作成することを前提としています(あるいは 'static_rnn' /' dynamic_rnn'の前回の呼び出しで作成されたもの)。本当に重みを再利用したいのであれば、可能であれば同じセルオブジェクトを再利用するほうが一般的に簡単です(つまり、1つを作成して2つの参照を含むリストを 'MultiRNNCell'に渡す)。ウェイトを再利用したくない場合は、 'reuse = True'を渡さないでください。 – jdehesa

答えて

1

あなたが重みを再利用したい場合は、最も簡単な方法は、単一のセルオブジェクトを作成し、MultiRNNCellにそれを複数回通過させることである。

import tensorflow as tf 
from tensorflow.contrib import rnn 

n_steps = 20 
n_input = 10 
n_classes = 5 
n_hidden = 15 

x = tf.placeholder(tf.float32,[None,n_steps,n_input]) 
y = tf.placeholder(tf.float32,[None,n_classes]) 
weights = { 
    'in': tf.Variable(tf.random_normal([n_input, n_hidden])), 
    'out': tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
biases = { 
    'in': tf.Variable(tf.random_normal([n_hidden])), 
    'out': tf.Variable(tf.random_normal([n_classes])) 
} 

def RNN(x, weights, biases): 

    # Initial input layer 
    inp = (tf.matmul(x, weights['in'][tf.newaxis, ...]) + 
      biases['in'][tf.newaxis, tf.newaxis, ...]) 
    inp = tf.nn.sigmoid(inp) 
    inp = tf.unstack(inp, axis=-1) 

    my_cell = cell() 
    lstm_cell = rnn.MultiRNNCell([my_cell for y in range(2)], state_is_tuple=True) 

    # Get lstm cell output 
    outputs, states = rnn.static_rnn(lstm_cell, inp, dtype=tf.float32) 

    # Linear activation, using rnn inner loop last output 
    return tf.matmul(outputs[-1], weights['out']) + biases['out'] 

def cell():   
    return rnn.BasicLSTMCell(n_hidden,forget_bias=0.1) 

pred = RNN(x, weights, biases) 

しかし、あなたはそれは理にかなっていることを確認する必要がありますは、次元ごとに変数を共有します。それ以外の場合は失敗します。この場合、すべてのLSTM入力が同じサイズであることを確認するために、LSTMセルの前に追加のレイヤーを追加しました。

+0

Woot ... Woot ...素晴らしい、それは働いた。 LSTMの前に密なレイヤーを使用するシナリオで答えを広げてください。 –

+0

@FarzanMajdani私は答えを更新しました。 – jdehesa

+0

ありがとう、あなたは星です:) –

2

、あなたは素敵な説明があり、このReuse Reusing Variable of LSTM in Tensorflowポストに従うことができます。

+0

ありがとう、しかし私はまだそれを働かせることができません。 –

関連する問題