十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
zip() 函数是Python内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。
创新互联长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为南漳企业提供专业的网站建设、成都网站建设,南漳网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
利用一个卷积核在原图上进行滑动。传统的边缘检测常用的方法包括一阶和二阶导数法,本质上都是利用一个卷积核在原图上进行滑动,只是其中各个位置的系数不同。
先来看一个网络:
这是一个简单的CNN的前半部分,不包含全连接层,而且已有一个卷积层和一个池化层,卷积核大小是2X2,步长1,Padding为0,Pooling操作为Max Pooling,大小同样是2x2
先来看正向的计算,卷积操作就没什么好说的了,不了解的可以随便百度一下,下面直接写公式:
是节点 的加权输入, 是激活函数ReLU
算出所有的 后,就是Max Pooling了:
卷积层和池化层的前向计算都说完了,虽然实际中一般不止一层,不过都是可以套用的,接下来就是全连接层了:
如图所示,max pooling的结果‘拉平’后就是全连接层的输入向量了:
这是之前的一篇关于DNN的推导,就不赘述了:
关于全连接层的误差传播已经知道怎么算了,接下来的问题就是将误差传回池化层及卷积层了:
上图中 是FC(全连接)层中输入层的误差,也是池化层的下一层的误差,公式在上面一篇文章中已经讨论了:
而输入层是没有激活函数的,所以 ,即:
在得到误差项之后,进一步求Pooling操作之前的误差项,如果Max Pooling如下:
则upsample操作则同样:
推导过程如下:
若x1为最大值,则不难求得下列偏导数:
因为只有最大的那一项会队x5产生影响,所以其余项的偏导数都为0,又因为:
,所以:
如下图所示:
池化层没有参数需要更新,所以只要把误差传给上一层就可以了,接下的问题就是已知卷积层的上一层(也就是正向计算的下一层)误差,求卷积层的误差以及更新卷积核了。
首先已知了上一层所有节点 的误差项 ,来看看如何更新卷积核的梯度。由于任一 都对所有 有影响,根据全导数公式:
上面已经讨论过 是节点 的加权输入,所以:
最后,就是把误差继续往上一层传递了,如图:
先看几个例子:
归纳一下,可以发现如下图的规律:
公式如下:
写成卷积形式:
总算写完了,只是后面的有些粗糙,以后有时间再完善吧
作者 | 杨照璐(微信号lwyzl0821)
编辑 | 言有三
这一次我们讲讲keras这个简单、流行的深度学习框架,一个图像分类任务从训练到测试出结果的全流程。
相关的代码、数据都在我们 Git 上,希望大家 Follow 一下这个 Git 项目,后面会持续更新不同框架下的任务。
Keras是一个非常流行、简单的深度学习框架,它的设计参考了torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU。能够在TensorFlow,CNTK或Theano之上运行。 Keras的特点是能够快速实现模型的搭建, 简单方便地让你实现从想法到实验验证的转化,这都是高效地进行科学研究的关键。
Keras的安装非常简单,但是需要先安装一个后端框架作为支撑,TensorFlow, CNTK,Theano都可以,但是官网上强烈建议使用TensorFlow作为Keras的后端进行使用。本例以TensorFlow 1.4.0 版本作为Keras的后端进行测试。
通过上面两条命令就可以完成TensorFlow和Keras的安装,此处需要注意的一点是Keras的版本和TensorFlow的版本要对应,否则会出现意外的错误。具体版本对应关系可在网上进行查询。
3.1 MNIST实例
MNIST手写字符分类被认为是深度学习框架里的“Hello Word!”,下面简单介绍一下MNIST数据集案例的测试。Keras的官方github的example目录下提供了几个MNIST案例的代码,下载mnist_mlp.py,mnist_cnn.py文件,本地运行即可,其他文件读者也可以自行测试。
3.2 数据定义
前面我们介绍了MNIST数据集实例,很多读者在学习深度学习框架的时候都卡在了这一步,运行完MNIST实例之后无从下手,很大原因可能是因为不知道怎么处理自己的数据集,这一节我们通过一个简单的图像二分类案例,介绍如何实现一个自定义的数据集。
数据处理有几种方式,一种是像MNIST、CIFAR数据集,这些数据集的特点是已经为用户打包封装好了数据。用户只要load_data即可实现数据导入。其实就是事先把数据进行解析,然后保存到.pkl 或者.h5等文件中,然后在训练模型的时候直接导入,输入到网络中;另一种是直接从本地读取文件,解析成网络需要的格式,输入网络进行训练。但是实际情况是,为了某一个项目我们不可能总是找到相应的打包好的数据集供使用,这时候自己建立一个dataset就十分重要。
Keras提供了一个图像数据的数据增强文件,调用这个文件我们可以实现网络数据加载的功能。
此处采用keras的processing模块里的ImageDataGenerator类定义一个图像分类任务的dataset生成器:
下面简单地介绍一下上面的代码,完整代码请移步Git工程。
Keras的processing模块中提供了一个能够实时进行数据增强的图像生成类ImagGenerator,该类下面有一个函数flow_from_directory,顾名思义该函数就是从文件夹中获取图像数据。关于ImageGenerator更多的使用可以参考官方源码。数据集结构组织如下:
此处还需要注意的一点是,我们现在进行的是简单的图像分类任务训练,假如要完成语义分割,目标检测等任务,则需要自定义一个类(继承ImageDataGenerator),具体实现可以查询相关代码进行参考。
Keras网络模型搭建有两种形式,Sequential 顺序模型和使用函数式API的 Model 类模型。本教程的例子采用一个简单的三层卷积,以及两层全连接和一个分类层组成的网络模型。由于函数式API更灵活方便,因此下面采用函数式方法搭建模型,模型定义如下:
4.1 函数式API
即输出是12通道,卷积核大小3*3,步长为2,padding='same'表示边缘补零
axis表示需要归一化的坐标轴,bn_axis=3,由于采用TensorFlow作为后端,因此这句代码表示在通道数坐标轴进行归一化。
x = Flatten()(x) 表示将卷积特征图进行拉伸,以便和全连接层Dense()进行连接。
Dense()实现全连接层的功能,1200是输出维度,‘relu'表示激活函数,使用其他函数可以自行修改。
最后一层采用‘softmax’激活函数实现分类功能。
最终返回Model,包含网络的输入和输出。
4.2 模型编译
网络搭建完成,在网络训练前需要进行编译,包括学习方法、损失函数、评估标准等,这些参数分别可以从optimizer、loss、metric模块中导入。具体代码如下:
其中callbacks模块包含了TensorBoard, ModelCheckpoint,LearningRateScheduler等功能,分别可以用来可视化模型,设置模型检查点,以及设置学习率策略。
5.1 模型训练
Keras模型训练过程非常简单,只需一行代码,设置几个参数即可,具体代码如下:
首先指定数据生成器,train_generator, 前面介绍过;steps_per_epoch是每次epoch循环的次数,通过训练样本数除以batch_size得到;epochs是整个数据集重复多少次训练。
Keras是高度封装的,在模型训练过程中,看不到网络的预测结果和网络的反向传播过程,只需定义好损失函数,事实上,网络定义中的模型输出会包含网络的输入和输出。
5.2 训练过程可视化
keras可以采用tensorboard实现训练过程的可视化。执行完下面的命令就可以在浏览器访问查看效果。
tensorboard --logdir 日志文件路径(默认路径=‘./logs’’)
上面是分别是训练和测试过程的loss和accuracy。
5.3 模型测试
model = simpleconv3()
model.load_weights(model_path, by_name=True)
image_path = '../../../../datas/head/train/0/1left.jpg'
img = Image.open(image_path)
img = img_to_array(img)
img = cv2.resize(img, image_size)
img = np.expand_dims(img, axis=0)
img = preprocess_input(img)
result = model.predict(img, batch_size=1)
print(result)
以上代码简单介绍一下:模型测试流程非常清晰,首先加载模型,加载参数将数据输入网络模型预测。
模型训练完成后,仅需用model.save_weights('models/model.h5')一句代码就可以完成模型的保存。同样,模型的导入采用model.load_weights(model_path, by_name=True),需要注意的是要设置by_name=True,这样就能保证和模型名称一样的参数都能加载到模型,当然模型定义要和参数是匹配的,假如要进行fine-tune我们只需保证需要重新训练或者新加的网络层的名称和预加载模型参数名称不一样就可以。
以上内容涵盖了采用keras进行分类任务的全部流程,从数据导入、模型搭建、模型训练、测试,模型保存和导入几个方面分别进行了介绍。当然这只是一些基本的应用,还有一些高级、个性化功能需要我们进一步学习,有机会,下一次介绍一下自定义网络层、设置check_point、特征可视化等特性。