QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型8 X& ~: ?/ C  `
    简介
    / s1 X/ D" L% h+ P5 K
    : P4 {; `# S1 S) @0 O5 r9 t这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。+ |) j2 y2 B- J3 V9 W1 v

    6 i/ w. b" f7 P/ N% k, k简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    # Q) w% y+ n6 @  I9 {( [
    ; Z; e, P# m8 K  g今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。8 W$ j3 l" I; ?, _; b# G

    % T% L: O9 O$ X9 c7 v! I实施
    - g0 j$ n/ |3 Y$ x' V8 q) ^4 ?9 E% i$ g$ e% _3 F* f0 c
    # importing necessary libraries! g& D4 ]7 r7 r! ]. k
    import numpy as np
    4 C, r# c) {( m3 S5 Q$ d9 D) a! Pimport matplotlib.pyplot as plt
    & l! I. G! A6 p- W%matplotlib inline
    7 J7 I, G" w+ ]# To convert to categorical data
    * ?) z0 k6 R! r7 ^from tensorflow.keras.utils import to_categorical
    & F7 Q9 ^# w. M1 I; K% m2 O2 E8 t6 i#libraries for building model
    $ j8 b0 W7 p/ Z, G" F8 @7 I- gfrom tensorflow.keras.models import Sequential4 \1 C, W( k2 o- d+ Y
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    $ y3 w. _" M) [- _) L" I1 Vfrom tensorflow.keras.datasets import cifar107 W2 l2 a6 P; V1 y  x) g
    4 a( h2 o% t% u" H+ Z# i
    #loading the data
    1 H# C5 ~8 _) _% _" i' l5 w/ @(X_train, y_train), (X_test, y_test) = cifar10.load_data()
    . n( }/ z9 M1 F5 s! d2 `$ Y
    ( |* W/ q+ y* _探索性数据分析
    * x. l' Q& ?, e- w7 f4 a  D#shape of the dataset
    " o# K2 k. k* W6 q- `6 ?6 ]print(X_train.shape)
    , v# q1 g, z( A' P3 h$ {print(y_train.shape)
    ; Q9 k; @8 h" [/ F1 vprint(X_test.shape)
    " ?/ F' ^6 p! O7 W3 U4 y  ~. zprint(y_test.shape)! v2 \7 z) F( l8 B& O% _
    - e) D1 i! a: D  E- P1 h' y' g" u( a6 Z
    1 ^: L, w. j( Z& U; y* @! N
    我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)6 h5 |4 N" ~3 g; l$ B! {. t0 K  a
    #checking the labels 5 Y1 z# N* N7 j6 W) N
    np.unique(y_train)4 i; h% x+ M% {5 p4 J: W/ {
    / l, ~5 N; W( E6 L% i
    " g, P$ `! Q  H& ^, @" Y( }- P
    #first image of training data- z; m. b$ j; I5 k8 U7 N" C9 m1 L2 r
    plt.subplot(121)5 P  X* U, U# H. I0 W5 a
    plt.imshow(X_train[0])
    , R) O* ]3 J8 a9 \$ _4 lplt.title("Label : {}".format(y_train[0]))! B2 G; A8 o4 [8 i! v* v
    #first image of test data  b. }& m: r6 f2 V0 g/ O+ T
    plt.subplot(122)6 J$ J8 B+ w2 S5 U6 l& I& C
    plt.imshow(X_test[0])
    0 L6 N; Y( [4 q" F+ Pplt.title("Label : {}".format(y_test[0]));
    6 W. A6 y' P. y$ Q0 U6 E. S4 W! a1 D# U, K/ E
    2 b& H5 j5 q& q
    #visualizing the first 20 images in the dataset
    / b  I$ f3 J/ h5 gfor i in range(20):
    # t/ r9 z: Q4 [/ U6 r0 D    #subplot) C1 e  C* l+ P
        plt.subplot(5, 5, i+1)
    5 O$ u: `. ~9 A& S6 R    # plotting pixel data* G1 P! g# k' L( u
        plt.imshow(X_train, cmap=plt.get_cmap('gray'))
    * a) m: v  u. t: A- M# show the figure  l- U, G2 T% }
    plt.show()
    3 z; s  y# H0 X$ [& S" x* r: z: J7 M: T9 F3 Z& j9 C
    * I, f/ H# b; ?$ K$ \
    预处理数据

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

    7 H9 V8 \2 l/ A: z1 |( v' a; l
    # Scale the data to lie between 0 to 1( n4 F! [8 x8 e% W7 P
    X_train = X_train/255
    ' S$ V: s" T8 n* uX_test = X_test/255
    7 i8 ~& v* w" }: _; ^1 Qprint(X_train)
    , W: l1 x: v# Y8 T; N2 I
    + Y' R- n- o* t  g& S
    3 y7 j& k- N& q) i! b#reshaping the train and test lables to 1D6 K+ d* K+ s5 k& C
    y_train = y_train.reshape(-1,)
    , Z2 n! C  i; n, k/ Vy_test = y_test.reshape(-1,)% R9 ~2 w+ r, g# Y3 R0 o8 X% m1 b$ F

    # q% m  g1 l- R( f4 _- s我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
    ; Y! ~# X; g' j! I. _3 J模型搭建

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

    0 f! |9 R1 ^  E7 k3 j% o- I' x* Q
    model=Sequential(), P+ |4 Y2 P8 A3 x
    #adding the first Convolution layer
    ! A. J8 P; S/ kmodel.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    7 u- q; m$ z/ s7 J#adding Max pooling layer
    7 [, `3 A7 f/ b' l1 c0 Pmodel.add(MaxPool2D(2,2))0 y3 H8 N+ v4 T+ h( d, Z* E1 o
    #adding another Convolution layer
    / d9 Q  Z* s. N# J5 Wmodel.add(Conv2D(64,(3,3),activation='relu'))
    - h, @2 }8 b# g3 W9 Umodel.add(MaxPool2D(2,2))9 @. h" ~% g3 n0 U
    model.add(Flatten())  M/ u% q4 |. x+ r5 N
    #adding dense layer# B+ Q: V2 j5 {9 J0 g
    model.add(Dense(216,activation='relu'))
    ; [  F. V- e( T#adding output layer
    - x; r5 h* |9 x# k' L- c2 K, n; S7 \model.add(Dense(10,activation='softmax'))+ p: l$ w5 X3 E* n

    3 u. {$ [3 [4 {7 D6 H: [* U$ S- ?; q我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。4 K! ?0 ~6 \* d. g1 n6 k; U
    ; Q5 X% [# R5 ^* v: G* n
    接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/6 v0 o' Q: [0 g1 P0 _1 U' _
    7 D) u' ]6 q1 o* ~+ w, i
    然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    1 @; _! s, O4 H
    7 ~+ f& P, K9 f0 Y* k$ C在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
    . ~! Z6 s. o4 B: e0 E% |$ X- g' X, ?4 K" w% t/ t  C. M0 d
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。) i$ w+ S. ^3 m1 M( Y5 y! t

    - r5 j. K2 v# r  W3 R第 2 步:编译模型& B  H; H5 N( z1 U! C
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    * Z, F% j! q% s9 V& v+ i1 S6 ?
    - T( n2 q3 K% M9 v2 y第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    ) B3 t  Q/ m6 R7 O" r; A! V6 E3 T* u( G/ ]5 n, @
    0 z6 w8 B% S- u! g9 {5 {
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。) [. X1 _& @/ K: R6 x5 j- \$ a
    第 4 步:评估模型model.evaluate(X_test,y_test)
    " @8 H9 A* R: `/ p- o! W4 ]3 ~+ b7 r1 N+ W
    - ]" ]5 S9 a; n( A! {3 w
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。* q- w* ]4 ~! U# n) _$ [
    第 5 步:进行预测
    ' I3 }3 |0 @3 _1 i" l; opred=model.predict(X_test)
    * a9 g+ a2 T, H3 ?( ]9 E#printing the first element from predicted data5 b7 w4 A1 H0 |
    print(pred[0])
    2 r. e: |- Q* f#printing the index of 9 Y5 M: D$ r# U3 e& d
    print('Index:',np.argmax(pred[0]))
    4 U1 T+ c( V) O( t$ [. ^. m0 s9 M4 r4 [4 E& |

    ( @. M% C: ]- J: H0 r5 j& x% T2 u5 C" L
    - }" c5 N% Y) r" V

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    ; `3 x" d) P& k9 Z9 z; j: \6 X. nprint('Predicted_values:',y_classes[:10])
    & H9 U! W8 i+ H( d5 sprint('Actual_values:',y_test[:10])5 n) t  n& r9 n

    5 p* J  [  U! t6 \6 ?( V3 @' u) z3 j

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

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


    * U. Y! Q  H# I0 \/ O' ?" N& `model4=Sequential()# B# w; K; A6 C" v2 ]7 s
    #adding the first Convolution layer
    4 w# w0 G, X; v; Gmodel4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))2 t/ Y& ]. {5 D. G, e. V
    #adding Max pooling layer
    5 s; K3 }- a( Hmodel4.add(MaxPool2D(2,2))
    : f  H& E  e! |7 b: ^#adding dropout
    ! u' J( |* T* Wmodel4.add(Dropout(0.2)), t2 H  P1 B' n) K5 Z+ _- e
    #adding another Convolution layer1 n. O0 v: |0 E/ V, z. I' [  e9 t
    model4.add(Conv2D(64,(3,3),activation='relu'))
    $ \; {8 l7 j) i# V$ U  xmodel4.add(MaxPool2D(2,2)), a0 x" G/ c0 N* `# d
    #adding dropout# f. P* W; i$ M
    model4.add(Dropout(0.2))& ~$ R) {% w, T. i( m; \9 f) c) [# m* N
    model4.add(Flatten())
    / ]6 k) K; c: g3 A9 |#adding dense layer
    ( h, C: M, S) h4 T3 V, mmodel4.add(Dense(216,activation='relu'))
    4 G2 f5 N" G# {& M) s#adding dropout" m' \5 j! a% ^" P9 |! X5 Z
    model4.add(Dropout(0.2))
    $ N: Y9 q' `4 s' M5 }* _# b1 f#adding output layer
    $ p: ]+ s7 X& n0 \model4.add(Dense(10,activation='softmax'))) S) a* P8 T3 F" J0 t# k
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])) G) H$ @* X  h$ v# [
    model4.fit(X_train,y_train,epochs=10), p6 C7 u0 H1 E; T  J
    + x5 R0 L9 V2 |$ P! V5 I. Z) g

    % t/ ~% ?* j, h& l# i- @model4.evaluate(X_test,y_test)
    * L6 ]$ r( k/ ~0 M: W/ S% G: e" X* @2 a( e; N2 E6 P
    通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。/ ~( x( m* B9 z* c8 B  B

    " W5 |4 G' A$ F9 p尾注+ X' a9 s' y- |. @9 u
    这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。6 c6 w% N) G% q
    9 J+ D; r' j7 {0 d7 k
    , K* B3 O5 ^1 U& `! h
    7 a/ |/ I0 f( F0 o
    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-6-2 17:32 , Processed in 0.432287 second(s), 51 queries .

    回顶部