2016-08-23 3 views
1

Я пытаюсь сделать RNN с помощью LSTM. Я сделал LSTM модель, а после этого есть две сети DNN и один выходной уровень регрессии.Повторное использование переменной LSTM в тензорном потоке

Я обучил свои данные, и окончательная потеря обучения стала примерно 0.009. Однако, когда я применил модель для проверки данных, потеря стала примерно 0.5.

1-я учебная потеря составляет около 0.5. Итак, я думаю, что обученная переменная не используется в тестовой модели.

Единственная разница между учебной и тестовой моделью - размер партии. Trainning Batch = 100~200, Test Batch Size = 1.

в основной функции, которую я сделал LSTM экземпляра. В LSTM innitializer, модель изготовлена.

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) 

Использование Над LSTM инициализации, ниже, например LSTM сделаны.

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

после создания двух LSTM экземпляра, я обучал train_model. И я вводил тестовый набор в predict_model.

Почему переменная не используется повторно?

ответ

2

Проблема заключается в том, что вы должны использовать tf.get_variable() для создания своих переменных вместо tf.Variable(), если вы повторно используете scope.

Посмотрите 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_model и predict_model использовать следующий код:

for v in tf.all_variables(): 
    print(v.name) 
Смежные вопросы