QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3347|回复: 0
打印 上一主题 下一主题

使用卷积神经网络开发图像分类模型

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型
    5 F$ p& Y% V4 H, R1 J# o& [简介
    ' }' B  e5 D7 |9 K3 a1 n: ]# i! S& y8 T
    这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
    2 }( X- K. `/ v3 b: V  K) Y' C% P
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    5 I% [! |1 N. m4 O" a, c7 q9 ]% J; E/ u  A
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
    ( e  d3 O0 e/ L& Q1 L7 \
    1 }/ U8 h/ @3 Q: b实施  S6 S8 |3 S0 a
    # Q; e' d5 j; ]/ t6 b) \
    # importing necessary libraries" ~- R- A9 Q% r: S2 j7 h6 o/ E2 f
    import numpy as np/ g2 j7 k6 V5 i0 H  \) K
    import matplotlib.pyplot as plt
    % W% s* D2 x7 T3 O8 n* G%matplotlib inline* ]) p  h0 M3 p$ A! T
    # To convert to categorical data
    + P: L0 `/ k( c2 t5 \# o- R7 ?from tensorflow.keras.utils import to_categorical
    & Q- }& r' i9 ?. J1 ?# L3 C5 I#libraries for building model
    9 r3 v7 i7 X6 d5 N4 M$ w& v8 ifrom tensorflow.keras.models import Sequential& v: b9 `* G6 Q  N- P" S. l
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten) t  p2 c% {# J. c  k0 v+ T
    from tensorflow.keras.datasets import cifar10
    + C% J' v- G0 B! F; e; a1 F
    4 d2 L' }3 ]0 Z  E9 N7 {#loading the data: `& d: r1 B, [+ }# W
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()% c! U) Q, x2 Y' r5 w" n

    7 t6 D5 V: {. l5 ]  f; G+ t探索性数据分析
    / v2 L) U: D6 l9 _, T: y- t  S/ Q% d#shape of the dataset
    + {' Q, M% |( d( S2 q$ m4 Hprint(X_train.shape)
    : F5 o/ I  N+ s9 d2 s0 H! w8 fprint(y_train.shape)# Z0 H! p! y8 R( S0 F7 {. ]
    print(X_test.shape)% _/ N. N6 Q8 [) I
    print(y_test.shape)
    ! u/ Q: f3 R  C  t% |0 S& q+ G6 a* A, D
    4 U" M9 ~; M$ ^
    我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝). I$ @! C3 t& u
    #checking the labels
    8 F/ K; X: j/ u" d) Fnp.unique(y_train)+ g4 Q+ R+ F9 P7 F# O

    ; g" G% J% k. z7 z4 Z& R
    . ~* _# G, l/ ?0 O4 m8 ]5 ~#first image of training data
    3 Q2 G1 E  ~" L1 rplt.subplot(121)
    8 m- N! x- N. Z( N; L; o+ Qplt.imshow(X_train[0])! n& t8 z/ |5 b8 h; ^; ^- y
    plt.title("Label : {}".format(y_train[0]))* b. S5 B2 O3 _  i
    #first image of test data& G( p9 ^4 t& `& o
    plt.subplot(122)
    ) c8 t* d% n# h, M, o8 @plt.imshow(X_test[0])9 Q9 i: h7 z, D' W$ ^! z
    plt.title("Label : {}".format(y_test[0]));
    5 q- ?. J/ g" i  t
    * |6 G9 O: q" _8 ~- [: \6 S( y2 Z$ S6 m. {
    #visualizing the first 20 images in the dataset
    % X  n6 [" k- o7 {0 G5 \# A0 [! a8 \for i in range(20):
    ( G/ g; Q! g5 K) ]( q; Q. t) a9 O    #subplot2 H( p, z+ E+ F; O( r7 T
        plt.subplot(5, 5, i+1)# s2 i5 [" X5 x. Z+ Y
        # plotting pixel data0 h) U( x, R, C' K! X
        plt.imshow(X_train, cmap=plt.get_cmap('gray'))
    / s3 r: a/ ^" n/ A  t9 }# show the figure! X* z" x3 y1 ?$ }0 B7 j" r0 ]- r
    plt.show()
    ! J! a2 V: V; m! l, V
    * _( m/ H% N9 ^' I& Q0 k; d3 k: ^" k3 U8 j
    预处理数据

    对于数据预处理,我们只需要在这里执行两个步骤,首先是缩放图像的像素值到0到1之间,然后是将标签从 2D 重塑为 1D

    8 L) w: j+ x: `) j9 p; R$ T$ I
    # Scale the data to lie between 0 to 1
    8 S# Y3 W+ h( c! C# R+ D! I/ PX_train = X_train/255
    % l% Q6 |1 F- NX_test = X_test/255
    # W4 U, Y4 r& V  @print(X_train)8 c/ {* S2 F( f0 Y0 N4 |. k
    : ~& M* Q& {/ |' j/ m& A

    + h5 U/ n2 M: t9 ?8 b#reshaping the train and test lables to 1D5 d' E% }% K, A+ M5 U
    y_train = y_train.reshape(-1,)
    6 h: m5 H4 x5 Vy_test = y_test.reshape(-1,)1 A' r' U) T1 {4 l; ]6 `/ [0 Y

    - I$ D; O- Z# m8 e我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
    ; R2 W& d4 G0 Z+ S模型搭建

    正如我们之前讨论的,深度学习模型的构建分为 5 个步骤,即定义模型、编译模型、拟合模型、评估模型和进行预测,这也是我们在这里要做的。

    ) Z  R/ D/ Y7 p) I7 q
    model=Sequential()
    4 a. Q& G( ?  Q) t8 `# S. Z2 M#adding the first Convolution layer
    1 b" I+ q6 S$ J' I& p5 Cmodel.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))( o1 H7 m) |; c9 E" U
    #adding Max pooling layer3 R$ V) z3 k! M1 H, }& c
    model.add(MaxPool2D(2,2))1 G7 s& |. l  j; W6 k, @
    #adding another Convolution layer
    9 }! j# E- i" M" L; Imodel.add(Conv2D(64,(3,3),activation='relu'))
    ! y7 ?3 D/ Q3 i; @$ V* f$ vmodel.add(MaxPool2D(2,2))
    0 d5 S( l4 O# p& Lmodel.add(Flatten())
    $ p* t3 ~! @8 f#adding dense layer* Y: z, T, o1 ]  g, L% o
    model.add(Dense(216,activation='relu'))
    4 ~1 n4 R3 K1 U( c#adding output layer3 W" g5 _+ G7 l# d" Z
    model.add(Dense(10,activation='softmax'))
    # @6 D3 S) {1 G: H' T& @5 o0 ?/ w, W; L5 `4 j& d; w# I
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。
    & D4 f/ F: k6 K  O0 @% [5 Q2 s4 o1 i8 N  z6 f
    接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/9 q( P, c$ ~# K$ Y+ H* N  X5 e

    * ^2 O$ L7 T3 E. `& D1 c" h5 h然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    8 Y) G& Y# _! J6 r+ I) F1 g6 b  t" G; p! Y
    在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。! }5 [* A; U# v3 _- l  W+ n7 N8 D( M

    3 j. e& W& t; ], ], z6 z最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。: @: o( F* j" p: N# Q* h

    , C' L9 @+ ~( B% f, q第 2 步:编译模型5 _+ b  t7 t* g9 B4 {
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])$ V# {& x: V+ p* g$ E6 a  H# ?
    $ }, @1 g7 O' c7 j4 n# ?3 b8 N$ `
    第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)& G& b* C' }: ~  G6 G2 t

    % ~1 p; L$ r- O4 g; Y2 L" j1 F+ ]& J6 L7 ?+ z
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。: {% ^- q. [+ h6 H
    第 4 步:评估模型model.evaluate(X_test,y_test)+ M0 o. \0 O8 a, |0 B' Z, b. w
    , r  M/ }$ k$ b6 {( I% N
    $ o% o7 N7 I7 Y' I  _% m, k. d. Q
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    8 j4 [; r* l  R$ I& f7 Q" Q( {第 5 步:进行预测+ D+ s% s" J( f6 |' |. Q# x" ^6 I
    pred=model.predict(X_test)
    " G; {% i4 x0 @5 d, m+ \% T#printing the first element from predicted data+ {  g+ e) x2 j2 M) \- [5 u
    print(pred[0])
    4 b& m) O) Y# Z; J% n#printing the index of 1 O0 i9 @1 D' J* U, m; W1 p7 c
    print('Index:',np.argmax(pred[0]))
    1 Q! a. ]5 P3 q# R+ S, z, E0 Y; B3 D1 i) r- F+ o
    7 a$ U" Q) k7 v

    ' u" o# G: V* s# l+ Y: Q

    因此,预测函数给出的是所有10个标签的概率值,概率最高的标签是最终预测。在我们的例子中,我们得到了第三个索引处的标签作为预测。

    将预测值与实际值进行比较以查看模型执行的正确程度。

    在下图中,我们可以看到预测值与实际值的差异。

    y_classes = [np.argmax(element) for element in pred]
    + g; E& e# v1 Cprint('Predicted_values:',y_classes[:10])
    - N3 J7 h% j! w: _4 I( F5 D# oprint('Actual_values:',y_test[:10])
    8 g. Y4 r# m9 H2 z3 ?3 A. b. E  r2 I1 i& e- v/ A5 m
    # _) ]9 A0 x9 k- `& a

    当我们看到我们的模型过度拟合时,我们可以使用一些额外的步骤来提高模型性能并减少过度拟合,例如向模型添加 Dropouts或执行数据增强,因为过度拟合问题也可能是由于可用数据量较少。

    在这里,我将展示我们如何使用 Dropout 来减少过拟合。我将为此定义一个新模型。

    . I" u; d& U6 q; b7 _# P$ @
    model4=Sequential()- j  g4 S# m% [3 _
    #adding the first Convolution layer
    3 z/ Y0 t  Y% t; ]" O1 |model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3))); r0 W- ?' C* _: c$ S
    #adding Max pooling layer1 ~" t3 p' A0 ~, L& V
    model4.add(MaxPool2D(2,2))
    7 N: v1 v+ ]* T9 [3 b#adding dropout" h4 ~2 d8 J8 i, {, f
    model4.add(Dropout(0.2))
    / C) X& i7 l/ U8 i6 m) o0 B#adding another Convolution layer
    6 z5 {( L- |- h" `1 ^: Omodel4.add(Conv2D(64,(3,3),activation='relu'))
    2 b; a2 W/ w8 o# Bmodel4.add(MaxPool2D(2,2))2 @; I+ u$ G7 ]( s4 Q; @7 S$ B
    #adding dropout4 e& J( z& o6 Y' K3 J
    model4.add(Dropout(0.2))4 @! G" X& N2 W1 Q0 t! v2 J8 b
    model4.add(Flatten())% h! K2 O  m! J# y
    #adding dense layer0 d3 s) s! G3 U" |/ p
    model4.add(Dense(216,activation='relu'))3 l9 D4 }: B/ n7 D7 h
    #adding dropout4 I) h7 {, n/ C. N
    model4.add(Dropout(0.2))
    3 B3 u/ a) f- w5 C# q- Y#adding output layer& G, g% v: l( _% E4 Y0 p
    model4.add(Dense(10,activation='softmax'))
    8 L  w' j  t8 \3 q7 H8 K9 A* T4 N, Xmodel4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])' D' |' _% S3 Y/ F
    model4.fit(X_train,y_train,epochs=10)
    + `' \+ y2 ?. L- s- {, N9 d' A
    * _& [" w( T; h6 V, W9 ^& C
    ! W& G! E4 ?% ?0 pmodel4.evaluate(X_test,y_test), g5 y0 A9 x( i/ t. ?8 D: ]8 p3 e% G7 D

    & K5 K+ a: g: L5 e6 d7 z通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
    # n: D2 w* {: _/ X) }2 a( W& u( C  I, q8 o. }, L
    尾注4 ?/ X4 A4 Z# A9 k) K
    这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。7 h8 |! ]2 Y5 l+ `; ?9 ^3 A1 Q) \
    8 F  t* T) e( m4 c
    5 n+ Y$ T3 M/ Q- @: E) J/ L

    ( t9 ]( c9 i9 k) n2 Z0 m2 p
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-17 15:19 , Processed in 1.079391 second(s), 50 queries .

    回顶部