摘要:本文概括地介绍CNN的基本原理 ,并通过阿拉伯字母分类例子具体介绍其实现过程,理论与实践的结合体。

对于卷积神经网络(CNN)而言,相信很多读者并不陌生,该网络近年来在大多数领域都表现优异,尤其是在计算机视觉领域中。但是很多工作人员可能直接调用相关的深度学习工具箱搭建卷积神经网络模型,并不清楚其中具体的原理。本文将简单介绍卷积神经网络(CNN),方便读者大体上了解其基本原理及实现过程,便于后续工作中的实际应用。本文将按以下顺序展开:

了解卷积操作

了解神经网络

数据预处理

了解CNN

了解优化器

理解 ImageDataGenerator

进行预测并计算准确性

demo

什么是卷积?

在数学(尤其是函数分析)中,卷积是对两个函数(f和g)的数学运算,以产生第三个函数,该函数表示一个函数的形状如何被另一个修改。(来源:维基百科)

此操作在多个领域都有应用,如概率、统计、计算机视觉、自然语言处理、图像和信号处理、工程和微分方程。该操作在数学上表示为:

卷积操作

查看此链接以更加直观地了解卷积操作。

什么是人工神经网络?

人工神经网络(ANN)或连接系统是由构成动物大脑的生物神经网络模糊地启发的计算系统。这些系统通过从示例中“学习”以执行任务,通常不需要使用用任何特定规则来编程。(来源:维基百科)

人工神经网络是一个较小的处理单元集合,称为人工神经元,它们与生物神经元相似。

生物神经回路

生物神经回路

神经元之间的互联构成了一个网络模型

人工神经网络

人工神经网络

现在,我们开始具体实现。

导入必要的数据包

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

import tflearn.data_utils as du

from keras.models import Sequential

from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D

from keras.optimizers import RMSprop

from keras.preprocessing.image import ImageDataGenerator

from sklearn.metrics import confusion_matrix

加载数据集

train_data = pd.read_csv('../input/csvTrainImages 13440x1024.csv', header = None)

train_label = pd.read_csv('../input/csvTrainLabel 13440x1.csv', header = None)

test_data = pd.read_csv('../input/csvTestImages 3360x1024.csv', header = None)

test_label = pd.read_csv('../input/csvTestLabel 3360x1.csv', header = None)

数据集

此处使用的数据集是手写数据集。

trainIamges.csv有1024列和13440行。每列表示图像中的像素,每行表示一张单独的灰度图像。每个像素的取值范围是0到255之间的值。

train_data = train_data.iloc[:,:].values.astype('float32')

train_label = train_label.iloc[:,:].values.astype('int32')-1

test_data = test_data.iloc[:,:].values.astype('float32')

test_label = test_label.iloc[:,:].values.astype('int32')-1

可视化数据集

def row_calculator(number_of_images, number_of_columns):

if number_of_images % number_of_columns != 0:

return (number_of_images / number_of_columns)+1

else:

return (number_of_images / number_of_columns)

def display_image(x, img_size, number_of_images):

plt.figure(figsize = (8, 7))

if x.shape[0] > 0:

n_samples = x.shape[0]

x = x.reshape(n_samples, img_size, img_size)

number_of_rows = row_calculator(number_of_images, 4)

for i in range(number_of_images):

plt.subplot(number_of_rows, 4, i+1)

plt.imshow(x[i])

训练数据集

display_image(train_data, 32, 16)

训练数据集

测试数据集

display_image(test_data, 32, 16)

测试数据集

数据预处理

编码分类变量

什么是分类变量?

在统计学中,分类变量是一个可以承担限制变量之一的变量,基于某些定性属性将每个个体或其他观察单元分配给特定组或名义类别。(来源:维基百科)

简单来说,分类变量的值表示类别或类。

为什么需要编码分类变量?

直接对表示类别的数字执行操作没有意义。因此,需要对其进行分类编码。

请查看此链接以了解分类变量示例。

阿拉伯字母表中有28个字母。因此,数据集有28个类别。

train_label = du.to_categorical(train_label,28)

标准化

什么是标准化?

进行归一化以使整个数据进入明确定义的范围,一般选择归一化到0到1之间

在神经网络中,不仅要对数据进行标准化,还要对其进行标量化,这样处理的目的是能够更快地接近错误表面的全局最小值。(来源:Stack Overflow)

train_data = train_data/255

test_data = test_data/255

train_data = train_data.reshape([-1, 32, 32, 1])

test_data = test_data.reshape([-1, 32, 32, 1])

对其进行变形操作使得每条数据表示一个平面图像

train_data, mean1 = du.featurewise_zero_center(train_data)

test_data, mean2 = du.featurewise_zero_center(test_data)

按功能划分的零中心将每个样本的中心置零,并指定平均值。如果未指定,则对所有样品评估平均值。

建立CNN

recognizer = Sequential()

recognizer.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu', input_shape = (32,32,1)))

recognizer.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu'))

recognizer.add(MaxPool2D(pool_size=(2,2)))

recognizer.add(Dropout(0.25))

recognizer.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', activation ='relu'))

recognizer.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', activation ='relu'))

recognizer.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))

recognizer.add(Dropout(0.25))

recognizer.add(Flatten())

recognizer.add(Dense(units = 256, input_dim = 1024, activation = 'relu'))

recognizer.add(Dense(units = 256, activation = "relu"))

recognizer.add(Dropout(0.5))

recognizer.add(Dense(28, activation = "softmax"))

最大池化(Max Pooling)是什么?

池化意味着组合一组数据,组合数据的过程中应该遵循一些规则。

最大池还可以用于减小特征维度,它还可以避免过拟合的发生。查看此博客,以便更好地了解Max Pooling。

什么是Dropout?

Dropout是一种正则化技术,通过防止对训练数据进行复杂的协同适应来减少神经网络中的过拟合,这是神经网络模型中十分有效的方法之一。“ 丢失”指的是在神经网络中以某一个概率随机地丢弃部分神经单元。(来源:维基百科)

什么是Flatten?

对特征图进行展平,以将多维数据转换为一维特征向量,以供下一层(密集层)使用

什么是密集层?

密集层只是一层人工神经网络,也被称作全连接层。

CNN的优化方法

什么是优化?

优化算法帮助我们最小化(或最大化)目标函数,目标函数只是一个数学函数,取决于模型内部可学习的参数。模型中使用预测变量集(X)计算目标值(Y)。例如,我们将神经网络的权重(W)和偏差(b)值称为其内部可学习参数,用于计算输出值,并在最优解的方向上学习和更新这些参数,即最小化损失网络。这就是神经网络的训练过程。(来源:数据科学)

optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)

本文在这里使用的优化器是RMSprop,点击此处以了解有关RMSprop的更多信息。

recognizer.compile(optimizer = optimizer , loss = "categorical_crossentropy", metrics=["accuracy"])

什么是ImageDataGenerator?

当你的数据集规模比较小时,你可能会应用到图像数据生成器,它用于生成具有实时增强的批量张量图像数据,扩大数据集规模。一般而言,当数据量增多时,模型性能会得更好。以下代码用于批量加载图像:

datagen = ImageDataGenerator(

featurewise_center=False,

samplewise_center=False,

featurewise_std_normalization=False,

samplewise_std_normalization=False,

zca_whitening=False,

rotation_range=10,

zoom_range = 0.1,

width_shift_range=0.1,

height_shift_range=0.1,

horizontal_flip=False,

vertical_flip=False)

datagen.fit(train_data)

CNN拟合训练数据

recognizer.fit_generator(datagen.flow(train_data,train_label, batch_size=100), epochs = 30, verbose = 2, steps_per_epoch=train_data.shape[0] // 100)

做出预测

predictions = recognizer.predict(test_data)

predictions = np.argmax(predictions,axis = 1)

生成混淆矩阵

什么是混淆矩阵?

混淆矩阵是用于总结分类算法性能的一种技术。如果每个类别中的观察数量不等,或者数据集中有两个以上的类,单独的分类准确性可能会产生误导。计算混淆矩阵可以让我们更好地了解分类模型的正确性以及它所犯的错误类型。来源:machinelearningonline.blog

cm = confusion_matrix(test_label, predictions)

计算准确性

accuracy = sum(cm[i][i] for i in range(28)) / test_label.shape[0]

print("accuracy = " + str(accuracy))

本文获得了97%的准确度,感兴趣的读者可以自己尝试下。

CNN手写数字识别demo

点击此链接可以实时查看CNN的工作情况,该demo显示了CNN的工作过程,以及每层输出的特征图。最后该CNN网络经过训练后能够识别手写数字。

以上为译文,由阿里云云栖社区组织翻译。

译文链接

文章原标题《Convolutional Neural Network — A Bird’s eye view with an implementation》,译者:海棠,审校:Uncle_LLD。

文章为简译,更为详细的内容,请查看原文。

python 卷积神经网络 应用_卷积神经网络概述及python实现相关推荐

  1. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

  2. 卷积神经网络结构_卷积神经网络

    卷积神经网络结构 CNN's are a special type of ANN which accepts images as inputs. Below is the representation ...

  3. cnn卷积神经网络应用_卷积神经网络(CNN):应用的核心概念

    cnn卷积神经网络应用 In this tutorial, we'll work through the core concepts of convolutional neural networks ...

  4. 人工神经网络 神经网络区别_人工神经网络概述

    人工神经网络 神经网络区别 Artificial neural networks (ANN) in machine learning (artificial intelligence) are com ...

  5. 神经网络推理_分析神经网络推理性能的新工具

    神经网络推理 Measuring the inference time of a trained deep neural model on different hardware devices is ...

  6. 膨胀卷积的缺点_卷积、反卷积与膨胀卷积

    卷积(多---->1 的映射) 本质:在对输入做9--->1的映射关系时,保持了输出相对于input中的位置性关系 对核矩阵做以下变形:卷积核的滑动步骤变成了卷积核矩阵的扩增 卷积的矩阵乘 ...

  7. 跟着迪哥学python 经管之家_跟着迪哥学Python数据分析与机器学习实战

    本书结合了机器学习.数据分析和Python语言,通过案例以通俗易懂的方式讲解了如何将算法应用到实际任务. 全书共20章,大致分为4个部分.第一部分介绍了Python的工具包,包括科学计算库Numpy. ...

  8. python数据分析模块包括_数据开发必会 | Python数据分析模块

    作为数据开发,Python强大的数据分析模块还是必须要会的,横向拓展数据分析与挖掘技术栈也是很有必要的.本文将对Pandas.NumPy.SciPy.Matplotlib等分析挖掘库的安装和使用进行简 ...

  9. python数据科学入门_干货!小白入门Python数据科学全教程

    前言本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据工 ...

  10. anaconda下使用python怎样实现图像增强_如何用anaconda进行python开发

    展开全部 序 Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,32313133353236313431303231363533e58685e5aeb9313333 ...

最新文章

  1. 基于Guava实现的文件复制
  2. gtp怎么安装系统_UEFI+GTP模式下使用GHO文件安装WIN7或WIN8系统图文教程详解
  3. elasticSearch6源码分析(4)indices模块
  4. java8中-_java8中的Stream
  5. 原来不只是fastjson,这个你每天都在用的类库也被爆过反序列化漏洞!
  6. #35 string(缩点+动态规划)
  7. 收藏 | 深度学习19个损失函数汇总
  8. 《Scikit-Learn与TensorFlow机器学习实用指南》第11章 训练深层神经网络
  9. Kitura —— 基于 Swift 的 Web 框架
  10. 重磅消息:全球首个光量子计算机诞生!
  11. 数据库_day03_对数据库的基本操作
  12. python3入门代码-Python3零基础自学方法?
  13. 【雷达通信】基于matlab多普勒连续波测速【含Matlab源码 642期】
  14. Java中的成员变量和局部变量
  15. 青少年计算机等级测试内容,青少年人工智能技术水平测试一级等级考试介绍
  16. 安卓手机如何让你的微信减肥不卡顿
  17. sdffdsfsdfdfssfsfsfsdfsdffds/sdfsDSFsd
  18. Java:Java和C有什么区别?
  19. 【高项】风险管理(ITTO)
  20. 笨方法学python 41:来自 Percal 25 号行星的哥顿人 (Gothons)

热门文章

  1. 微客零工驿站v2.3.0 零工 零工驿站 零工市场
  2. CANOpen 配置对象字典 $NODEID
  3. 深入解析python版SVM源码系列(三)——计算样本的预测类别
  4. 倍福--CanOPEN的实现
  5. SSL certificate problem: unable to get local issuer certificate解决办法
  6. 如何在试用版Visifire展示的Charts中去掉水印
  7. SonicWALL防火墙恢复出厂设置Reset
  8. Ftest(F检验)
  9. 在网页中 生成QQ在线临时对话框/聊天
  10. 又遇www.9348.cn劫持IE浏览器