JB的Python之旅-人工智能篇-TensorFlow基础概念

前言

犹记得一周前,对图形验证码有点想法,自信满满的去作破解的工做,可是实际被各类打脸,不接触这行,真不懂里面的套路;
python

关于图形验证码这块,无论后面行仍是不行,都会写一篇出来,当作经验总结也好,但总不能停留在这里,由于后面还有滑动验证码,点触验证码等着去学习;

开篇

当今在互联网混,不随口说出深度学习,人工智能,机器学习,神经网络等词,人家都怀疑是个假的互联网人了,但不知道是否有同窗跟JB同样,傻傻分不清?
git

犹记得,自从阿法狗那波,业界彷佛对机器学习推到一个新的高度??
原本是不太想沾这趟水的,毕竟知道本身不是那个料,可是最近被验证码折腾的够累的,而图形验证码的确是深度学习的一个点,因而乎仍是想写下,了解下,至少对概念有点印象,也不虚此行了;
小白用户,若是对这块有不对的地方,请各位同窗及时提出哈,谢谢啦~

扫盲

深度学习,人工智能,机器学习,神经网络,这4个词出现的比较多,可是它们之间有什么关系呢?尤为,机器学习跟深度学习区别在哪里??github

人工智能,英文Artificial Intelligence,简称AI,那人工智能的目的是什么?
网上一大堆,好听的叫解放/发展生产力,解放人类,总的来讲是提升效率
但更好理解就是:偷懒!
算法

好比当你说一句话时,机器可以识别成文字,并理解你话的意思,进行分析和对话等。
数组

人工智能的核心在于智能两字,那智能怎么来的?主要归功于一种实现人工智能的方法--机器学习
网络

那目前人工智能的应用场景有哪些:
OCR、语音技术(好比Siri)、大数据应用等~session

机器学习:一种实现人工智能的方法
机器学习最基本的作法,是使用算法来解析数据、从中学习,而后对事件作出决策和预测。
须要用大量的数据来“训练”,经过各类算法从数据中学习如何完成任务。dom

举个例子,当浏览网上商城时,常常会出现商品推荐的信息。
这是商城根据往期的购物记录和冗长的收藏清单,识别出这其中哪些是真正感兴趣,而且愿意购买的产品。
这样的决策模型,能够帮助商城为客户提供建议并鼓励产品消费。机器学习

【机器学习有三类】:异步

第一类是无监督学习,指的是从信息出发自动寻找规律,并将其分红各类类别,有时也称"聚类问题"。

第二类是监督学习,监督学习指的是给历史一个标签,运用模型预测结果。
若有一个水果,咱们根据水果的形状和颜色去判断究竟是香蕉仍是苹果,这就是一个监督学习的例子。

最后一类为强化学习,是指能够用来支持人们去作决策和规划的一个学习方式,它是对人的一些动做、行为产生奖励的回馈机制,经过这个回馈机制促进学习,这与人类的学习类似,因此强化学习是目前研究的重要方向之一。

深度学习:一种实现机器学习的技术
深度学习是机器学习的一个子领域,是利用深度的神经网络,将模型处理得更为复杂,从而使模型对数据的理解更加深刻;

深度学习的核心是,咱们如今有足够快的计算机和足够的数据来实际训练大型神经网络

三者的区别和联系
机器学习是一种实现人工智能的方法,深度学习是一种实现机器学习的技术。

按照JB的理解,深度学习最终可能会渗透在其余全部机器学习算法;

固然,并非说深度学习就是万能的,也并不必定比机器学习牛逼,要根据场景来区别;

人工神经网络:一种机器学习的算法
以“中止(Stop)标志牌”为例,将一个中止标志牌图像的全部元素都打碎,而后用神经元进行“检查”:八边形的外形、消防车般的红颜色、鲜明突出的字母、交通标志的典型尺寸和静止不动运动特性等等。神经网络的任务就是给出结论,它究竟是不是一个中止标志牌。神经网络会根据全部权重,给出一个通过深思熟虑的猜想——“几率向量”。

神经网络是须要调制、训练的,否则会很容易出错的~

ok,讲到这里,感受对这块信息已经有所了解~至少知道这些是什么东西了;
简单总结下:

机器学习是一种实现人工智能的方法,深度学习是一种实现机器学习的技术,神经网络是一种实现机器学习的算法

TensorFlow 简介

TensorFlow是Google在2015年11月份开源的人工智能系统Github项目地址,该系统能够被用于语音识别、图片识别等多个领域。

官网上对TensorFlow的介绍是,
一个使用数据流图技术来进行数值计算的开源软件库。

  • 数据流图中的节点,表明数值运算;
  • 节点节点之间的边,表明多维数据(tensors)之间的某种联系。
  • 能够在多种设备(含有CPU或GPU)上经过简单的API调用来使用该系统的功能。

TensorFlow是由Google Brain团队的研发人员负责的项目。

什么是数据流图
数据流图是描述有向图中的数值计算过程。有向图中的节点一般表明数学运算,但也能够表示数据的输入、输出和读写等操做;有向图中的边表示节点之间的某种联系,它负责传输多维数据(Tensors)。

节点能够被分配到多个计算设备上,能够异步和并行地执行操做。由于是有向图,因此只有等到以前的入度节点们的计算状态完成后,当前节点才能执行操做。

TensorFlow的特性

  • 灵活性,TensorFlow不是一个严格的神经网络工具包,只要你可使用数据流图来描述你的计算过程,你可使用TensorFlow作任何事情。你还能够方便地根据须要来构建数据流图,用简单的Python语言来实现高层次的功能。
  • 可移植性,TensorFlow能够在任意具有CPU或者GPU的设备上运行,你能够专一于实现你的想法,而不用去考虑硬件环境问题,你甚至能够利用Docker技术来实现相关的云服务。
  • 提升开发效率,TensorFlow能够提高你所研究的东西产品化的效率,而且能够方便与同行们共享代码- 支持语言选项,目前TensorFlow支持Python和C++语言。
  • 充分利用硬件资源,最大化计算性能

TensorFlow安装

找了不少方式,最终无奈放弃,由于都不可行,依赖的东西太多了,最后JB选择了用pycharm来安装TensorFlow;

pycharm是python 的IDE软件,安装库起来比较方便,并且写代码也不错;

打开pycharm,在菜单栏里flie-settings,直接搜索project inter,选择你用的编译器,直接点击+:

输入tensorflow,install package,而后就是等待漫长的安装过程了;

固然,喜欢高难度的同窗,能够看github的官网介绍,祝你好运~
https://github.com/jikexueyuanwiki/tensorflow-zh/blob/master/SOURCE/get_started/os_setup.md

验证
直接import tensorflow,运行试试看有没有问题便可;若是有问题,会直接报错的~

第一个例子

官网有个例子,直接拿来用了:

import tensorflow as tf

hello = tf.constant("Hello,TensorFlow")
#建立了图,里面放入hello,TensorFlow
sess = tf.Session()
#定义了一个会话
print(sess.run(hello))
#执行图计算

a = tf.constant(10)
b = tf.constant(32)
#建立了图,里面放两个节点,两个Constant()ops
print(sess.run(a+b))
#执行图计算,此处是相加
复制代码

运行结果:

2018-06-14 18:48:55.967672: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
b'Hello,TensorFlow'
42
复制代码

上面第一行仍是红色的,虽然不影响结果输出,可是看着不爽啊;
怎么作?直接屏蔽就行了~

import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
复制代码

import os,加上上面那句便可;不懂什么意思?来来来~

os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # 这是默认的显示等级,显示全部信息    
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error     
os.environ["TF_CPP_MIN_LOG_LEVEL"]='3' # 只显示 Error    
复制代码

看了上面的例子,看不出特别的,先来了解下基础知识吧~

基本使用

须要理解在TensorFlow中,是如何:

  • 将计算流程表示成图;
  • 经过Sessions来执行图计算;
  • 将数据表示为tensors;
  • 使用Variables来保持状态信息;
  • 分别使用feeds和fetches来填充数据和抓取任意的操做结果;

TensorFlow的基础概念

  • 图(Graph):用来表示计算任务,也就咱们要作的一些操做。
  • 会话(Session):创建会话,此时会生成一张空图;在会话中添加节点和边,造成一张图,一个会话能够有多个图,经过执行这些图获得结果。若是把每一个图看作一个车床,那会话就是一个车间,里面有若干个车床,用来把数据生产成结果。
  • Tensor:用来表示数据,是咱们的原料。
  • 变量(Variable):用来记录一些数据和状态,是咱们的容器。
  • feed和fetch:能够为任意的操做(arbitrary operation) 赋值或者从其中获取数据。至关于一些铲子,能够操做数据。

形象的比喻是:把会话看作车间,图看作车床,里面用Tensor作原料,变量作容器,feed和fetch作铲子,把数据加工成咱们的结果。

图计算
TensorFlow程序中图的建立相似于一个 [施工阶段],
而在 [执行阶段] 则利用一个session来执行图中的节点。
很常见的状况是,在 [施工阶段] 建立一个图来表示和训练神经网络,而在 [执行阶段] 在图中重复执行一系列的训练操做。

建立图和运行图

第一个例子那有说明图是怎么建立的,这里再举例说明下:

matrix1 = tf.constant([[3.,3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1,matrix2)
#建立一个矩阵乘法
#默认的图,有3个节点,两个constant和一个matmul
sess = tf.Session()
#定义一个会话
result = sess.run(product)
#运算乘法,获得结果
print(result)
sess.close()
#关闭会话
复制代码

若是须要使用GPU,则以下处理:

with tf.Session() as sess:
    with tf.device("/cpu:0"):
        matrix1 = tf.constant([[3,3]])
        #这是一行2列
        matrix2 = tf.constant([[2],[2]])
        #这个是两行1列
        product = tf.matmul(matrix1,matrix2)
        #建立一个矩阵乘法
        #默认的图,有3个节点,两个constant和一个matmul
        sess = tf.Session()
        #定义一个会话
        result = sess.run(product)
        #运算乘法,获得结果
        print(result)
        sess.close()
        #关闭会话
复制代码

device中的各个字符串含义以下:

  • "/cpu:0": 你机器的CPU;
  • "/gpu:0": 你机器的第一个GPU;
  • "/gpu:1": 你机器的第二个GPU;

常量
tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False),value为值,dtype类型,shape为张量形状,name名称、verify_shape默认False,这些项可选。做用建立一个常量。

a = tf.constant(2, name="a") # print(a) = 2
b = tf.constant(2.0, dtype=tf.float32, shape=[2,2], name="b") # 2x2矩阵,值为2
c = tf.constant([[1, 2], [3, 4]], name="c") # 2x2矩阵,值1,2,3,4
复制代码

是否是懵逼了?没事,留个大概影响就行了~

第二个例子--建立变量

num = tf.Variable(0,name = "count")
#建立一个变量num
new_value = tf.add(num,10)
#建立一个加法操做,把当前的数字+10
op = tf.assign(num,new_value)
#建立一个赋值操做,把new_value赋值给num

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    #初始化变量
    print(sess.run(num))
    for i in range(5):
        #建立一个for循环,循环5次
        sess.run(op)
        #执行op的赋值操做
        print(sess.run(num))
        #输出num

输出的结果:
0
10
20
30
40
50
复制代码

第三个例子--填充

有的时候,会在声明变量的时候不赋值,计算的时候才进行赋值,这个时候feed就派上用场了

input1 = tf.placeholder(tf.float32)
#建立一个变量占位符input1
input2 = tf.placeholder(tf.float32)
#建立一个变量占位符input2
mul = tf.multiply(input1, input2)
#乘法操做

with tf.Session() as sess:
    
  result = sess.run([mul], feed_dict={input1:[7.], input2:[2.]})
  #在运算时,用feed设置两个输入的值
  print(result)
复制代码

综合例子

import tensorflow as tf
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
import numpy as np


x_data = np.random.rand(100).astype("float32")
y_data = x_data * 0.1 + 0.3
# 模拟生成100对数据对, 对应的函数为y = x * 0.1 + 0.3
# numpy是Python的一个科学计算库,提供矩阵运算的功能
# astype是转换数组的数据类型

W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
#产生尺寸为1的张量
y = W * x_data + b
# 指定w和b变量的取值范围(注意咱们要利用TensorFlow来获得w和b的值)
# tf.random_uniform,TensorFlow随机值函数,返回1矩阵,数值产生于-1.0跟1.0之间


loss = tf.reduce_mean(tf.square(y - y_data))
#reduce_mean求平均值
#square是对里面的值求平方操做
optimizer = tf.train.GradientDescentOptimizer(0.5)
#这个类是实现梯度降低算法的优化器,第一个参数是要使用的学习率 
train = optimizer.minimize(loss)
# 最小化均方偏差

init = tf.global_variables_initializer()
# 初始化TensorFlow参数

sess = tf.Session()
sess.run(init)
# 运行数据流图(注意在这一步才开始执行计算过程)

for step in range(201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))
# 观察屡次迭代计算时,w和b的拟合值
# 最好的状况是w和b分别接近甚至等于0.1和0.3
复制代码

输出的结果:

0 [-0.39065683] [0.66207296]
20 [-0.0082044] [0.3498935]
40 [0.07841039] [0.30995506]
60 [0.09569232] [0.3019863]
80 [0.09914052] [0.30039632]
100 [0.09982852] [0.30007908]
120 [0.09996579] [0.30001578]
140 [0.09999318] [0.30000314]
160 [0.09999864] [0.30000064]
180 [0.09999974] [0.30000013]
200 [0.09999995] [0.30000004]
复制代码

每执行20次输出一次数据,从上面的结果能够看到,随着次数的增长,w跟b的值愈来愈靠近0.1跟0.3;
JB很好奇,为何会这这样?从上面的代码,没作什么吗?这个呢?估计要看TensorFlow的源码了,感兴趣的同窗,看完后记得分享下~

本章就介绍到这里了,原本还想介绍hello world的,可是考虑总体章节会比较长,就放下文吧~

小结

来个例行总结,本文主要讲解人工智能的相关概念,以及TensorFlow的基础用法,也结合一个例子来证实TensorFlow的效果,至于源码嘛,JB也不懂,就是以为TensorFlow很牛逼的感受~

而咱们最终的目的,是但愿用TensorFlow来训练本身的模型,来提升图形验证码的识别率;

谢谢你们~

相关文章
相关标签/搜索