最近正在入坑机器学习,前期以读代码为主。买了一本才云科技郑泽宇的书,叫做《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:\n",sess.run(w1) 49 print "w2:\n",sess.run(w2) 50 print "\n" 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 "\n" 68 print "w1:", sess.run(w1) 69 print "w2:", sess.run(w2)