2016-06-01 3 views
0

Рассмотрим следующий пример:Сохранение значений тензора между сессии работает

import tensorflow as tf 
import math 
import numpy as np 

INPUTS = 10 
HIDDEN_1 = 20 
BATCH_SIZE = 3 


def create_graph(inputs): 
    with tf.name_scope('h1'): 
     weights = tf.Variable(
     tf.truncated_normal([INPUTS, HIDDEN_1], 
          stddev=1.0/math.sqrt(float(INPUTS))), 
     name='weights') 
     biases = tf.Variable(tf.zeros([HIDDEN_1]), 
         name='biases') 
     state = tf.Variable(tf.zeros([HIDDEN_1]), name='inner_state') 
     state = tf.Print(state, [state], message=" this is state before: ") 
     state = 0.9*state + 0.1*(tf.matmul(inputs, weights) + biases) 
     state = tf.Print(state, [state], message=" this is state after: ") 
     output = tf.nn.relu(state) 
    return output 

def data_iter(): 
    while True: 
     idxs = np.random.rand(BATCH_SIZE, INPUTS) 
     yield idxs 

with tf.Graph().as_default(): 
    inputs = tf.placeholder(tf.float32, shape=(BATCH_SIZE, INPUTS)) 
    output = create_graph(inputs) 

    sess = tf.Session() 
    # Run the Op to initialize the variables. 
    init = tf.initialize_all_variables() 
    sess.run(init) 
    iter_ = data_iter() 
    for i in xrange(0, 2): 
     print ("iteration: ",i) 
     input_data = iter_.next() 
     out = sess.run(output, feed_dict={ inputs: input_data}) 

Я надеялся иметь тензор state, чтобы сохранить его промежуточный и медленно изменяться на каждой итерации. Тем не менее, что я вижу в том, что на каждом sess.run вызова, состояние начинается нулевых значений:

('iteration: ', 0) 
I tensorflow/core/kernels/logging_ops.cc:79] this is state before: [0 0 0...] 
I tensorflow/core/kernels/logging_ops.cc:79] this is state after: [0.007762237 0.044753391 0.049343754...] 
('iteration: ', 1) 
I tensorflow/core/kernels/logging_ops.cc:79] this is state before: [0 0 0...] 
I tensorflow/core/kernels/logging_ops.cc:79] this is state after: [0.040079735 0.074709542 0.078258425...] 

Я был бы признателен за любые разъяснения, как решать это поведение


Редактировать

после комментирования строк tf.Print и замены неправильного присвоения на

state = state.assign(0.9*state + 0.1*(tf.matmul(inputs, weights) + biases)) 

я получаю эти ошибки:

Traceback (most recent call last): 
    File "cycles_in_graphs.py", line 33, in <module> 
    output = create_graph(inputs) 
    File "cycles_in_graphs.py", line 21, in create_graph 
    state = state.assign(0.9*state + 0.1*(tf.matmul(inputs, weights) + biases)) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variables.py", line 453, in assign 
    return state_ops.assign(self._variable, value, use_locking=use_locking) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_state_ops.py", line 40, in assign 
    use_locking=use_locking, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 655, in apply_op 
    op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2156, in create_op 
    set_shapes_for_outputs(ret) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1612, in set_shapes_for_outputs 
    shapes = shape_func(op) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/state_ops.py", line 197, in _AssignShape 
    return [op.inputs[0].get_shape().merge_with(op.inputs[1].get_shape())] 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 554, in merge_with 
    (self, other)) 
ValueError: Shapes (20,) and (3, 20) are not compatible 

ответ

1

Когда вы пишете state = 0.9 * state + 0.1 * (tf.matmul(inputs, weights) + biases), вы не измените значение переменной state.
Вы только вычислите значение из 0.9 * state + 0.1 * ..., но значение переменной остается неизменным.


Чтобы обновить tf.Variable, вы должны использовать функцию assign или assign_add на вашей переменной state:

state = state.assign(0.9 * state + 0.1 * (tf.matmul(inputs, weights) + biases)) 

Все объясняется в TensorFlow tutorial on Variables.

+0

спасибо. Я получаю эту ошибку «state = state.assign (0.9 * state + 0.1 * (tf.matmul (входы, весы) + смещения)) AttributeError: объект« Tensor »не имеет атрибута 'assign'" – diffeomorphism

+0

Да, удалите строку 'state = tf.Print (state)' непосредственно перед этим. Только 'tf.Variable' имеют атрибут' assign() ' –

+0

спасибо! Я обновил выражение присваивания, но я получил некоторые несовместимые ошибки формы, я обновил OP с ошибками. – diffeomorphism

Смежные вопросы