试写 tensorflow 的 helloword

直接上程序哈

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)

猜你喜欢

转载自blog.csdn.net/dongfeng10086/article/details/84346018