您的位置:首页 > 理论基础 > 计算机网络

使用Tensorflow训练神经网络模型---自定义损失函数

2018-03-02 20:07 771 查看
最近正在入坑机器学习,前期以读代码为主。买了一本才云科技郑泽宇的书,叫做《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] fo
4000
r(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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐