直接上程序哈
import tensorflow as tf
import numpy as np
#import pdb
'''
先说明下,这段代码主要实现的是希望程序能够自动学习 y = x*x - 0.5 式子
'''
graph = tf.Graph()
with graph.as_default():
#pdb.set_trace()
#定义了一个输入变量 xs 和 ys(暂且称为标签)
with tf.name_scope('inputs'):
xs = tf.placeholder(tf.float32, shape=[None, 1])
ys = tf.placeholder(tf.float32, shape=[None, 1])
#用到了两个线性方程 W*x + b ,我们分别设置一下,记着一定要用 tf.Variable 进行声明,这样可以使得程序再训练的时候使用的是之前的值,而不是重新赋值
with tf.name_scope('weights'):
weight1 = tf.Variable(tf.random_normal([1, 20]), name='weight1', trainable=True)
weight2 = tf.Variable(tf.random_normal([20, 1]), name='weight2', trainable=True)
with tf.name_scope('biases'):
biase1 = tf.Variable(tf.zeros([1, 20]) + 0.1, name='biase1', trainable=True)
biase2 = tf.Variable(tf.zeros([1, 1]) + 0.2, name='biase2', trainable=True)
#定义了损失函数
with tf.name_scope('loss'):
Wx_plus_b1 = tf.matmul(xs, weight1) + biase1
#这里我们用到了一个激活函数,如果是两个纯一次函数不能收敛,感兴趣可以动手测试下
Wx_plus_b1 = tf.nn.relu(Wx_plus_b1)
Wx_plus_b2 = tf.matmul(Wx_plus_b1, weight2) + biase2
#当时是在这里使用了激活函数,程序一致不能收敛,找了半天原因,被逼的差点用蹩脚的英文在 stackouverflow 上发问,汗
#原因就是梯度降为了0(relu,梯度消失),这个可以打印出来看,如果换成其他的导数不为0 的就没有问题,比如说 tf.nn.leaky_relu
#Wx_plus_b2 = tf.nn.relu(Wx_plus_b2)
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-Wx_plus_b2), 1))
tf.summary.scalar('loss', loss)
with tf.name_scope('optimizer'):
#train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
opt = tf.train.GradientDescentOptimizer(0.1)
#用 tf.trainable_variables 指定需要求梯度的参数,trainable=True 的,例如 weight1,biase1, etc
params = tf.trainable_variables()
#用 compute_gradients、apply_gradients 主要是为了观察训练过程中梯度的变化
grads_and_vars = opt.compute_gradients(loss, params)
train_step = opt.apply_gradients(grads_and_vars)
merged = tf.summary.merge_all()
x_data = np.linspace(-1, 1, 300)[:,np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise
with tf.Session(graph=graph) as sess:
saver = tf.train.Saver()
writer = tf.summary.FileWriter('./log', sess.graph)
sess.run(tf.global_variables_initializer())
for i in range(1000):
_, summary = sess.run([train_step, merged], feed_dict={xs:x_data, ys:y_data})
writer.add_summary(summary,i)
if i%50 == 0:
print(sess.run(loss, feed_dict={xs:x_data, ys:y_data}))
#打印梯度,grads_and_vars是一个list (gradient, variable),第一个是梯队,第二个是对应的变量值
#if i == 50:
# print(sess.run(grads_and_vars, feed_dict={xs:x_data, ys:y_data}))
#保存模型
saver.save(sess, './log/model.ckpt')
#测试模型
#saver.restore(sess=sess, save_path='log/model.ckpt')
#pre = sess.run(Wx_plus_b2, feed_dict={xs:np.array([[0.2],[0.3],[0.4],[0.5]])})
#print(pre)
#print(np.square([[0.2],[0.3],[0.4],[0.5]])-0.5)