一、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="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="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
原始图像像素为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
_________________________________________________________________
"""
四、详细查看各层网络
对测试集中第一张图像进行七层网络分析
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层物体的特征更加明显了
|