• 四、卷积神经网络(Convolution Neural Networks)


    一、CNN(Convolution Neural Networks)

    卷积神经网络基本思想:识别物体的特征,来进行判断物体
    卷积Convolution:过滤器filter中的数值与图片像素值对应相乘再相加,6 * 6卷积一次(步数为1)变成4 * 4
    Max Pooling:对卷积之后的4 * 4图像,分区选取最大值(2*2选取),变成 2 * 2;
    Max Pooling作用是增强特征,减少数据

    Ⅰ卷积

    在这里插入图片描述
    原图在这里插入图片描述
    竖直过滤器在这里插入图片描述最终效果在这里插入图片描述

    垂直过滤器在这里插入图片描述最终效果在这里插入图片描述

    ⅡMax Pooling

    在这里插入图片描述
    Max Pooling之后尺寸减小为原来的一半
    在这里插入图片描述

    ⅢCNN卷积神经网络就是卷积+Max Pooling

    二、全连接和卷积网络比较

    传统的全连接网络

    全连接网络 loss: 0.2400 - acc: 0.9113

    from tensorflow import keras
    import tensorflow as tf
    import matplotlib.pyplot as plt
    import numpy as np
    
    fashion_mnist = keras.datasets.fashion_mnist
    (train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
    model = keras.Sequential()
    model.add(keras.layers.Flatten(input_shape=(28,28)))
    model.add(keras.layers.Dense(128,activation=tf.nn.relu))
    model.add(keras.layers.Dense(10,activation=tf.nn.softmax))
    
    
    train_images_y = train_images/255
    #model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
    #optimizer="adam",loss="sparse_categorical_crossentropy",metrics=[`'accuracy']
    model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=['accuracy'])
    
    
    model.fit(train_images_y,train_labels,epochs=10)
    """
    Epoch 1/10
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.4977 - acc: 0.8257
    Epoch 2/10
    60000/60000 [==============================] - 2s 41us/sample - loss: 0.3779 - acc: 0.8637
    Epoch 3/10
    60000/60000 [==============================] - 2s 39us/sample - loss: 0.3390 - acc: 0.8762
    Epoch 4/10
    60000/60000 [==============================] - 2s 39us/sample - loss: 0.3158 - acc: 0.8847
    Epoch 5/10
    60000/60000 [==============================] - 2s 39us/sample - loss: 0.2971 - acc: 0.8899
    Epoch 6/10
    60000/60000 [==============================] - 2s 39us/sample - loss: 0.2829 - acc: 0.8963
    Epoch 7/10
    60000/60000 [==============================] - 2s 39us/sample - loss: 0.2702 - acc: 0.8999
    Epoch 8/10
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.2584 - acc: 0.9035
    Epoch 9/10
    60000/60000 [==============================] - 2s 39us/sample - loss: 0.2507 - acc: 0.9059
    Epoch 10/10
    60000/60000 [==============================] - 2s 39us/sample - loss: 0.2400 - acc: 0.9113
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    卷积神经网络

    卷积神经网络 loss: 0.0964 - acc: 0.9640

    from tensorflow import keras
    import tensorflow as tf
    import matplotlib.pyplot as plt
    import numpy as np
    
    fashion_mnist = keras.datasets.fashion_mnist
    (train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
    model = keras.Sequential()
    
    model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)))
    model.add(keras.layers.MaxPooling2D(2,2))
    model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)))
    model.add(keras.layers.MaxPooling2D(2,2))
    
    model.add(keras.layers.Flatten(input_shape=(28,28)))
    model.add(keras.layers.Dense(128,activation=tf.nn.relu))
    model.add(keras.layers.Dense(10,activation=tf.nn.softmax))
    
    
    train_images_y = train_images/255
    #model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
    #optimizer="adam",loss="sparse_categorical_crossentropy",metrics=[`'accuracy']
    model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=['accuracy'])
    
    
    model.fit(train_images_y.reshape(-1,28,28,1),train_labels,epochs=10)
    """
    Epoch 1/10
    60000/60000 [==============================] - 43s 710us/sample - loss: 0.4380 - acc: 0.8408
    Epoch 2/10
    60000/60000 [==============================] - 41s 682us/sample - loss: 0.2923 - acc: 0.8920
    Epoch 3/10
    60000/60000 [==============================] - 41s 680us/sample - loss: 0.2485 - acc: 0.9082
    Epoch 4/10
    60000/60000 [==============================] - 41s 681us/sample - loss: 0.2164 - acc: 0.9190
    Epoch 5/10
    60000/60000 [==============================] - 41s 681us/sample - loss: 0.1886 - acc: 0.9297
    Epoch 6/10
    60000/60000 [==============================] - 41s 680us/sample - loss: 0.1654 - acc: 0.9376
    Epoch 7/10
    60000/60000 [==============================] - 41s 686us/sample - loss: 0.1462 - acc: 0.9446
    Epoch 8/10
    60000/60000 [==============================] - 41s 681us/sample - loss: 0.1254 - acc: 0.9525
    Epoch 9/10
    60000/60000 [==============================] - 42s 706us/sample - loss: 0.1115 - acc: 0.9579
    Epoch 10/10
    60000/60000 [==============================] - 47s 780us/sample - loss: 0.0964 - acc: 0.9640
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    很明显,CNN要比传统的全连接网络正确率高,损失函数值小,但训练时间长

    三、分析卷积神经网络

    在卷积神经网络训练的基础上,看下网络结构
    七层!!!

    Output Shape

    原始图像像素为28 * 28,这里的过滤器为3 * 3的卷积核,故
    第一层图像变成了26 * 26,64为64个卷积核(过滤器),经过一次卷积之后,一张图像就变成了64张图像了
    第二层,将图像变为原来的四分之一,长宽各减半,变成了13 * 13
    第三层,卷积层,卷积核3 * 3,去掉2个像素点,变成11 * 11的图像
    第四层,将图像变为原来的四分之一,长宽各减半,变成了5 * 5
    第五层,flatten将所有像素进行展平,5 * 5 * 64=1600

    Param参数

    第一层,33的卷积核(过滤器)有64个,33*64=576,每一个都还有一个bias,故576+64=640个参数
    第二层没有调整参数,只是变化了尺寸,故参数为0
    第三层,接第一层的576个参数,与本身的64个卷积核连接,576 * 64=36864,再加上每一个的bias,36864 + 64=36928
    第四层没有调整参数,只是变化了尺寸,故参数为0
    第五层,展平操作,就是把所有的像素点值都展成一行,没有调整参数,只是尺寸变化了而已,故参数为0
    第六层,代码设置的就是128个神经元,故与上一层进行全连接操作,1600 * 128=204800,再加上每一个都有一个bias,故204800 + 128 = 204928
    第七层,就是10分类而已,上一层128个神经元与这10个神经元全排列,128 * 10 =1280,在加上每个的bias,1280+10=1290

    model.summary()
    """
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    conv2d_2 (Conv2D)            (None, 26, 26, 64)        640       
    _________________________________________________________________
    max_pooling2d_2 (MaxPooling2 (None, 13, 13, 64)        0         
    _________________________________________________________________
    conv2d_3 (Conv2D)            (None, 11, 11, 64)        36928     
    _________________________________________________________________
    max_pooling2d_3 (MaxPooling2 (None, 5, 5, 64)          0         
    _________________________________________________________________
    flatten_2 (Flatten)          (None, 1600)              0         
    _________________________________________________________________
    dense_4 (Dense)              (None, 128)               204928    
    _________________________________________________________________
    dense_5 (Dense)              (None, 10)                1290      
    =================================================================
    Total params: 243,786
    Trainable params: 243,786
    Non-trainable params: 0
    _________________________________________________________________
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    四、详细查看各层网络

    对测试集中第一张图像进行七层网络分析

    test_images_y = test_images/255#因为前面训练的时候对训练图像进行了归一化操作,故测试的时候也需要对测试图像进行归一化操作
    layer_outputs = [layer.output for layer in model.layers]
    activation_model = tf.keras.models.Model(inputs=model.input,outputs=layer_outputs)
    pred = activation_model.predict(test_images_y[0].reshape(1,28,28,1))#这里对第一张图像进行测试
    pred
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    预测的结果包括七层网络的结果

    len(pred)
    """
    7
    """
    
    • 1
    • 2
    • 3
    • 4

    pred[第几层网络0-6一共七层][0,:,:,第几个卷积核1-64一共64个卷积核]

    第一层网络,卷积层的shape

    pred[0].shape
    """
    (1, 26, 26, 64)
    """
    
    • 1
    • 2
    • 3
    • 4

    第一个0表示第一层,卷积层
    第二个0是画图用的,必须为0
    :,:表示展示图片的所有信息
    第一个1表示第一个卷积核(过滤器)

    pred[0][0,:,:,1]
    
    • 1

    在这里插入图片描述

    第一层—卷积层

    看下第一层的使用第一个卷积核(共64个卷积核),生成的图像

    plt.imshow(pred[0][0,:,:,1])
    
    • 1

    在这里插入图片描述

    看下第一层的使用第二个卷积核(共64个卷积核),生成的图像

    plt.imshow(pred[0][0,:,:,2])
    
    • 1

    在这里插入图片描述

    第二层—Max Polling层

    看下第二层的使用第一个卷积核(共64个卷积核),生成的图像

    plt.imshow(pred[1][0,:,:,1])
    
    • 1

    在这里插入图片描述
    看下第二层的使用第二个卷积核(共64个卷积核),生成的图像

    plt.imshow(pred[1][0,:,:,2])
    
    • 1

    在这里插入图片描述

    总结

    卷积层26*26,到Max Polling层变成了13 * 13
    且Max Polling层物体的特征更加明显了

  • 相关阅读:
    linux安装gcc4.6.1
    卷积神经网络结构设计,卷积神经网络最新进展
    Ci2451-2.4g无线MCU收发芯片
    openGauss学习笔记-241 openGauss性能调优-SQL调优-审视和修改表定义
    【2022河南萌新联赛第(五)场:信息工程大学】【部分思路题解+代码解析】
    虚拟机NAL模式连接linux系统
    MySQL用户管理和授权
    KNN-水仙花的分类
    智安网络|从区块链到社交网络:解析去中心化的意义与应用
    生成 eps 的四种方法(总有一款适合你)
  • 原文地址:https://blog.csdn.net/qq_41264055/article/details/125445890