2016-08-23 19 views
1

LSTMを使用してRNNを作成しようとしています。 LSTMモデルを作ったあと、2つの回帰出力層と1つの回帰出力層があります。TensorflowでのLSTMの再利用再利用

私は自分のデータを訓練し、最終的な訓練の損失は約0.009になります。 しかし、モデルをテストデータに適用すると、損失は約0.5になります。

第1回訓練の損失は約0.5です。 訓練された変数はテストモデルでは使用されないと思います。

トレーニングとテストモデルの唯一の違いは、バッチサイズです。 Trainning Batch = 100~200,Test Batch Size = 1

メイン関数iはLSTMインスタンスを作った。 LSTM innitializerでは、機種が作られています。 LSTM上LSTMインスタンス以下のinitを使用

def __init__(self,config,train_model=None): 
    self.sess = sess = tf.Session() 

    self.num_steps = num_steps = config.num_steps 
    self.lstm_size = lstm_size = config.lstm_size 
    self.num_features = num_features = config.num_features 
    self.num_layers = num_layers = config.num_layers 
    self.num_hiddens = num_hiddens = config.num_hiddens 
    self.batch_size = batch_size = config.batch_size 
    self.train = train = config.train 
    self.epoch = config.epoch 
    self.learning_rate = learning_rate = config.learning_rate 

    with tf.variable_scope('model') as scope:   
     self.lstm_cell = lstm_cell = tf.nn.rnn_cell.LSTMCell(lstm_size,initializer = tf.contrib.layers.xavier_initializer(uniform=False)) 
     self.cell = cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_layers) 

    with tf.name_scope('placeholders'): 
     self.x = tf.placeholder(tf.float32,[self.batch_size,num_steps,num_features], 
           name='input-x') 
     self.y = tf.placeholder(tf.float32, [self.batch_size,num_features],name='input-y') 
     self.init_state = cell.zero_state(self.batch_size,tf.float32) 
    with tf.variable_scope('model'): 
     self.W1 = tf.Variable(tf.truncated_normal([lstm_size*num_steps,num_hiddens],stddev=0.1),name='W1') 
     self.b1 = tf.Variable(tf.truncated_normal([num_hiddens],stddev=0.1),name='b1') 
     self.W2 = tf.Variable(tf.truncated_normal([num_hiddens,num_hiddens],stddev=0.1),name='W2') 
     self.b2 = tf.Variable(tf.truncated_normal([num_hiddens],stddev=0.1),name='b2') 
     self.W3 = tf.Variable(tf.truncated_normal([num_hiddens,num_features],stddev=0.1),name='W3') 
     self.b3 = tf.Variable(tf.truncated_normal([num_features],stddev=0.1),name='b3') 


    self.output, self.loss = self.inference() 
    tf.initialize_all_variables().run(session=sess)     
    tf.initialize_variables([self.b2]).run(session=sess) 

    if train_model == None: 
     self.train_step = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.loss) 

が作られています。

with tf.variable_scope("model",reuse=None): 
    train_model = LSTM(main_config) 
with tf.variable_scope("model", reuse=True): 
    predict_model = LSTM(predict_config) 

2つのLSTMインスタンスを行った後、私はtrain_modelを訓練しました。 そして、私はpredict_modelにテストセットを入力しました。

なぜ変数が再利用されないのですか?

答えて

2

scopeを再利用する場合は、tf.Variable()ではなく、tf.get_variable()を使用して変数を作成する必要があります。

変数を共有するためにat this tutorialを見てみると、よりよく理解できます。

また、モデルを定義するときに変数を初期化する必要がないため、ここでセッションを使用する必要はありません。モデルをトレーニングするときに変数を初期化する必要があります。

変数を再利用するためのコードは次のとおりです。

def __init__(self,config,train_model=None): 
    self.num_steps = num_steps = config.num_steps 
    self.lstm_size = lstm_size = config.lstm_size 
    self.num_features = num_features = config.num_features 
    self.num_layers = num_layers = config.num_layers 
    self.num_hiddens = num_hiddens = config.num_hiddens 
    self.batch_size = batch_size = config.batch_size 
    self.train = train = config.train 
    self.epoch = config.epoch 
    self.learning_rate = learning_rate = config.learning_rate 

    with tf.variable_scope('model') as scope:   
     self.lstm_cell = lstm_cell = tf.nn.rnn_cell.LSTMCell(lstm_size,initializer = tf.contrib.layers.xavier_initializer(uniform=False)) 
     self.cell = cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_layers) 

    with tf.name_scope('placeholders'): 
     self.x = tf.placeholder(tf.float32,[self.batch_size,num_steps,num_features], 
           name='input-x') 
     self.y = tf.placeholder(tf.float32, [self.batch_size,num_features],name='input-y') 
     self.init_state = cell.zero_state(self.batch_size,tf.float32) 
    with tf.variable_scope('model'): 
     self.W1 = tf.get_variable(initializer=tf.truncated_normal([lstm_size*num_steps,num_hiddens],stddev=0.1),name='W1') 
     self.b1 = tf.get_variable(initializer=tf.truncated_normal([num_hiddens],stddev=0.1),name='b1') 
     self.W2 = tf.get_variable(initializer=tf.truncated_normal([num_hiddens,num_hiddens],stddev=0.1),name='W2') 
     self.b2 = tf.get_variable(initializer=tf.truncated_normal([num_hiddens],stddev=0.1),name='b2') 
     self.W3 = tf.get_variable(initializer=tf.truncated_normal([num_hiddens,num_features],stddev=0.1),name='W3') 
     self.b3 = tf.get_variable(initializer=tf.truncated_normal([num_features],stddev=0.1),name='b3') 


    self.output, self.loss = self.inference() 

    if train_model == None: 
     self.train_step = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.loss) 

あなたはtrain_modelpredict_model次のコードを使用して作成した後、変数が作成されているかを確認するには、次の

for v in tf.all_variables(): 
    print(v.name)