Neural network 从NN恢复TensorFlow无效

Neural network 从NN恢复TensorFlow无效,neural-network,tensorflow,Neural Network,Tensorflow,我正在努力恢复tensorflow中NN的值。我试着按照网络上的示例进行操作,下面是我的代码: import tensorflow as tf import numpy as np import math, random import matplotlib.pyplot as plt np.random.seed(1000) # for repro function_to_learn = lambda x: np.sin(x) + 0.1*np.random.randn(*x.shape)

我正在努力恢复tensorflow中NN的值。我试着按照网络上的示例进行操作,下面是我的代码:

import tensorflow as tf
import numpy as np
import math, random
import matplotlib.pyplot as plt


np.random.seed(1000) # for repro
function_to_learn = lambda x: np.sin(x) + 0.1*np.random.randn(*x.shape)

NUM_HIDDEN_NODES = 2 
NUM_EXAMPLES = 1000 
TRAIN_SPLIT = .8
MINI_BATCH_SIZE = 100 
NUM_EPOCHS = 500  


all_x = np.float32(np.random.uniform(-2*math.pi, 2*math.pi, (1, NUM_EXAMPLES))).T
np.random.shuffle(all_x)
train_size = int(NUM_EXAMPLES*TRAIN_SPLIT)
trainx = all_x[:train_size]
validx = all_x[train_size:]
trainy = function_to_learn(trainx)
validy = function_to_learn(validx)



plt.figure()
plt.scatter(trainx, trainy, c='green', label='train')
plt.scatter(validx, validy, c='red', label='validation')
plt.legend()


X = tf.placeholder(tf.float32, [None, 1], name="X")
Y = tf.placeholder(tf.float32, [None, 1], name="Y")


w_h = tf.Variable(tf.zeros([1, NUM_HIDDEN_NODES],name="w_h"))
b_h = tf.Variable(tf.zeros([1, NUM_HIDDEN_NODES],name="b_h"))
w_o = tf.Variable(tf.zeros([NUM_HIDDEN_NODES,1],name="w_o"))
b_o = tf.Variable(tf.zeros([1, 1],name="b_o"))



def init_weights(shape, init_method='xavier', xavier_params = (None, None)):
    if init_method == 'zeros':
        return tf.Variable(tf.zeros(shape, dtype=tf.float32))
    elif init_method == 'uniform':
        return tf.Variable(tf.random_normal(shape, stddev=0.01, dtype=tf.float32))



def model(X, num_hidden = NUM_HIDDEN_NODES):
    w_h = init_weights([1, num_hidden], 'uniform' )
    b_h = init_weights([1, num_hidden], 'zeros')
    h = tf.nn.sigmoid(tf.matmul(X, w_h) + b_h)

    w_o = init_weights([num_hidden, 1], 'xavier', xavier_params=(num_hidden, 1))
    b_o = init_weights([1, 1], 'zeros')
    return tf.matmul(h, w_o) + b_o



yhat = model(X, NUM_HIDDEN_NODES)

train_op = tf.train.AdamOptimizer().minimize(tf.nn.l2_loss(yhat - Y))


plt.figure()


with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())

    for v in tf.all_variables():
        print v.name



saver = tf.train.Saver()

errors = []

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    for i in range(NUM_EPOCHS):
        for start, end in zip(range(0, len(trainx), MINI_BATCH_SIZE), range(MINI_BATCH_SIZE, len(trainx), MINI_BATCH_SIZE)):
            sess.run(train_op, feed_dict={X: trainx[start:end], Y: trainy[start:end]})

        mse = sess.run(tf.nn.l2_loss(yhat - validy),  feed_dict={X:validx})
        errors.append(mse)
        if i%100 == 0:
            print "epoch %d, validation MSE %g" % (i, mse)
            print sess.run(w_h)
            saver.save(sess,"/Python/tensorflow/res/save_net.ckpt", global_step = i)



    print " ******* AFTR *******"
    for v in tf.all_variables():
        print v.name
    plt.plot(errors)
    plt.xlabel('#epochs')
    plt.ylabel('MSE')
*******要获取还原值,我尝试了以下操作:**

import tensorflow as tf
import numpy as np
import math, random
import matplotlib.pyplot as plt


NUM_HIDDEN_NODES = 2 



#SECOND PART TO GET THE STORED VALUES

w_h = tf.Variable(np.arange(NUM_HIDDEN_NODES).reshape(1, NUM_HIDDEN_NODES), dtype=tf.float32, name='w_h')
b_h = tf.Variable(np.arange(NUM_HIDDEN_NODES).reshape(1, NUM_HIDDEN_NODES), dtype=tf.float32, name='b_h')

w_o = tf.Variable(np.arange(NUM_HIDDEN_NODES).reshape(NUM_HIDDEN_NODES, 1), dtype=tf.float32, name='w_o')
b_o = tf.Variable(np.arange(1).reshape(1, 1), dtype=tf.float32, name='b_o')



saver = tf.train.Saver()
with tf.Session() as sess:
    ckpt = tf.train.get_checkpoint_state("/Python/tensorflow/res/")
    if ckpt and ckpt.model_checkpoint_path:
        # Restores from checkpoint
        saver.restore(sess, "/Python/tensorflow/res/save_net.ckpt-400")
        print "Model loaded"
    else:
        print "No checkpoint file found"

    print("weights:", sess.run(w_h))
    print("biases:", sess.run(b_h))
非常感谢你的帮助,我几乎要放弃了


再次非常感谢

您要从中恢复变量的检查点文件似乎与现有代码的当前变量/形状不同

保存:(如果用上述定义中的常量替换)

恢复:

w_h = tf.Variable(np.arange(10).reshape(1, 10), dtype=tf.float32, name='w_h')
b_h = tf.Variable(np.arange(10).reshape(1, 10), dtype=tf.float32, name='b_h')

w_o = tf.Variable(np.arange(10).reshape(10, 1), dtype=tf.float32, name='w_o')
b_o = tf.Variable(np.arange(1).reshape(1, 1), dtype=tf.float32, name='b_o')

为了防止这些类型的问题,请尝试使用函数进行训练和推理,以便所有代码都使用相同的变量和常量。

似乎要从中恢复变量的检查点文件与现有代码的当前变量/形状不同

保存:(如果用上述定义中的常量替换)

恢复:

w_h = tf.Variable(np.arange(10).reshape(1, 10), dtype=tf.float32, name='w_h')
b_h = tf.Variable(np.arange(10).reshape(1, 10), dtype=tf.float32, name='b_h')

w_o = tf.Variable(np.arange(10).reshape(10, 1), dtype=tf.float32, name='w_o')
b_o = tf.Variable(np.arange(1).reshape(1, 1), dtype=tf.float32, name='b_o')

为了防止这些类型的问题,请尝试使用函数进行训练和推理,以便所有代码都使用相同的变量和常量。

您正在创建两组权重,一组是全局权重,另一组是在调用
init_weights
时创建的。第二组变量正在进行优化,但两组变量都已保存

在您的eval代码中,您只创建了一次这组变量,因此您的恢复只恢复第一组变量,而在初始化之后,第一组变量没有被修改


解决方案是将模型创建代码分解出来,以便在培训和评估期间创建完全相同的图形,或者使用它在恢复期间重新创建图形结构。

您正在创建两组权重,一组是全局权重,另一组是在调用
init_weights
时创建的。第二组变量正在进行优化,但两组变量都已保存

在您的eval代码中,您只创建了一次这组变量,因此您的恢复只恢复第一组变量,而在初始化之后,第一组变量没有被修改

解决方案是,要么剔除模型创建代码,以便在培训和评估期间创建完全相同的图形,要么使用它在恢复期间重新创建图形结构