使用Tensorflow训练神经网络模型

最近正在入坑机器学习,前期以读代码为主。买了一本才云科技郑泽宇的书,叫做《Tensorflow,实战Google深度学习框架》,觉得很适合入门的小菜鸟,拿出来跟大家分享下。

下面是第一个完整的训练神经网络模型的代码,里面综合了作者和我在网上查到的其他人关于代码的解读。整理之后如下:

 1 #-*-coding:UTF-8-*-
 2 import tensorflow as tf
 3 #通过numpy工具包生成模拟数据集
 4 from numpy.random import RandomState
 5 
 6 #BATCH_SIZE这是定义的一个数量,即一次训练模型,投入的样例数,按理说应该是一次投入所有训练数据的  
 7 #但是实际操作中一次投入太多数据,会导致电脑死机,因此只好对投入样例数,进行限制
 8 batch_size = 8
 9 
10 #定义神经网络的参数:权重w ,stddev=1代表标准差=1,seed随机数种子,设置后每次产生的数字都相同 
11 w1= tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
12 w2= tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
13 
14 #我们使用 tf.placeholder() 创建占位符(占位符并没有初始值,它只会分配必要的内存),
15 #在 session.run()过程中再投递数据,可以使用 feed_dict 馈送数据。
16 #在shape的一个维度上使用none,不能确定值的形状时,用None表示
17 x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
18 y_= tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
19 
20 #定义前向传播过程
21 a = tf.matmul(x, w1)
22 y = tf.matmul(a, w2)
23 #定义损失函数(交叉熵)
24 #tf.clip_by_value(A, min, max):输入一个张量A,把A中的每一个元素的值都压缩在min和max之间。
25 #小于min的让它等于min,大于max的元素的值等于max。
26 cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))) 
27 #反向传播算法tf.train.AdamOptimizer实现了Adam算法的优化器(随机梯度下降算法的扩展式) 
28 train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
29 
30 #生成模拟数据  
31 #randomState 函数中数字1,相当于一个seed种子,每次产生的随机数都是相同的  
32 rdm=RandomState(1)  
33 #产生一个128行×2列的随机矩阵  
34 X=rdm.rand(128,2)  
35 #产生一个布尔型结果矩阵128×1 ,定义规则来给出样本的标签。在这里所有x1+x2<1的样例都被视为正样本
36 #在这里1代表正样本,0代表负样本,大部分的分类问题的神经网络都采用0和1的表示方法 
37 Y=[[int(x0+x1)<1] for(x0,x1)in X]
38 
39 #创建一个会话来运行Tensorflow程序,反复运行反向传播  
40 #tf中运行必须放在session对象中,且运行过后,要关闭session
41 with tf.Session()as sess:  
42     #初始化变量,也就是上面的Variable变量  
43     init_op=tf.initialize_all_variables()  
44     sess.run(init_op)  
45     # 输出目前(未经训练)的参数取值  
46     #这里为何还要使用sess.run(w1)来进行操作?  
47     #因为此时w1还是个变量,是个对象,直接打印出来是对象的地址  
48     print "w1:
",sess.run(w1)  
49     print "w2:
",sess.run(w2)  
50     print "
" 
51   
52     # 训练模型。
53     #设定训练的轮数
54     STEPS = 5000
55     for i in range(STEPS):
56     #每次选取batch_size个样本进行训练
57         start = (i*batch_size) % 128
58         end = (i*batch_size) % 128 + batch_size
59     #通过选取的样本训练神经网络并更新参数
60         sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
61     #每隔一段时间计算在所有数据上的交叉熵并输出
62         if i % 1000 == 0:
63             total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y})
64             print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy))
65     
66     # 输出训练后的参数取值。
67     print "
"
68     print "w1:", sess.run(w1)
69     print "w2:", sess.run(w2)  
原文地址:https://www.cnblogs.com/Superorange/p/8133819.html