目录:

  • 冰山图片识别背景

  • 数据介绍

  • 数据预处理

  • 模型搭建

  • 结果分析

  • 总结

一、冰山图片识别背景

这里我们要解决的任务是来自于Kaggle上的一道赛题(https://www.kaggle.com/c/statoil-iceberg-classifier-challenge),简单介绍一下赛题的背景:在加拿大的东海岸经常会有漂流的冰山,这对航行在该海域的船舶造成了很大的威胁。挪威国家石油公司(Statoil)是一家在全球运营的国际能源公司,该公司曾与C-CORE等公司合作,C-CORE基于其卫星数据和计算机视觉技术建立了一个监控系统。Statoil发布该赛题的目的是希望利用机器学习的技术,更准确的及早发现和识别出威胁船舶航行的冰山。

二、数据介绍

赛题提供了两个数据文件“train.json”和“test.json”,其中“test.json”是比赛中用来对模型惊醒评分的,没有类标,这里我们只需要使用“train.json”文件。该数据集中有1604个打标过的训练数据,单个样本的数据格式如下:

字段名

字段说明

id

图像的id。

band_1,band_2

卫星图像数据,band_1和band_2是以特定入射角下不同极化方式产生的雷达后向散射为特征的信号,分别对应HH(水平发射/水平接收)和HV(水平发射/垂直接收)两种极化方式的数据,其大小均为。

inc_angle

获得该数据时的入射角度。该字段部分缺少数据,标记为“na”。

is_iceberg

类标,0:船只,1:冰山。

我们将数据可视化后进行观察,如图1所示。图像上方是冰山图像的可视化效果,三幅图分别对应“HH”计划方式、“HV”计划方式以及两者结合后的数据。图像下方是船只图像的可视化效果。

图1训练数据可视化效果

图1中的冰山和船只,通过观察可以较为容易的区分出来,但是还有很多如图2所示的数据,即使仔细观察也很难区分开来。

图2 训练数据可视化效果

三、数据预处理

首先我们导入需要的包:

接下来我们定义一个数据预处理的函数:

“data_preprocess”函数接受两个参数,“path”为训练数据“train.json”的文件路径,“more_data”为布尔类型,当其为“true”时,会调用函数“create_more_data”进行训练数据的扩充(即数据增强)。

第11行到第17行代码中,我们对样本数据进行了处理,除了原有的“band_1”和“band_2”,我们增加了“band_3”,band_3=band_1+band_2。最后我们使用numpy的“dstack”将三种数据进行堆叠,因此我们单个样本的数据维度为75x75x3。

第20行代码是调用“create_more_data”函数对训练数据进行扩充,第26行代码是对训练集的类标数据进行扩充,因为“create_more_data”函数将训练数据扩充为了原来的6倍,因此这里对应的也要将类标扩充为原来的6倍。

“create_more_data”函数的实现如下:

在“create_more_data”函数中我们通过对图像进行旋转和翻转来扩充数据集,虽然旋转前后的图像是同一张,但是由于特征的位置发生了变化,因此对于模型来说就是不同的数据,旋转或翻转操作是扩充图像数据集的一个简单有效的方法。在31至35行代码中,我们定义了5个列表,用来保存扩充的数据集,对应的操作分别是逆时针旋转90度、逆时针旋转180度、逆时针旋转270度、左右翻转和上下翻转。具体实现如下:

上面的代码中,我们使用numpy的“rot90”和“flip”函数对图像进行旋转和翻转操作。“flip”函数的第二个参数控制翻转的方式,“0”为左右翻转,“1”为上下翻转。第78行代码中,使用numpy的“concatenate”函数将扩充的数据预原数据进行拼接。

四、模型搭建

接下来我们实现模型部分,这里我们使用TensorFlow的高级API来搭建网络。

在84行代码中,我们使用“tf.keras.Sequential()”创建一个序贯模型,序贯模型是多个网络层的线性堆叠,我们使用“tf.keras.Sequential().add()”方法逐层添加网络结构。第87到90行代码是第一个卷积块,这里的卷积层我们使用了128个大小为3x3的卷积核,使用了relu激活函数。在卷积层后面是一个池化层,采用最大池化,池化窗口的大小为3x3,横向和纵向的步长都为2。在池化层的后面我们使用了Dropout,丢弃了20%的神经元,防止参数过多导致过拟合。接下来是三个类似的卷积块。

在第109行代码中,我们使用“Flatten()”将前一层网络的输出转换为了一维的数据,这是为了接下来的全连接操作。第112行代码是第一个全连接层,有256个神经元,全连接层后面接relu激活函数,同样使用了Dropout。第117至119是类似的一个全连接部分。

由于是二分类问题,在122行代码中我们使用了一个只有一个神经元的全连接层,并使用了Sigmoid激活函数,得到最终的输出。

第126至128行使用“compile”编译模型,其中“loss='binary_crossentropy'”指明使用的是对数损失函数,通过“optimizer”参数设置使用Adam优化器,学习率设置为0.0001。“metrics” 列表包含评估模型在训练和测试时的性能的指标,我们设置了“metrics=['accuracy']”,则在训练的过程中,训练集和验证集上的准确率都会打印出来。

第130行使用了“summary()”函数,训练开始后终端会打印出模型的概况信息,如图3所示,其中包含了网络的结构,以及每层的参数数量等信息。其中最后一行显示我们总的训练数据为7699条,验证集的数据量为1925条。

图3 模型的概况信息

五、结果分析

接下来我们读取数据,并训练模型:

第134行代码中我们调用“data_preprocess”函数获取预处理后的训练数据,设置“more_data”为“true”进行数据扩充。第140行代码中,我们调用“fit”方法开始模型的训练,通过“batch_size”设置每个批次训练25条数据,通过“epochs”设置训练的总回合数为“100”。通过设置“verbose”为1,在终端上显示训练的进度。通过设置“validation_split”为0.2,将训练集一分为二,其中80%作为训练集,20%作为验证集。

模型的训练过程和结果如图4所示:

图4 模型的训练过程和结果

六、总结

在前面几节内容里我们介绍了卷积神经网络的基本结构和原理,在这一节里我们使用TensorFlow搭建了一个简单的卷积神经网络,实现图像分类的任务。

通过前几章的学习,我们深入理解了CNN中卷积,池化等典型结构的原理,以及CNN实际相关的图片识别比赛。相信大家对于CNN会有更深层次的认识。后边会接着这里开始介绍运用CNN技术来预测的典型3个项目。

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

TensorFlow系列专题(十四): 手把手带你搭建卷积神经网络实现冰山图像分类的更多相关文章

  1. Tensorflow系列专题(四):神经网络篇之前馈神经网络综述

    目录: 神经网络前言 神经网络 感知机模型 多层神经网络 激活函数 Logistic函数 Tanh函数 ReLu函数 损失函数和输出单元 损失函数的选择 均方误差损失函数 交叉熵损失函数 输出单元的选 ...

  2. 微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  3. 【Nginx入门系列】第一章 手把手带你搭建Nginx服务器

    1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境,搭建前请先按如下语句配置好环境. GCC 安装nginx需要先将官网下载的源码进行编译 ...

  4. 「kuangbin带你飞」专题十四 数论基础

    layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...

  5. Chrome浏览器扩展开发系列之十四

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 时间:2015-10-08 16:17:59      阅读:1361      评论:0      收藏:0    ...

  6. Chrome浏览器扩展开发系列之十四:本地消息机制Native messagin

    Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging 2016-11-24 09:36 114人阅读 评论(0) 收藏 举报  分类: PPAPI(27)  通过将浏览器 ...

  7. webpack4 系列教程(十四):Clean Plugin and Watch Mode

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十四):Clean Plugin and Watch Mode>原文地址.更欢迎 ...

  8. 开发指南专题十四:JEECG微云高速开发平台MiniDao 介绍

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/27068645   开发指南专题十四:J ...

  9. OSGi 系列(十四)之 Event Admin Service

    OSGi 系列(十四)之 Event Admin Service OSGi 的 Event Admin 服务规范提供了开发者基于发布/订阅模型,通过事件机制实现 Bundle 间协作的标准通讯方式. ...

随机推荐

  1. 自制一个可编辑QueryString的类URLModifier

    有些情况下,需要 新增/删除/替换 url中的部分Querystring中的参数,而.net自带的Uri类只能解析,不能编辑,,并且如果是Relative类型的链接,转成Uri类型之后,很多参数又不能 ...

  2. 图形用户界面(GUI)应用程序开发——菜鸟的第一步

    参考资源:贺老师博文 在看完贺老师的博文后,我就照葫芦画瓢的做了个求三角形面积的程序.这是我写的一篇所用时间最长博文(两个多小时,真心挺累,或许是我太笨吧),为了尽可能详细的把步骤写明白我截了二十一张 ...

  3. JavaScript 执行环境以及作用域链

    执行环境(execution context,为简单起见,有时也称为"环境")是 JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们 ...

  4. 【WPF学习】第五十一章 动画缓动

    线性动画的一个缺点是,它通常让人觉得很机械且不能够自然.相比而言,高级的用户界面具有模拟真实世界系统的动画效果.例如,可能使用具有触觉的下压按钮,当单击时按钮快速弹回,但是当没有进行操作时它们会慢慢地 ...

  5. Asp.Net Core EndPoint 终点路由工作原理解读

    一.背景 在本打算写一篇关于Identityserver4 的文章时候,确发现自己对EndPoint -终结点路由还不是很了解,故暂时先放弃了IdentityServer4 的研究和编写:所以才产生了 ...

  6. 震惊,当我运行了这条Linux命令后,服务器竟然... (Linux中的删除命令)

    震惊,当我运行了这条Linux命令后,服务器竟然... 0X00 写在前面 大家都听说过删库命令rm -rf /*,但是谁又真正实践过呢?但作为一个程序员,不看看这条命令执行后会发生什么,怎么能甘心呢 ...

  7. 【每日一包0018】fecha

    [github地址:https://github.com/ABCDdouyae...] fecha 比moment.js更加轻量级的时间解析和格式化包 format 用法:format(<Dat ...

  8. 前端每日实战:1# 视频演示如何用纯 CSS 创作一个按钮文字滑动特效

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/zhang-ou/pen/GdpPLE 可交互视频教程 此视频 ...

  9. ZYNQ入门实例——定时器中断与程序固化

    一.前言 APU系统中CPU以串行执行代码的方式完成操作,软件方式很难做到精准计时,因此调用内部定时器硬件完成计时是更好的选择.本文以定时器中断方式控制LED周期性闪烁为例学习私有定时器的使用.同时学 ...

  10. 峰哥说技术:10-Spring Boot静态资源处理

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 10  峰哥说技术:Spring Boot静态资源处理 今天我们聊聊关于 Spring Boot 中关于静 ...