当前位置:网站首页>四、卷积神经网络(Convolution Neural Networks)

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

2022-06-25 07:56:00 beyond谚语

一、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层物体的特征更加明显了

原网站

版权声明
本文为[beyond谚语]所创,转载请带上原文链接,感谢
https://beyondyanyu.blog.csdn.net/article/details/125445890