去年买了几本关于张量流的书,今年看的时候发现样本代码里用的一些API已经过时了。看来维护一个更新的张量流教程还是有意义的。这是写这个系列的开始。

快餐教程系列希望尽可能降低门槛,少说话,讲透。

为了让大家一开始就看到美好的一幕,而不是停留在基础知识的长时间积累上,参考网上的一些教程,我们在开始直接展示一个用张量流实现MNIST手写识别的例子。然后慢慢说基础。

Tensorflow安装快速教程

由于Python是跨平台语言,所以在所有系统上安装张量流相对容易。后面再说GPU加速。

Tensorflow安装在Linux平台上

我们以Ubuntu版为例,先安装python3和pip3。Pip是python的包管理工具。

1sudo apt installpython3

2sudo apt installpython3-pip

张量流可以通过管道3安装:

1 ip3 installtensorflow-升级

MacOS安装tensorflow

建议自制安装python。

1brewinstall python3

安装python3后,通过pip3安装张量流。

1 ip3 installtensorflow-升级

张量流安装在Windows平台上

建议在Windows平台上通过Anaconda安装Tensorflow。

然后打开Anaconda提示符,输入:

1conda create-n tensorflow pip

2激活张量流

3pip安装-忽略-安装-升级tensorflow

这样就安装了张量流。

让我们快速举个例子来尝试一下:

1将张量流作为tf导入

2a = tf .常数

3b = tf .常数

4c = a * b

5sess = tf。会话

6print)

输出为2。

张量流,顾名思义,是由张量张量流组成的运算。

操作需要运行会话。如果打印,您将获得

1传感器,dtype=int32)

也就是说,这是一个乘法张量,需要通过Session.run来执行。

入门捷径:线性回归

我们先来看看最简单的机器学习模型,一个线性回归的例子。

线性回归的模型是矩阵乘法:

1tf .乘法

然后,我们调用张量流计算梯度下降函数TF。火车。梯度下降优化器实现优化。

让我们看看这个示例代码。只有三十多行,逻辑还是很清晰的。

这个例子来自丹尼尔在github上的作品:https://github.com/nlintz/TensorFlow-Tutorials,不是我的原作。

1将张量流作为tf导入

2将numpy导入为np

3trX = np.linspace

4 try = 2 * Trx+NP . random . randn* 0.33 #在线性值附近创建一些随机值

5X = tf.placeholder

6Y = tf.placeholder

7def型号:

8返回TF。多重 # x * w线性评估,非常简单

9w = tf。变量

10y_model = model

11cost = tf.square #以平方误差为优化目标

12train _ op = TF。train . gradientdeponentoptimizer。最小化#梯度下降优化

13#开始创建会话!

14带tf。会话作为会话:

15#需要先初始化全局变量,这是Tensorflow的要求

16tf . global _ variables _ initializer。运行

17对于范围内的I:

18for in :

19sess.run

20print)

我最终会得到一个接近2的值,比如我这次运行的值是1.9183811

手写识别在许多方面

线性回归是不够的,所以我们一步开始手写识别。

我们以深度学习三巨头之一Yann Lecun教授的MNIST数据为例。如上图所示,MNIST的数据是一个28x28的图像,并且标记了它的值应该是多少。

线性模型:逻辑回归

首先不考虑3721,我们用线性模型分类。

算上评论和空行加起来大概30行,就可以解决手写识别的难题了!看看代码:

1importtensorflow astf

2importnumpy asnp

3 front sensorflow . examples . tutorials . mnist importinput _ data

4定义重量:

5returntf。变量)

6defmodel:

7returntf.matmul #模型或矩阵乘法

8 NIST = input _ data . read _ data _ set

9trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels

10X = tf.placeholder

11Y = tf.placeholder

12w = init_weights

13py_x =型号

14成本= TF。reduce _ mean ) #计算错误

15 train _ op = TF . train . GradientDescentoptimizer。最小化#构造优化器

16predict_op = tf.argmax

17withtf。会议评估:

18tf . global _ variables _ initializer。运行

19 ori in range:

20forstart,end in,128),range+1,128)):

21 ess . run

22print ==

23 ess . run)

经过100轮训练,我们的准确率是92.36%。

无脑浅层神经网络

我们用最简单的线性模型,用经典的神经网络来实现这个功能。神经网络图如下图所示。

让我们构建一个隐藏层,使用最传统的sigmoid函数作为激活函数。它的核心逻辑是矩阵乘法,没什么技巧在里面。

1h = tf.nn.sigmoid)

2returntf.matmul

完整的代码如下,还有40多行,不长:

1importtensorflow astf

2importnumpy asnp

3 front sensorflow . examples . tutorials . mnist importinput _ data

4#所有连接随机生成权重

5定义重量:

6returntf。变量)

7defmodel:

8h = tf.nn.sigmoid)

9returntf.matmul

10 NIST = input _ data . read _ data _ set

11trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels

12X = tf.placeholder

13Y = tf.placeholder

14w_h = init_weights

15w_o = init_weights

16py_x =型号

17成本= TF。reduce _ mean ) #计算错误损失

18 train _ op = TF . train . GradientDescentoptimizer。最小化#构建优化器

19predict_op = tf.argmax

20withtf。会议评估:

21tf . global _ variables _ initializer。运行

22 fori inrange:

23 forstart,end in,128),range+1,128)):

24 sess.run

25 print =

26 sess.run)

第一轮操作,我这次准确率只有69.11%,第二次提高到82.29%。最终结果是95.41%,强于Logistic回归!

请注意,我们模型核心的两行代码完全是无脑的,连接成一个隐藏的层,里面没有任何技术。完全取决于神经网络的建模能力。

深度学习时代的方案——ReLU与辍学秀头像

上次技术含量有点低。现在是深度学习的时候,我们取得了很大的进步。比如我们知道sigmoid函数应该用ReLU函数代替。

我们也知道我们将成为一名辍学生。所以我们还是隐藏层,写一个更现代的模型:

1X = TF . nn . drop

2h = tf.nn.relu)

3h = tf.nn.dropout

4h2 = tf.nn.relu

5h2 = tf.nn.dropout

6returntf.matmul

除了ReLU和drop,我们还是只有一个隐藏层,表达能力没有大的提升。不是深度学习。

1将张量流作为tf导入

2将numpy导入为np

3 from tensorflow . examples . tutorials . mnist import input _ data

4def init_weights:

5返回tf。变量)

6def模型:

7X = tf.nn .压差

8h = tf.nn.relu)

9h = tf.nn.dropout

10h2 = tf.nn.relu

11 H2 = TF . nn . drop

12return tf.matmul

13 NIST = input _ data . read _ data _ set

14trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels

15X = tf.placeholder

16Y = tf.placeholder

17w _ h = init _ weight

18w _ H2 = init _ weight

19w_o = init_weights

20p _ keep _ input = TF . placeholder

21p _ keep _ hidden = TF . placeholder

22py_x = model

23 cost = TF . reduce _ mean)

24 train _ op = TF . train . rmsproptimizer。最小化

25predict_op = tf.argmax

26带tf。会话作为会话:

27#你需要初始化所有变量

28tf . global _ variables _ initializer。运行

29对于I范围:

30开始,结束于,128),范围+1,128)):

33ss . run

33print ==

34 ess . run)

从结果可以看出,第二次准确率在96%以上。此后一直徘徊在98.4%左右。只有ReLU和from将准确率从95%提高到98%以上。

卷积神经网络的出现

CNN,深度学习的真正武器,是卷积神经网络出来的。与之前的无脑模型相比,这个模型确实更加复杂。它涉及卷积层和汇集层。这个需要后面详细说。

1将张量流作为tf导入

2将numpy导入为np

3 from tensorflow . examples . tutorials . mnist import input _ data

4批处理大小= 128

5test_size = 256

6def init_weights:

7返回tf。变量)

8def型号:

9l1a = tf.nn.relu

10s三叉戟=,填充='SAME '))

11l1 = tf.nn.max_pool

12叉=,填充= '相同')

13l 1 = TF . nn . drop

14l 2a = TF . nn . relu

15步=,填充='SAME '))

16l2 = tf.nn.max_pool

17步=,填充= '相同')

18 L2 = TF . nn . drop

19l3a = TF . nn . relu

20步=,填充='SAME '))

21 l3 = tf.nn.max_pool

22个字符=,填充= '相同')

23l 3 = TF . resform。as_list]) #整形为

24 L3 = TF . nn . drop

25 l4 = tf.nn.relu)

26l 4 = TF . nn . drop

27pyx = tf.matmul

28返回pyx

29 NIST = input _ data . read _ data _ set

30trX,trY,teX,teY = mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels

31trX = trX.reshape # 28x28x1 input img31trX = TRx . resform # 28x28x1输入img

32teX = teX.reshape # 28x28x1 input img32teX = TEx . resform # 28x28x1输入img

33X = tf.placeholder

34Y = tf.placeholder

35w = init_weights # 3x3x1 conv,32路输出

36w2 = init_weights # 3x3x32 conv,64路输出

37w3 = init_weights # 3x3x32 conv,128个输出

38w4 = init_weights # FC 128 * 4 * 4输入,625输出

39w_o = init_weights # FC 625输入,10输出

40p _ keep _ conv = TF . placeholder

41p _ keep _ hidden = TF . placeholder

42py_x = model

43 cost = TF . reduce _ mean)

44 train _ op = TF . train . rmsproptimizer。最小化

45predict_op = tf.argmax

46带tf。会话作为会话:

你需要初始化所有的变量

48tf . global _ variables _ initializer。运行

49对于I范围:

50training_batch = ,batch_size),

51范围+1,批次大小))

52开始、结束于培训_批次:

53 ess . run

55测试_指数= np.arange) #获取测试批次

56np . random . shuffle

57 test _ indexs = test _ indexs

58print ==

59sess.run)

我们来看看这次的运营数据:

10 0.95703125

21 0.9921875

32 0.9921875

43 0.98046875

54 0.97265625

65 0.98828125

76 0.99609375

在第六轮中,它获得了99.6%的高分,与ReLU和Dropout隐藏层的98.4%的神经网络相比有了很大的提高。因为越到后面难度越大。

第16轮,我跑出了100%的准确率:

17 0.99609375

28 0.99609375

39 0.98828125

410 0.98828125

511 0.9921875

612 0.98046875

713 0.99609375

814 0.9921875

915 0.99609375

1016 1.0

综上所述,借助Tensorflow和机器学习工具,我们只有几十行代码,解决了这个级别的手写识别问题,准确率可以达到这个级别。

作者博客链接:

https://blog.csdn.net/lusing/article/details/79965160

-结束-

有自己的个性化机器人!

1.《安装tensorflow 连载 | Tensorflow教程一:30行代码搞定手写识别》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《安装tensorflow 连载 | Tensorflow教程一:30行代码搞定手写识别》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/junshi/1690658.html