2016-05-02 3 views
0

В TensorFlow я пытаюсь изменить вес во время обучения, но не получаю никаких изменений в результатах. Я попытался сорвать весы (установить на ноль), но, похоже, ничего не делает (кроме того, что требуется больше времени для завершения). Что мне не хватает? Есть ли способ манипулировать W как регулярная матрица/тензор во время сеанса?Динамически изменяющиеся веса в TensorFlow

from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 

import tensorflow as tf 
sess = tf.InteractiveSession() 
x = tf.placeholder(tf.float32, shape=[None, 784]) 
y_ = tf.placeholder(tf.float32, shape=[None, 10]) 
W = tf.Variable(tf.zeros([784,10]), trainable=True) 
W2 = tf.Variable(tf.zeros([784,10]), trainable=False) 
b = tf.Variable(tf.zeros([10])) 

sess.run(tf.initialize_all_variables()) 

y = tf.nn.softmax(tf.matmul(x,W) + b) 
loss = tf.reduce_mean(tf.square(y_ - y)) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss) 

for i in range(1000): 
#try to change W during training 
    W = W2 

    W = tf.Variable(tf.zeros([784,10])) 

    W.assign(tf.Variable(tf.zeros([784,10]))) 

    batch = mnist.train.next_batch(1) 

    train_step.run(feed_dict={x: batch[0], y_: batch[1]}) 

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

print(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})) 

Точность остается неизменной (0,82).

+0

Что вы пытаетесь достичь? Tensorflow использует подход, в котором вы сначала создаете график, затем вы используете сеанс для его запуска. Обычно вы не должны напрямую манипулировать тензорами во время тренировочной фазы. – Aenimated1

+0

Обновление: если я повторяю строку «y = tf.nn.softmax (tf.matmul (x, W) + b)» перед изменением W, результаты теперь меняются. Не уверен, что мне не хватает, но теперь это работает. – Danny

+0

Я пытаюсь напрямую манипулировать тензорами во время фазы обучения. В основном, чтобы добавить некоторые правила и функции, которые не покрываются TF, но я могу легко реализовать с помощью тензорной математики, посмотрите, может ли она помочь в создании лучших сетей. – Danny

ответ

0

Я не уверен, что это хорошая идея, но если вы хотите обновить W после W.assign, вам нужно ее оценить.

sess.run(W) 

Кроме того, поскольку большинство TensorFlow и нейронные сети использовать вперед/обратного распространения для вычисления значений/градиенты для обновления веса, инициализации веса с 0 убивает все значения вперед и, таким образом градиенты. Это не очень хорошая идея.

Вы можете попробовать инициализировать их с небольшими случайными числами: tf.Variable (tf.random_normal ([784, 10], STDDEV = 0,01))

Или использовать Xavier инициализатору

W = tf.get_variable("W", shape=[784, 10], 
     initializer=tf.contrib.layers.xavier_initializer()) 
0

При использовании tf.assign(), вам нужно дать имя для этой операции:

W = W.assign (tf.Variable (tf.zeros ([784,10])))

Тогда, когда вы снова используете W, операция назначения будет выполнена.

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