简单的tensorflow:2_两层网络and more

来源:互联网 发布:移动数据不可用 编辑:程序博客网 时间:2024/06/12 22:28

源码来自:
https://github.com/nlintz/TensorFlow-Tutorials
感谢作者无私提供

初学者可以先看懂代码,然后一定要独立实现一次。



已经看过上一篇文章简单的tensorflow:1_logistic regression
的同学,会发现这次的代码仅仅改动了一点点,就是model函数由一层变成了两层。其他部分的讲解见上一篇文章。

def model(X, w_1, w_2):   h = tf.nn.sigmoid(tf.matmul(X, w_1))   return tf.matmul(h, w_2)

来看看网络的变化,这次我们需要w_1、w_2两个参数,因为有两层网络,每个w控制一层。输入层输入X,进入到第一层隐藏层,进行了一个X与w_1的矩阵乘法,然后套了一个sigmoid激活函数,得到隐层输出h,然后h作为下一层的输入与w_2进行矩阵乘法,从而得到模型的输出。

最后看这个新的网络的训练情况:
0 0.5943
1 0.8026
2 0.8536
3 0.8762
4 0.8893
5 0.8948
6 0.8984
7 0.9016
8 0.9052
9 0.9075
10 0.9089
11 0.9111
12 0.9129
13 0.914
14 0.9152
15 0.916
16 0.9172
17 0.9183
18 0.9194
19 0.9206
20 0.9217
21 0.9222
22 0.9228
23 0.9236
24 0.9248
25 0.925
26 0.9254
27 0.9263
28 0.9267
29 0.9275
30 0.9277
31 0.9287
32 0.929
33 0.9295
34 0.9305
35 0.9313
36 0.9319
37 0.9326
38 0.9341
39 0.9351
40 0.9357
41 0.9363
42 0.9372
43 0.9377
44 0.9387
45 0.939
46 0.9398
47 0.9401
48 0.941
49 0.9412
50 0.9423
51 0.9427
52 0.9436
53 0.9438
54 0.9443
55 0.9448
56 0.945
57 0.9455
58 0.9457
59 0.9464
60 0.9472
61 0.9477
62 0.9482
63 0.9484
64 0.9489
65 0.949
66 0.9495
67 0.9504
68 0.9507
69 0.951
70 0.9512
71 0.9514
72 0.9517
73 0.9526
74 0.9533
75 0.9538
76 0.9541
77 0.9545
78 0.9549
79 0.9553
80 0.9557
81 0.9559
82 0.9564
83 0.9568
84 0.9569
85 0.9572
86 0.9574
87 0.9578
88 0.9579
89 0.9581
90 0.9585
91 0.9588
92 0.9594
93 0.9595
94 0.9594
95 0.9599
96 0.9602
97 0.9603
98 0.9609
99 0.9613

与上一篇文章中单层网络最后的92.35相比,仅仅多加了一层网络,效果就大幅提升到了0.96以上,是不是很神奇,是不是对更复杂的网络更加期待了呢?敬请关注我的简单的tensorflow系列后续文章。

就在这篇里更新吧,分割线


上一份代码仅仅加深了一层网络就有可喜的提升,这一次,再复杂一点点。

初学者还是先看,然后再独立实现。


仍然只是模型发生了一点变化

def model(X, w_1, w_2, w_3, p_keep_input, p_keep_hidden):   X = tf.nn.dropout(X, keep_prob=p_keep_input)   h1 = tf.nn.relu(tf.matmul(X, w_1))   h1 = tf.nn.dropout(h1, keep_prob=p_keep_hidden)   h2 = tf.nn.relu(tf.matmul(h1, w_2))   h2 = tf.nn.dropout(h2, keep_prob=p_keep_hidden)   return tf.matmul(h2, w_3)

可以看出,这次又多了一个w参数,也就是又多加了一层网络,并且多了一个用于防止过拟合而存在的dropout。dropout是根据你设置的参数随机保留相应数量的神经元,使得每次训练并不激活全部神经元,从而防止过拟合。

运行效果如下:
0.9079
0.9499
0.9622
0.9669
0.9704
0.9731
0.9728
0.9755
0.9768
0.9762
0.9759
0.9769
0.9773
0.9775
0.9771
0.9793
0.9792
0.9798
0.9798
0.9796
0.9795
0.98
0.9803
0.9798
0.9808
0.9803
0.9805
0.9806
0.9804
0.9802
0.9807
0.9818
0.9803
0.9815
0.9808
0.9811
0.9823
0.9815
0.9809
0.9804
0.982
0.982
0.9808
0.9819
0.9815
0.9816
0.9823
0.9823
0.9818
0.9819
0.9818
0.9809
0.9823
0.9817
0.9802
0.9821
0.983
0.983
0.9819
0.9822
0.9834
0.9811
0.9816
0.9813
0.9807
0.9828
0.9819
0.9821
0.9822
0.9834
0.9811
0.9826
0.9828
0.9831
0.9819
0.9818
0.9821
0.9806
0.9817
0.9828
0.9828
0.9826
0.9826
0.9825
0.9835
0.9826
0.9822
0.982
0.9821
0.9822
0.9834
0.9825
0.9831
0.9825
0.9834
0.9828
0.9824
0.9834
0.983
0.9833
比上一份代码加深一层网络,增加了dropout,准确率又上升了大约2%,已经达到了98%以上,这么简单的一个模型,就可以做到轻松识别mnist数据集的手写数据。

原创粉丝点击