1

I am using Tensorflow and Python to define and train a NN in the following manner:

# clear old tensor values that cause a problem when rerunning
tf.reset_default_graph() 

#network dims 
hiddenneurons=12
input_dim=3

# Set up the model

def neural_net_model(X_data,input_dim):
  W_1 = tf.Variable(tf.random_uniform([input_dim,hiddenneurons]),name='W_1')
  b_1 = tf.Variable(tf.zeros([hiddenneurons]),name='b_1')
  layer_1 = tf.add(tf.matmul(X_data,W_1), b_1)
  layer_1 = tf.nn.tanh(layer_1)

   # layer 1 multiplying and adding bias then activation function

   W_O = tf.Variable(tf.random_uniform([hiddenneurons,1]),name='W_O')
   b_O = tf.Variable(tf.zeros([1]),name='b_O')
   output = tf.add(tf.matmul(layer_1,W_O), b_O)
   # O/p layer multiplying and adding bias then activation function
   return output


xs = tf.placeholder("float")
ys = tf.placeholder("float")
output = neural_net_model(xs,3)
cost = tf.reduce_mean(tf.square(output-ys))

train = tf.train.GradientDescentOptimizer(0.001).minimize(cost)


c_t = []
c_test = []

with tf.Session() as sess:
   # Initiate session and initialize all vaiables
   sess.run(tf.global_variables_initializer())
   saver = tf.train.Saver()
   for i in range(10):
     for j in range(X_train.shape[0]):
        sess.run([cost,train],feed_dict={xs:X_train.values[j,:].reshape(1,3), ys:y_train.values[j]})

        # Run cost and train with each sample
    c_t.append(sess.run(cost, feed_dict={xs:X_train,ys:y_train}))
    c_test.append(sess.run(cost, feed_dict={xs:X_test,ys:y_test}))
    print('Epoch :',i,'Cost :',c_t[i])
    plt.scatter(i,c_t[i])
    pred = sess.run(output, feed_dict={xs:X_test})
    print(xs)
    # predict output of test data after training
    print('Cost :',sess.run(cost, feed_dict={xs:X_test,ys:y_test}))

   # save model        
   saver.save(sess,'save folder') 
   print('Model saved')     

At this point, if I output the trainable variables with tf.trainable_variables(), I get four variables of the expected shape for W_1:0, W_O:0, b_1:0, b_O:0.

I want to be able have a different file which restores the model, then uses the same weights and biases as saved, to allow me to run a variety of testing data through.

I am having trouble restoring the model and persuading it to reuse the past weights and biases. My restore code looks like this:

# clear old tensor values
tf.reset_default_graph()

newsaver = tf.train.import_meta_graph(modelloc)

def neural_net_model(X_data,input_dim):
   W_1 = tf.Variable(tf.random_uniform([input_dim,hiddenneurons]))

   b_1 = tf.Variable(tf.zeros([hiddenneurons]))
   layer_1 = tf.add(tf.matmul(X_data,W_1), b_1)
   layer_1 = tf.nn.tanh(layer_1)


   W_O = tf.Variable(tf.random_uniform([hiddenneurons,1]))
   b_O = tf.Variable(tf.zeros([1]))
   output = tf.add(tf.matmul(layer_1,W_O), b_O)

xs = tf.placeholder("float")
ys = tf.placeholder("float")
output = neural_net_model(xs,3)

with tf.Session() as sessr:
  sessr.run(tf.global_variables_initializer()) 
  newsaver.restore(sessr, tf.train.latest_checkpoint('folder where .ckpt files are'))

  pred = sessr.run(output, feed_dict={xs:X_test})

At this point, if I type tf.trainable_variables(), I get the details of the four tensors W_1:0, W_O:0, b_O:0, b_1:0, plus four new ones Variable_0, Variable_1:0, Variable_2:0, Variable_3_0. This means that the data is tested on these new variables and does not give the desired result. I don't seem to be able to use the restored weights and biases W_1,W_O, b_1,b_O.

I KNOW that I am reinitialising the variables when I don't need to, and this is the problem, and I have read this post here in detail. I have also read this, and this and many others. If I remove the repitition of the model definition, 'output', or 'neural_net_model' becomes undefined and the code doesn't work. If I try to specify W_1 etc. in any other way, the code doesn't work.

halfer
  • 19,824
  • 17
  • 99
  • 186
alice
  • 11
  • 1

0 Answers0