# 卷积介绍
# 卷积神经网络
卷积神经网络 (Convolutional Neural Network) CNN
大部分的图片并不是正正方方摆好的,会有些偏移,这时候全连接的计算机视觉就不太好使了。
他是识别物品的特征,来判断物品的;

从图像当中取到的像素,通过过滤器,与过滤器(Filter)相乘,最后相加,得到一个新的像素集;
不同的 filter 会有不同的效果


每次卷积完了之后还要再做一个 Max Pooling,他的作用是增强图像的特征,如下是取最大值,最后就剩下一个 2x2 的矩阵


Max Pooling 以后数据减少了,但是特征增强了。卷积的材料可以看 https://bit.ly/2UGa7uH
# 卷积神经程序
import tensorflow as tf  | |
from tensorflow import keras  | |
fasion_mnist = keras.datasets.fashion_mnist  | |
(train_images,train_labels),(test_images,test_labels) = fasion_mnist.load_data()  | |
model = keras.Sequential()  | |
#Conv2D 二维的卷积层,64 个过滤器,每个过滤器 3X3 的像素, | |
model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)))  | |
#Maxpooling 2x2,四个像素, | |
model.add(keras.layers.MaxPooling2D(2,2))  | |
model.add(keras.layers.Conv2D(64,(3,3),activation='relu'))  | |
model.add(keras.layers.MaxPooling2D(2,2))  | |
model.add(keras.layers.Flatten())  | |
model.add(keras.layers.Dense(128,activation=tf.nn.relu))  | |
model.add(keras.layers.Dense(10,activation=tf.nn.softmax))  | |
train_imges_scaled=train_images/255  | |
model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])  | |
#reshape ,-1 是不管无视行数 | |
model.fit(train_imges_scaled.reshape(-1,28,28,1),train_labels,epochs=5)  | 
# 卷积网络结构
model.summary()  | |
---console---  | |
Model: "sequential"  | |
_________________________________________________________________  | |
Layer (type) Output Shape Param #  | |
=================================================================  | |
conv2d (Conv2D) (None, 26, 26, 64) 640  | |
//输入是28x28,但是filter去掉了两个像素,64个filter  | |
//640 = (3*3+1)*64  | |
_________________________________________________________________  | |
max_pooling2d (MaxPooling2D) (None, 13, 13, 64) 0 //尺寸缩小一半。没有调整参数所以Param=0  | |
_________________________________________________________________  | |
conv2d_1 (Conv2D) (None, 11, 11, 64) 36928 //再卷积,又去掉两个像素  | |
//36928=(3*3*64+1)*64  | |
_________________________________________________________________  | |
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0 //尺寸继续锁校  | |
_________________________________________________________________  | |
flatten (Flatten) (None, 1600) 0 //展平数据,  | |
_________________________________________________________________  | |
dense (Dense) (None, 128) 204928 //  | |
_________________________________________________________________  | |
dense_1 (Dense) (None, 10) 1290  | |
=================================================================  | |
Total params: 243,786  | |
Trainable params: 243,786  | |
Non-trainable params: 0  | |
_________________________________________________________________  | 
#读取 MODEL 的每个层 | |
layer_outputs = [layer.output for layer in model.layers]  | |
#将 input 和 output 放在一起,构成一组对象 | |
activation_model = tf.keras.models.Model(inputs=model.input,outputs=layer_outputs )  | |
#用在一张图片上,预测结果 | |
pred = activation_model.predict(test_images[0].reshape(1,28,28,1))  | |
len(pred)  | |
#输出 7,有 7 个层的输出 | |
pred[0].shape  | |
#(1,26,26,64)  | |
pred[0][0,:,:,1]  | |
#第 0 层,所有的行,所有的列,filter | 
第 0 层,conv2d,filter=1
第 1 层,max_pooling2d,filter=1
第 2 层,conv2d_1,filter =1
第 3 层,max_pooling2d_1,filter=1
第 4 层,flatten
第 5 层,dense
第 6 层,dense_1,一共 6 层,输出预测结果
第 0 层,filter=50,不同 filter 的样子