|
在这个人工智能的时代,不懂点神经网络,都不好意思开口了。——题记
神经网络技术(ANN)已经在很多领域发挥了要作用,比如图像检测,语义分析,模式识别。在一些非线性问题上,基于神经网络的方法也相当不俗的表现。事实上神经网络技术几十年前就有了,并且发展过程并不顺利,不过最近火热的“深度学习”让它再次迎来春天。
现在神经网络的通用架构,工具箱不少,比如Matlab,谷歌的基于Python的Tenserflow,Keras等。Wolfram research公司的Mathematica现在也可以用来建构神经网络了,只要懂Wolfram语言,上手非常容易。作为Mathematica用户,本屌在这个问题上自然是有发言权的啦。
图1.神经网络
Mathematica中,隐含层事实是被分解为线性层和激活函数层,LinearLayer 函数可以用来定义线性层的神经元数目,比如LinearLayer[5], 就是5个神经元。激活函数包括Tanh,LogisticSigmoid等,事实上用户可以任意定义函数样式,当然现在用的最多的是ReLU函数。一个线性层相当于计算了w.x+b,激活函数层加上线性层相当于隐含层。Mathematica里面关于搭建卷积神经网络的卷积层(ConvolutionalLayer),池化层(PoolingLayer)都是有的,具体怎么用,可以看Mathematica的帮助文档。
"Talk is cheap,Give me your code",下面上代码。
比如:
chain = NetChain[{100, Ramp, 250, Ramp, 10, LogisticSigmoid, 3}]
上面的NetChain函数是用来构建网络的,LinearLayer可以直接用神经元数目代替,就是LinearLayer[100]直接写成100也行,可以看到上面这个网络是两个隐含层,用到两种激活函数Ramp,LogisticSigmoid,输出是3维向量。顺便说一句,Mathematica的Ramp事实上就是ReLU函数。
网络建好了,还需要训练数据。Mathematica中训练数据就是Table(数组),每个元素都是“input->output"的形式,比如{1 -> 1.9, 2 -> 4.1, 3 -> 6.0, 4 -> 8.1}就是一个样本库,一共4个样本,当然实际问题中输入输出可能是多维的,比如图像识别,输入就是二维数组. 下面定义的就是一个卷积神经网(CNN)。如果熟悉CNN的话,从下面的代码能很容易地看出网络的结构。
lenet = NetChain[{
ConvolutionLayer[20, 5], Ramp, PoolingLayer[2, 2],
ConvolutionLayer[50, 5], Ramp, PoolingLayer[2, 2],
FlattenLayer[], 500, Ramp, 10, SoftmaxLayer[]},
"Output" -> NetDecoder[{"Class", Range[0, 9]}],
"Input" -> NetEncoder[{"Image", {28, 28}, "Grayscale"}]
]
图2.卷积神经网络(CNN)
上面粗略地讲了下怎么建网络,下面讲怎么训练。
比如:
net = NetTrain[layer, data, Method -> "SGD"]
上面的layler代表建好的某个网络,data代表准备好的数据集,SGD是随机梯度下降法 ,目前神经网络学习差不多都基于梯度下降,当然有不少新算法出现,Mathematica也内置了一些,如有需要查看帮助文档就行了。神经网络的训练次数,BatchSize等都是可以定义的,Mathematicah甚至还支持利用GPU训练。不管怎样,这些代码都是相当简洁的。
Mathematica里面有一个用神经网络学习一朵花的奇葩案例:
图4.花
方法当然是用图片中的一些点的位置坐标和RGB值建立样本,然后让网络去学习。网络的结构就是前面举例用到的那个chain。
最后展示下网络预测出的整朵花。
图5.神经网络看到的那朵花
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-16 17:30
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社