您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center 汽车系统工程   模型库  
会员   
   
嵌入式软件测试方法&实践
3月20日 线上
需求分析与管理
4月21-22日 北京+线上
SysML和EA进行系统设计建模
4月23-24日 北京+线上
     
   
 订阅
  捐助
使用卷积神经网络和 Python 进行图像分类
 
作者 : 磬怼怼
  1071  次浏览      32
 2021-12-20
 
编辑推荐:
本文将讨论有关图像分类的所有内容 ,希望对您的学习有所帮助。
本文来自于深度学习与计算机视觉 ,由火龙果软件Alice编辑、推荐。

介绍

本文将讨论有关图像分类的所有内容。

在过去的几年里,深度学习已经被证明是一个非常强大的工具,因为它能够处理大量的数据。隐藏层的使用超越了传统技术,尤其是在模式识别方面。最受欢迎的深度神经网络之一是卷积神经网络 (CNN)。

卷积神经网络(CNN)是一种用于图像识别和处理的 人工神经网络(ANN) ,专门用于处理数据(像素)。

在进一步研究之前,我们需要了解什么是神经网络.

神经网络

一个神经网络由几个相互连接的节点构成,称为**“神经元” 。神经元分为 输入层、隐藏层和输出层。**输入层对应于我们的预测器/特征,输出层对应于我们的响应变量。

多层感知器(MLP)

具有输入层、一个或多个隐藏层和一个输出层的神经网络称为 多层感知器 (MLP)。 MLP 是 Frank Rosenblatt 在 1957 年发明的。下面给出的 MLP 有 5 个输入节点、5 个带有两个隐藏层的隐藏节点和一个输出节点

这个神经网络是如何工作的?

– 输入层神经元接收来自数据的传入信息,它们处理并分配给隐藏层。 – 该信息依次经过隐藏层处理,并传递给输出神经元。 – 该人工神经网络 (ANN) 中的信息根据一个 激活函数进行处理 。这个函数实际上模仿了大脑神经元。 – 每个神经元包含一个激活函数值和一个阈值。 – 阈值 是输入必须具有的最小值才能被激活。 – 神经元的任务是对所有输入信号进行加权求和,并对总和应用激活函数,然后再将其传递到下一个(隐藏或输出)层。

让我们了解什么是权重和?

假设我们有值a1、a2、a3、a4?4作为输入,权重为w1、w2、w3、w4作为隐藏层神经元??之一的输入,那么加权和表示为

其中bj :由节点引起的偏差

什么是激活函数?

需要这些函数来将非线性引入网络。应用激活函数并将该输出传递到下一层。 可能的函数 Sigmoid:Sigmoid 函数是可微的。它产生 0 到 1 之间的输出。 双曲正切:双曲正切也是可微的。它会产生 -1 和 1 之间的输出。 ReLU:ReLU 是最受欢迎的函数。ReLU 在深度学习中被广泛使用。 Softmax:softmax 函数用于多类分类问题。它是 sigmoid 函数的推广。它还产生 0 到 1 之间的输出 现在,让我们继续我们的话题 CNN……

CNN

现在假设有一张鸟的图像,你想确定它是真的鸟还是其他什么东西。你应该做的第一件事是以数组的形式将图像的像素馈送到神经网络(用于对此类事物进行分类的 MLP 网络)的输入层。 隐藏层通过执行各种计算和操作来进行特征提取。有多个隐藏层,如卷积、ReLU 和从图像中执行特征提取的池化层。 最后,你可以看到一个全连接层,它可以识别图像中的确切对象。 你可以很容易的从下图理解:

卷积

卷积运算涉及矩阵算术运算,每个图像都以值(像素)数组的形式表示。 让我们理解示例: a = [2,5,8,4,7,9] b = [1,2,3] 在卷积运算中,数组逐个元素地相乘,乘积被分组或求和以创建一个表示 a*b 的新数组。 矩阵 a 的前三个元素现在乘以矩阵 b 的元素。乘积相加得到结果并存储在一个新的 a*b 数组中**。** 这个过程一直持续到操作完成。

池化

在卷积之后,还有一个称为池化的操作。因此,在这个链中,卷积和池化依次应用于数据以从数据中提取一些特征。 在连续的卷积层和池化层之后,数据被展平成一个前馈神经网络,也称为多层感知器。

到目前为止,我们已经看到了对我们构建 CNN 模型很重要的概念。 现在我们将继续看 CNN 的案例研究。

1)在这里,我们将导入执行 CNN 任务所需的必要库。
import NumPy as np
%matplotlib inline
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import TensorFlow as tf
tf.compat.v1.set_random_seed( 2019 )

2)这里我们需要下面的代码来形成CNN模型

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D( 16 ,( 3 , 3 ),activation = "relu" ,
input_shape = ( 180 , 180 , 3 )) ,
tf.keras.layers.MaxPooling2D( 2 , 2 ),
tf.keras.layers.Conv2D( 32 ,( 3 , 3 ),activation = "relu" ) ,
tf.keras.layers.MaxPooling2D( 2 , 2 ),
tf.keras.layers.Conv2D( 64 ,( 3 , 3 ),activation = "relu" ) ,
tf.keras.layers.MaxPooling2D( 2 , 2 ),
tf.keras.layers.Conv2D( 128 ,( 3 , 3 ),activation = "relu" ),
tf.keras.layers.MaxPooling2D( 2 , 2 ),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense( 550 ,activation= "relu" ),
#Adding the Hidden layer
tf.keras.layers.Dropout( 0.1 ,seed = 2019 ),
tf.keras.layers.Dense( 400 ,activation = "relu" ),
tf.keras.layers.Dropout( 0.3 ,seed = 2019 ),
tf.keras.layers.Dense( 300 ,activation= "relu" ),
tf.keras.layers.Dropout( 0.4 ,seed = 2019 ),
tf.keras.layers.Dense( 200 ,activation = "relu" ),
tf.keras.layers.Dropout( 0.2 ,seed = 2019 ),
tf.keras.layers.Dense( 5 ,activation = "softmax" )
#Adding the Output Layer
])

一个卷积的图像可能太大了,因此在不丢失特征或模式的情况下将其缩小,即完成了池化。 这里创建一个神经网络就是使用Keras的Sequential模型来初始化网络。 Flatten() - Flattening 将二维特征矩阵转换为特征向量。

3)现在让我们看一下CNN模型的总结

model.summary()

它将打印以下输出

Model: "sequential"

Layer (type) Output Shape Param #

conv2d (Conv2D) ( None , 178 , 178 , 16 ) 448

max_pooling2d (MaxPooling2D) ( None , 89 , 89 , 16 ) 0

conv2d_1 (Conv2D) ( None , 87 , 87 , 32 ) 4640

max_pooling2d_1 (MaxPooling2 ( None , 43 , 43 , 32 ) 0

conv2d_2 (Conv2D) ( None , 41 , 41 , 64 ) 18496

max_pooling2d_2 (MaxPooling2 ( None , 20 , 20 , 64 ) 0

conv2d_3 (Conv2D) ( None , 18 , 18 , 128 ) 73856

max_pooling2d_3 (MaxPooling2 ( None , 9 , 9 , 128 ) 0

flatten (Flatten) ( None , 10368 ) 0

dense (Dense) ( None , 550 ) 5702950

dropout (Dropout) ( None , 550 ) 0

dense_1 (Dense) ( None , 400 ) 220400

dropout_1 (Dropout) ( None , 400 ) 0

dense_2 (Dense) ( None , 300 ) 120300

dropout_2 (Dropout) ( None , 300 ) 0

dense_3 (Dense) ( None , 200 ) 60200

dropout_3 (Dropout) ( None , 200 ) 0

dense_4 (Dense) ( None , 5 ) 1005

Total params: 6 , 202 , 295
Trainable params: 6 , 202 , 295
Non-trainable params: 0

现在我们需要指定优化器。

from tensorflow.keras.optimizers import RMSprop,SGD,Adam
adam=Adam(lr= 0.001 )
model.compile(optimizer= 'adam' ,
loss= 'categorical_crossentropy' , metrics = [ 'acc' ])

Optimizer - 优化器用于降低交叉熵计算的成本

loss - 损失函数用于计算误差

metrics - 度量项用于表示模型的效率

5)在这一步中,我们将看到如何设置数据目录和生成图像数据。

bs= 30 #Setting batch size
train_dir = "D:/Data Science/Image Datasets/
FastFood/train/" #Setting training directory
validation_dir = "D:/Data Science/Image Datasets/
FastFood/test/" #Setting testing directory
from tensorflow.keras.preprocessing.
image import ImageDataGenerator
# All images will be rescaled by 1./255.
train_datagen = ImageDataGenerator( rescale = 1.0 / 255. )
test_datagen = ImageDataGenerator( rescale = 1.0 / 255. )
# Flow training images in batches of 20 using train_datagen generator
#Flow_from_directory function lets the classifier
directly identify the labels from the name of
the directories the image lies in
train_generator=train_datagen.flow_from_directory
(train_dir,batch_size=bs,class_mode= 'categorical' ,
target_size=( 180 , 180 ))
# Flow validation images in batches of 20 using test_datagen generator
validation_generator = test_datagen.flow_from_directory
(validation_dir,
batch_size=bs,
class_mode = 'categorical' ,
target_size=( 180 , 180 ))

 

输出将是:

Found 1465 images belonging to 5 classes.
Found 893 images belonging to 5 classes.

6.拟合模型的最后一步。

history = model.fit(train_generator,
validation_data=validation_generator,
steps_per_epoch= 150 // bs,
epochs= 30 ,
validation_steps= 50 // bs,
verbose= 2 )

输出将是:

Epoch 1 / 30
5 / 5 - 4 s - loss: 0.8625 - acc: 0.6933 - val_loss:
1.1741 - val_acc: 0.5000 Epoch 2 / 30
5 / 5 - 3 s - loss: 0.7539 - acc: 0.7467 - val_loss:
1.2036 - val_acc: 0.5333 Epoch 3 / 30
5 / 5 - 3 s - loss: 0.7829 - acc: 0.7400 - val_loss:
1.2483 - val_acc: 0.5667 Epoch 4 / 30
5 / 5 - 3 s - loss: 0.6823 - acc: 0.7867 - val_loss:
1.3290 - val_acc: 0.4333 Epoch 5 / 30
5 / 5 - 3 s - loss: 0.6892 - acc: 0.7800 - val_loss:
1.6482 - val_acc: 0.4333 Epoch 6 / 30
5 / 5 - 3 s - loss: 0.7903 - acc: 0.7467 - val_loss:
1.0440 - val_acc: 0.6333 Epoch 7 / 30
5 / 5 - 3 s - loss: 0.5731 - acc:
0.8267 - val_loss: 1.5226 - val_acc: 0.5000 Epoch 8 / 30
5 / 5 - 3 s - loss: 0.5949 - acc: 0.8333 - val_loss:
0.9984 - val_acc: 0.6667 Epoch 9 / 30
5 / 5 - 3 s - loss: 0.6162 - acc: 0.8069 - val_loss:
1.1490 - val_acc: 0.5667 Epoch 10 / 30
5 / 5 - 3 s - loss: 0.7509 - acc: 0.7600 - val_loss:
1.3168 - val_acc: 0.5000 Epoch 11 / 30
5 / 5 - 4 s - loss: 0.6180 - acc: 0.7862 - val_loss:
1.1918 - val_acc: 0.7000 Epoch 12 / 30
5 / 5 - 3 s - loss: 0.4936 - acc: 0.8467 - val_loss:
1.0488 - val_acc: 0.6333 Epoch 13 / 30
5 / 5 - 3 s - loss: 0.4290 - acc: 0.8400 - val_loss:
0.9400 - val_acc: 0.6667 Epoch 14 / 30
5 / 5 - 3 s - loss: 0.4205 - acc: 0.8533 - val_loss:
1.0716 - val_acc: 0.7000 Epoch 15 / 30
5 / 5 - 4 s - loss: 0.5750 - acc:
0.8067 - val_loss: 1.2055 - val_acc: 0.6000 Epoch 16 / 30
5 / 5 - 4 s - loss: 0.4080 - acc: 0.8533 - val_loss:
1.5014 - val_acc: 0.6667 Epoch 17 / 30
5 / 5 - 3 s - loss: 0.3686 - acc: 0.8467 - val_loss:
1.0441 - val_acc: 0.5667 Epoch 18 / 30
5 / 5 - 3 s - loss: 0.5474 - acc: 0.8067 - val_loss:
0.9662 - val_acc: 0.7333 Epoch 19 / 30
5 / 5 - 3 s - loss: 0.5646 - acc: 0.8138 - val_loss:
0.9151 - val_acc: 0.7000 Epoch 20 / 30
5 / 5 - 4 s - loss: 0.3579 - acc: 0.8800 - val_loss:
1.4184 - val_acc: 0.5667 Epoch 21 / 30
5 / 5 - 3 s - loss: 0.3714 - acc: 0.8800 - val_loss:
2.0762 - val_acc: 0.6333 Epoch 22 / 30
5 / 5 - 3 s - loss: 0.3654 - acc: 0.8933 - val_loss:
1.8273 - val_acc: 0.5667 Epoch 23 / 30
5 / 5 - 3 s - loss: 0.3845 - acc: 0.8933 - val_loss:
1.0199 - val_acc: 0.7333 Epoch 24 / 30
5 / 5 - 3 s - loss: 0.3356 - acc:
0.9000 - val_loss: 0.5168 - val_acc: 0.8333 Epoch 25 / 30
5 / 5 - 3 s - loss: 0.3612 - acc: 0.8667 - val_loss:
1.7924 - val_acc: 0.5667 Epoch 26 / 30
5 / 5 - 3 s - loss: 0.3075 - acc: 0.8867 - val_loss:
1.0720 - val_acc: 0.6667 Epoch 27 / 30
5 / 5 - 3 s - loss: 0.2820 - acc: 0.9400 - val_loss:
2.2798 - val_acc: 0.5667 Epoch 28 / 30
5 / 5 - 3 s - loss: 0.3606 - acc: 0.8621 - val_loss:
1.2423 - val_acc: 0.8000 Epoch 29 / 30
5 / 5 - 3 s - loss: 0.2630 - acc: 0.9000 - val_loss:
1.4235 - val_acc: 0.6333 Epoch 30 / 30
5 / 5 - 3 s - loss: 0.3790 - acc: 0.9000 - val_loss:
0.6173 - val_acc: 0.8000

上述函数使用训练集训练神经网络,并在测试集上评估其性能。 函数为每个时期返回两个度量' acc '和' val_acc ',分别是在训练集中获得的预测的准确性和在测试集中获得的准确性。

结论

因此,我们看到已经达到了足够的精度。但是,任何人都可以通过增加时期数或任何其他参数来运行此模型。

 

 


 

   
1071 次浏览       32
相关文章

基于图卷积网络的图深度学习
自动驾驶中的3D目标检测
工业机器人控制系统架构介绍
项目实战:如何构建知识图谱
 
相关文档

5G人工智能物联网的典型应用
深度学习在自动驾驶中的应用
图神经网络在交叉学科领域的应用研究
无人机系统原理
相关课程

人工智能、机器学习&TensorFlow
机器人软件开发技术
人工智能,机器学习和深度学习
图像处理算法方法与实践
最新活动计划
嵌入式软件架构设计 12-11[北京]
LLM大模型与智能体开发实战 12-18[北京]
嵌入式软件测试 12-25[北京]
AI原生应用的微服务架构 1-9[北京]
AI大模型编写高质量代码 1-14[北京]
需求分析与管理 1-22[北京]
 
最新文章
多目标跟踪:AI产品经理需要了解的CV通识
深度学习架构
卷积神经网络之前向传播算法
从0到1搭建AI中台
工业机器人控制系统架构介绍
最新课程
人工智能,机器学习和深度学习
人工智能与机器学习应用实战
人工智能-图像处理和识别
人工智能、机器学习& TensorFlow+Keras框架实践
人工智能+Python+大数据
更多...   
成功案例
某综合性科研机构 人工智能与机器学习应用
某银行 人工智能+Python+大数据
北京 人工智能、机器学习& TensorFlow框架实践
某领先数字地图提供商 Python数据分析与机器学习
中国移动 人工智能、机器学习和深度学习
更多...