小白学CNN以及Keras的速成
本篇文章5736字,读完约14分钟
据雷锋说。作者夏洛克,原文收录在他的专栏《智湖深炼丹术》中。雷锋。(公开号码:雷锋。com)已获得发布授权。
首先,为什么要使用keras?如今,当深度学习全面展开时,第三方工具一个接一个地出现。著名的有张量流、caffe、an ano、mxnet。在如此多的第三方框架中频繁替换无疑是非常低效的。只要你能很好地掌握一个框架并熟悉它的原理,你就很容易在以后因为各种需求而改变框架。
那么,夏洛克使用哪种框架呢?夏洛克使用tensorflow,一个谷歌的开源框架。自从谷歌开通tensorflow以来,它的社区非常活跃,版本更新也非常稳定,所以我选择了这个框架。至于框架之争,智湖已经有很多人了,这就像是哪个编程语言好的问题。对我们来说,选择一个稳定的框架并深入学习是最重要的。在了解哪个框架更好之后,我们自然会有自己的看法。因此,禁止在早期刷牙后频繁更换骨架。
为了安装tensorflow、cpu和gpu版本,许多人已经编写了在互联网上安装各种系统的详细策略。你可以自己在网上搜索,很容易安装成功。
选择张量流后,我们可以愉快地开始我们的深度学习之旅。当你去张量积的中文社区,你可以看到网上有一些初学者的教程和很多学习材料。推荐大家看一下cs224d.stanford.edu/lectures/cs224d-lecture7.pdf,斯坦福大学的cs224d课件,它详细介绍了张量流。然后你可以写张量流程序。虽然张量流已经是一个打包的框架,但是你发现你需要很多行来写一个简单的神经网络。这时,有很多第三方的插甲帮你写网络,也就是说,你用张量流写10行,而第三方的插甲为你封装了一个函数,就是在这个函数中设置这10行。然后,您可以使用1行并传入相同的参数来实现10行的相同效果
Keras文档是keras的官方文档,在这里可以查阅所有的函数,并且可以在github上查看它的开源代码,这非常方便。安装也很简单。打开终端,进入pip安装界面,等待安装。
让我们举一个简单的例子来看看keras有多简单。
从keras.models导入顺序
模型=顺序()
引入序列,这是空的一个网络结构,这个结构是一个序列,所以它被称为序列,在keras中还有一些其他的网络结构。
从keras.layers导入密集、激活
model.add(密集(单位=64,input_dim=100))
model.add(激活(relu))
model.add(密集(单位=10))
model.add(激活(softmax))
你可以看到添加层非常简单,只需编写。添加,然后是要添加的图层类型。
模型堆(损失=分类交叉熵,
optimizer= sgd,
度量=[准确性])
一旦你写好了网络,你就可以用编译来编译整个网络,看看参数设置有没有问题
模型堆(损失= keras . loss . classic _ cross熵,
optimizer = keras . optimizer . SGD(lr = 0.01,动量=0.9,nesterov=true))
您也可以自定义优化功能。如上所述,“sgd”是一个优化函数,keras为其编写了一些默认参数。你可以自己重新定义参数,得到一个优化函数。
model.fit(x_train,y_train,epochs = 5,batch_size=32)
这种培训模式就像scikit-learn。
损失和度量=模型.评估(x_test,y_test,批量=128)
这是为了评估培训结果。
class = model . predict(x _ test,batch_size=128)
或者通过预测。
读完上面的代码,我相信很多熟悉scikit-learn的学生都很善良,因为它真的很简单,而且语法和scikit-learn相似。
2.学习美国有线电视新闻网在我们理解美国有线电视新闻网之前,我们需要了解什么是神经网络,这样我们才能开始理解更先进的卷积神经网络。
当然,学习神经网络有很多方法。互联网上的许多大牛已经写了许多策略,其中一些提倡从理论到工程完成的深度学习,而另一些则希望从工程中发现和解决问题。不同的人尝试了各种方法,而策略也是一个很大的推动,这使得许多小白直接走上了选择材料的道路,并且一直是先弥补知识。当热情结束时,他们放弃学习,甚至不知道什么是卷积网络,这极大地打击了每个人的学习热情。今天,夏洛克在这里向大家推荐一种学习材料,这样可以确保你在出去假装被强迫的时候,可以很快开始使用cnn并和别人交谈。
这是什么材料?这是斯坦福著名的cs231n球场。用于视觉识别的Cs231n自愿神经网络斯坦福大学在深度学习和人工智能领域确实是一所非常强大的学校。
神经网络
别废话了,开始学习我们的神经网络。
这是脑神经的图片,神经网络的发明就是从它开始的。这就是所谓的神经元,其上有各种接收突触,然后通过脑神经接收,最后得到输出结果。
那么什么样的神经网络可以从这张大脑神经图中提取出来呢?这是下面的神经网络模型。
你怎么理解这个?也就是说,输入一个向量,然后给向量的每个元素分配一个权重,然后将权重相加得到一个结果,然后将结果输入到激活函数中得到最终的输出结果。
到底是什么激活了一个功能?激活功能的出现是由于人脑的结构。人脑接收信息和获得结果的过程是非线性的。例如,如果你看到某样东西,你就不能保留它的所有特征。你会把注意力集中在你感兴趣的地方。这是非线性的,这意味着需要非线性变化来将输入结果转换成非线性结果。目前,常用的非线性函数是relu(x) = max(x,0),也就是说,小于0的部分被删除,只有大于0的部分被保留。
这是细胞的输入和输出,将这些细胞组合在一起就是一个神经网络。
这是一个简单的单层网络,也可以由多层网络组成
输入层是单个训练集的维数,通过输入所有的训练集可以开始训练神经网络。
Keras实现了一个简单的神经网络
了解了神经网络的基本结构和原理,我们就可以开始用keras来实现一个简单的神经网络。
导入keras
从keras.models导入顺序
从keras.layers导入密集
将numpy作为np导入
导入必要的包
x=np.array([[0,1,0],[0,0,1],[1,3,2],[3,2,1]])
y=np.array([0,0,1,1])。t
设置输入x和y
简单模型=顺序()
simple _ model . add(density(5,input_shape=(x.shape[1]),activation= relu,name= layer1))
simple _ model . add(density(4,activation= relu,name= layer2))
simple _ model . add(density(1,activation= sigmoid,name= layer3))
进入一个三层神经网络,中间隐藏层的元素数为5和4,最后一层输出结果
simple_modelpile(optimizer= sgd,loss=均方误差)
复杂是一个简单的模型
simple_model.fit(x,y,纪元=20000)
将模型训练20000次
simple_model.predict(x[0:1])
您可以预测第一个输入x的结果是否与实际结果一致。
以上是一个简单的keras实现的三层网络,然后我们将正式进入自愿神经网络
第三,志愿神经网络推荐了一门很好的课程cs231n,而本文也是基于这个想法。
基本结构
首先,解释什么是卷积。这种卷积当然不是数学卷积。这里的卷积实际上代表了一个三维权重,这可能不太容易理解。让我们先来看看卷积网络的基本结构。
通过上图,我们可以清楚地理解卷积网络与一般网络结构的区别,也可以理解卷积网络是三维的,而一般网络结构是平面的。
卷积层
在了解了基本结构之后,我们需要了解cnn最重要的部分和最具创新性的部分,卷积层。首先,将卷积网络的创新与图片进行比较。
通过这种结构,我们可以清楚地看到卷积网络是如何实现的。首先,右边是传统的网络结构,我们之前已经详细解释过了。对于左边的图片,让我们先看看图片最左边的结构,你一定会想为什么它是一个32x32x3的立方体。这个32x32代表像素。说白了,这就是照片的大小。该尺寸可设置为50x50或256x256,具体取决于图片的大小。那么3是什么意思?实际上,它代表三个rgb通道。什么是rgb?Rgb代表红色、绿色和蓝色,这三种颜色的各种组合和叠加可以形成各种颜色,所以任何照片都可以用左边的图形来表示。
中间的这个小方块是什么意思?这是我们想要关注的卷积。卷积是一个很小的正方形。我们设定了一个小正方形的大小,但是这个小正方形的厚度必须和左边的大正方形的厚度一样。大正方形的每个像素都用0到255的数字表示,这样我们就可以给小正方形加权。例如,如果我们把小正方形的尺寸取为3×3,我们要求厚度必须与左边的大正方形的厚度相同,所以小正方形的尺寸是3×3。我们可以给它3x3x3的权重,然后我们可以开始计算卷积结果。从大正方形的左上角开始,一个卷积小正方形覆盖3x3x3。然后,我们将大方块中的3x3x3数和小方块中的权重相乘并相加,然后加上一个偏差,得到一个卷积结果,该结果可以抽象地写成wx+b,如图所示。然后,我们可以设置小正方形的滑动距离,并且每次滑动时,我们可以形成卷积计算结果。然后,在滑动并覆盖整个大图像之后,我们可以形成一层卷积结果。我们可以看到,图像中的卷积结果非常粗,即设置了许多层的卷积。综上所述,每一层卷积都是一个在画面上滑动的卷积核,然后可以设置多个卷积核形成一个多层卷积层。
泳池层
完成卷积层后,我们将讨论池层。为什么有泳池层?这是因为当卷积连续进行时,中间结果会越来越厚。卷积相当于从图像中提取特征,因此卷积层通常会设置得越来越厚,否则您将无法从以前的结果中提取更多的特征。这将导致越来越大的中间结果和较慢的计算,因此建议使用汇集层。
所谓的汇集层是一种减少图片大小的方法。我们可以先看看下面的图片。
通过这张图片,我们可以清楚地看到池层是如何处理的。汇集层也需要先设置一个窗口,但是这个小窗口的厚度是1,不再是前一层输出结果的厚度。然后有两种处理方法,一种是取这个小窗口中所有元素的最大值来表示这个小窗口,另一种是取平均值,然后滑动这个小窗口,在第二个位置做同样的处理。上层网络输出框的每一层完成后,它将进入这个大框的下一层做同样的操作。这种处理方法可以使整个大盒子的尺寸变小,你可以看上面图片的左边。右边是一个简单的例子,取一层的最大厚度。
实现lenet
在谈完卷积网络的基本结构后,你是否渴望实现一个简单的神经网络?卷积网络发展非常迅速,由勒昆首先提出,勒内成为美国有线电视新闻网的创始人。然后,他的学生亚历克斯提出了更深层次的阿列克谢网,然后在2013年,他提出了vggnet,它有16层和19层。这些只是层次的深化,没有其他创新。之后,谷歌提出了创新网来实现网络结构的创新,并提出了创新组织。facebook人工智能实验室也提出了resnet,即剩余网络,并实现了150层网络结构的可训练性,这一点我们以后再慢慢讨论。
接下来,我们将实现最简单的lenet,使用mnist手写后代作为训练集。
导入keras
从keras.datasets导入mnist
(x_train,y_train),(x_test,y_test) =mnist.load_data()
导入必要的库和数据集
x_train=x_train .整形(-1,28,28,1)
x _ test = x _ test . resform(-1,28,28,1)
x _火车= x _火车/255。
x_test=x_test/255。
y _ train = keras . utils . to _ classic(y _ train)
y _ test = keras . utils . to _ classic(y _ test)
处理数据,使数据的形状为(28,28,1),然后标签进行一次热编码过程。例如,如果类别是3,它将变成[0,0,1,0,0,0,0,0,0]。
从keras.layers导入conv2d、maxpool2d、密集、展平
从keras.models导入顺序
lenet =顺序()
lenet.add(conv2d(6,内核大小=3,步长=1,填充=相同,input_shape=(28,28,1)))
lenet . add(max pool 2d(pool _ size = 2,steps = 2))
lenet.add(conv2d(16,内核大小=5,步长=1,填充=有效))
lenet . add(max pool 2d(pool _ size = 2,steps = 2))
lenet.add(展平())
lenet.add(密集(120))
lenet.add(密集(84))
lenet.add(密集(10,激活= softmax))
构建lenet
lenet file(SGD,loss=分类_交叉熵,metrics=[精确度])
编制
lenet.fit(x_train,y_train,批量=64,时期=50,验证_数据=[x_test,y_test])
经过50次训练,结果如下
lenet.save( myletnet.h5)
您可以保存经过训练的模型
摘要
好吧,这是我们写的一个超级简单的句子。经过50次训练,训练精度达到0.9939,测试精度达到0.9852。
欢迎关注我的智湖专栏,深炼丹术
欢迎关注我的github主页
欢迎来到我的博客
本文的代码已被传递给github
sherrockliou/lenet
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
标题:小白学CNN以及Keras的速成
地址:http://www.6st8.com/zbxw/3446.html
免责声明:联合早报中文网从世界各个维度报道世界经济新闻,时政新闻,突发新闻等,本篇的部分内容来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2018@163.com,联合早报中文网的小编将予以删除。