从本篇文章开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。第一篇文章主要讲解神经网络基础概念,同时讲解Theano库的安装过程及基础用法,主要结合 "莫烦大神" 的视频介绍,后面随着深入会讲解具体的项目及应用。基础性文章,希望对您有所帮助,也建议大家一步步跟着学习,同时文章中存在错误或不足之处,还请海涵~
同时推荐前面作者另外三个Python系列文章。从2014年开始,作者主要写了三个Python系列文章,分别是基础知识、网络爬虫和数据分析。
该部分主要通过白话文的方式讲述神经网络,其中主要转载吴老的文章。链接:
吴祖增前辈:神经网络入门(连载之一)
吴祖增前辈:神经网络入门(连载之二)
斯坦福机器学习视频NG教授 https://class.coursera.org/ml/class/index
书籍《游戏开发中的人工智能》、《游戏编程中的人工智能技术》
神经网络和机器学习基础入门分享 - eastmount
神经网络(也称人工神经网络,ANN)算法是80年代机器学习界非常流行的算法,不过在90年代中途衰落。现在,携着“深度学习”之势,神经网络重装归来,重新成为最强大的机器学习算法之一。
人工神经网络(Artificial Neural Network,缩写ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。其来源于生物,故吴老先先讲述了生物神经网络的基础知识,从而进行引入。
如下图所示,它表示的是一个人工神经细胞。其中:
输入(Input);权重(Weight):左边五个灰色圆底字母w代表浮点数;激励函数(Activation Function):大圆,所有经过权重调整后的输入加起来,形成单个的激励值;输出(Output):神经细胞的输出。
进入人工神经细胞的每一个input(输入)都与一个权重w相联系,正是这些权重将决定神经网络的整体活跃性。假设权重为-1和1之间的一个随机数,权重可正可负(激发和抑制作用)。当输入信号进入神经细胞时,它们的值将与它们对应的权重相乘,作为图中大圆的输入。如果激励值超过某个阀值(假设阀值为1.0),就会产生一个值为1的信号输出;如果激励值小于阀值1.0,则输出一个0。这是人工神经细胞激励函数的一种最简单的类型。涉及的数学知识如下图所示:
如果最后计算的结果激励值大于阈值1.0,则神经细胞就输出1;如果激励值小于阈值则输出0。这和一个生物神经细胞的兴奋状态或抑制状态是等价的。下面图是通过神经网络实现逻辑表达式与运算:(参考NG斯坦福机器学习讲义)
可以看到x1和x2变量作为神经网络的输入,当它们取不同的0或1值时,其结果通过sigmod函数计算的值是不同的。它模拟了整个AND运算。
上图会演示神经网络在图像识别领域的一个著名应用,这个程序叫做LeNet,是一个基于多个隐层构建的神经网络。通过LeNet可以识别多种手写数字,并且达到很高的识别精度与拥有较好的鲁棒性。LeNet的发明人是机器学习的大牛Yann LeCun(目前google)。
右下方的方形中显示的是输入计算机的图像,方形上方的红色字样“answer”后面显示的是计算机的输出。左边的三条竖直的图像列显示的是神经网络中三个隐藏层的输出,可以看出,随着层次的不断深入,越深的层次处理的细节越低,例如层3基本处理的都已经是线的细节了。
这种类型的训练称作有监督的学习(supervised learnig),用来训练的数据称为训练集(training set)。调整权重可以采用许多不同的方法。对本类问题最常用的方法就是反向传播(backpropagation,简称backprop或BP)方法,即BP神经网络。
你自己可以去学习另外的一种训练方式,即根本不需要任何导师来监督的训练,或称无监督学习(unsupervised learnig)。下图是神经网络的简单回顾与总结:
1.基础知识
它与后来出现的Tensorflow功能十分相似(或者应该说,Tensorflow 类似 Theano ),因而两者常常被放在一起比较。它们本身都偏底层,同样的,Theano 像是一个研究平台多过是一个深度学习库。你需要从底层开始做许多工作,来创建你需要的模型。比方说,Theano 没有神经网络的分级。
安装成功之后,下面给出基础性的代码。这也是学习莫烦大神的云课程笔记,希望对您有所帮助。
莫烦大神地址:http://study.163.com/course/courseLearn.htm?courseId=1003215006
2.存量变量使用
首先导入相关包,然后定义存量x和y,再进行相加计算。由于theano需要用到cpu或gpu,所以其function定义比较特殊,核心代码为f = function([x,y],z)。
#coding:utf-8
import numpy as np
import theano.tensor as T
from theano import function
#存量相加
x = T.dscalar('x')
y = T.dscalar('y')
z = x + y
#输入[x,y]列表 输出结果z
f = function([x,y],z)
#调用函数
print(f(2,3))
#to pretty-print the function
##查看z函数原型,输出(x+y)
from theano import pp
print(pp(z))
输出结果如下所示:
5.0
(x + y)
3.矩阵变量使用
定义两个矩阵x和y,均为3行4列,其中x通过np.arange(12).reshape((3,4))代码定义,为0-11数字;y通过10*np.ones((3,4))代码定义,全部为10。
#coding:utf-8
import numpy as np
import theano.tensor as T
from theano import function
#定义矩阵 matrix
x = T.dmatrix('x')
y = T.dmatrix('y')
z = x + y
#矩阵的加法
f = function([x,y],z)
#3行4列矩阵 y全部为10 x从0-11
print(u"输入矩阵")
print(np.arange(12).reshape((3,4)))
print(10*np.ones((3,4)))
print(u"输出结果")
print(f(np.arange(12).reshape((3,4)),
10*np.ones((3,4))
))
计算结果如下图所示:
如果需要实现乘法,则使用z = T.dot(x,y) 代码实现。
theano运用CPU、GPU加速和并行计算,会自己定义function,下面详细讲解其函数功能。
1.激励函数
神经网络中的神经元中都有激励函数(activation function),这里我们定义逻辑回归的激励函数,常见的激励函数参考维基百科:https://en.wikipedia.org/wiki/Activation_function
#coding:utf-8
import numpy as np
import theano.tensor as T
import theano
from theano import function
#1.激励函数
#activation function example
x = T.dmatrix('x')
#计算概率 logistic or soft step
s = 1/(1+T.exp(-x)) #np.exp() 这里用的theano中的T.exp()
#输入x 输出s
logistic =theano.function([x],s)
#两行两列矩阵
print(logistic([[0,1],[2,3]]))
#wikipedia: Activation function
#输入0 输出s=1/(1+e0次方)=0.5
输出结果如下所示,比如当数值为0时,其结果为s=1/(1+e的0次方)=0.5。
[[0.5 0.73105858]
[0.88079708 0.95257413]]
2.返回多个值
输入为a和b变量,输出为差值、差值绝对值、差值平法和。核心代码如下:
f = theano.function([a,b],[diff,abs_diff,diff_squared])
#coding:utf-8
import numpy as np
import theano.tensor as T
import theano
from theano import function
#2.返回多个值或结果
#multiply outputs for a function
a,b = T.dmatrices('a','b')
#定义两个的差的绝对值和平方
diff = a - b
abs_diff = abs(diff) #差值绝对值
diff_squared = diff*2
f = theano.function([a,b],[diff,abs_diff,diff_squared])
#[1,1,1,1] [0,1,2,3]
x1,x2,x3 = f(np.ones((2,2)),
np.arange(4).reshape((2,2)))
print(x1)
print(x2)
print(x3)
输出结果如下所示:
[[ 1. 0.]
[-1. -2.]]
[[1. 0.]
[1. 2.]]
[[ 2. 0.]
[-2. -4.]]
3.函数赋初值
#coding:utf-8
import numpy as np
import theano.tensor as T
import theano
from theano import function
#3.如何运用function名字更加方便
#name for a function
#定义存量
x,y,w = T.dscalars('x','y','w')
z = (x+y)*w
#定义默认值和名字
f = theano.function([x,theano.In(y,value=1),
theano.In(w, value=2, name='weight')],
z)
print(f(23,2))
#(23+2)*2=50
print(f(23,2,weight=4))
#(23+2)*4=100
输出结果如下所示:
50.0
100.0