如何恢复Tensorflow中的权重和偏差?

时间:2018-07-06 13:37:53

标签: tensorflow

我正在使用Tensorflow和Python通过以下方式定义和训练NN:

# 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')     

在这一点上,如果我使用tf.trainable_variables()输出可训练变量,则会得到四个形状符合W_1:0,W_O:0,b_1:0,b_O:0的预期形状的变量。

我希望能够有一个不同的文件来还原模型,然后使用与保存时相同的权重和偏差,以允许我运行各种测试数据。

我在恢复模型和说服其重用过去的权重和偏见方面遇到了麻烦。我的还原代码如下:

# 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})

在这一点上,如果我输入tf.trainable_variables(),我将得到四个张量W_1:0,W_O:0,b_O:0,b_1:0以及四个新的张量Variable_0,Variable_1:0,变量_2:0,变量_3_0。这意味着将在这些新变量上测试数据,而不会给出期望的结果。我似乎无法使用恢复的权重和偏倚W_1,W_O,b_1,b_O。

我知道我在不需要时会重新初始化变量,这就是问题所在,我已经详细阅读了这篇文章here。我还阅读了thisthis等。如果删除模型定义的重新定义,则“输出”或“ neural_net_model”将变得未定义,并且代码无法正常工作。如果我尝试以其他任何方式指定W_1等,则该代码将无效。

0 个答案:

没有答案