1

Good afternoon. I'm a tensorflow newbie and currently trying to solve this problem: 1) get a simple neural network, train it, print accuracy (done) 2) save it (done) 3) restore it (done) 4) set restored weights to zero randomly. (&)

I've read this topic: Dynamically changing weights in TensorFlow and tried several things from there, but to no avail. Here's my code:

from __future__ import print_function

import tensorflow as tf

# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

# Parameters
learning_rate = 0.01
training_epochs = 20

batch_size = 100
display_step = 1

# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784])  # mnist data image 28*28
y = tf.placeholder(tf.float32, [None, 10])  # 0-9 digits recognition => 10 classes

# Set model weights
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

# Construct model
pred = tf.nn.softmax(tf.matmul(x, W) + b)   # Softmax

# Minimize error using cross entropy
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initializing the variables
init_op = tf.global_variables_initializer()
saver = tf.train.Saver()

# Launch the graph
with tf.Session() as sess:
    sess.run(init_op)

# Training cycle
for epoch in range(training_epochs):
    avg_cost = 0.
    total_batch = int(mnist.train.num_examples/batch_size)
    # Loop over all batches
    for i in range(total_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        # Run optimization op (backprop) and cost op (to get loss value)
        _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
                                                      y: batch_ys})
    # Compute average loss
    avg_cost += c / total_batch
    # Display logs per epoch step
    if (epoch+1) % display_step == 0:
      print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost))

print("Optimization Finished!")

# Test model
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
# Calculate accuracy
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# Save the variables to disk.

save_path = saver.save(sess,"/Users/mac/PycharmProjects/untitled1/MyModel",
write_meta_graph=True)
print("Model saved in file: %s" % save_path)
print("Accuracy_old:", accuracy.eval({x: mnist.test.images, y:mnist.test.labels})) 

new_saver = tf.train.import_meta_graph('MyModel.meta')
new_saver.restore(sess, tf.train.latest_checkpoint('./'))
all_vars = tf.get_collection('vars')
for v in all_vars:
    v_ = sess.run(v)
    print(v_)

#Rand = tf.Variable(tf.random_normal([784, 10]))
#Zeroes = tf.mul(tf.zeros([784, 10]),Rand)
#W = tf.mul(Zeroes,Rand)
W = tf.mul(W, 0)
print("Accuracy_new:", accuracy.eval({x: mnist.test.images,     y:mnist.test.labels}))

I tried to use random distribution multiplied by zeros, than simply 0, nothing changes, the accuracy is the same even when I try to put W=0.

Would be very grateful for someone's advice.

Community
  • 1
  • 1
TheDoctor
  • 105
  • 1
  • 9

1 Answers1

1

The line

W = tf.mul(W, 0)

creates a new node in the graph that is not used by anyone - accuracy is still using the old W, that is why you are seeing no change. The way to change W is to use TensorFlow's assign and run it (see How to assign value to a tensorflow variable?), something like

assign_op = W.assign(tf.mul(W,0))
sess.run(assign_op)
Community
  • 1
  • 1
etarion
  • 16,935
  • 4
  • 43
  • 66
  • Thank you very much, I have already found this myself, it worked! But question about how to set weight to zero randomly, and not all of them, still stands. – TheDoctor Jan 20 '17 at 18:05