四、卷积神经网络(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
"""

卷积神经网络

卷积神经网络 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
"""

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

三、分析卷积神经网络

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

Output Shape

原始图像像素为2828,这里的过滤器为33的卷积核,故
第一层图像变成了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
_________________________________________________________________
"""

四、详细查看各层网络

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

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

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

len(pred)
"""
7
"""

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

第一层网络,卷积层的shape

pred[0].shape
"""
(1, 26, 26, 64)
"""

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

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

在这里插入图片描述

第一层—卷积层

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

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

在这里插入图片描述

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

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

在这里插入图片描述

第二层—Max Polling层

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

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

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

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

在这里插入图片描述

总结

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

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/125445890