tensorflow学习——03 卷积

Fashion MNIST的数据集都是灰度图像,并且图像都在正中间

 

如果让Fashion MNIST训练的神经网络模型去判断一张图片,其中的鞋子并不是在正中间,那么判断的准确率就不是很好了

 

CNN:卷积神经网络

 

识别物品的特征

 

 

 

 

 

 

 

 

 

不同的过滤器会产生不同的效果

 

 

 

 

 

 

每次卷积之后还要进行一个max Pooling(最大值池化),作用是增强图像特征

 

 

 

取一个2*2的区域,把最大值留下

 

池化与卷积的不同是:池化作用域不重合区域

 

 

 

经过max pooling 500*500的变成了250*250,这是因为一个2*2的区域只保留一个最大值

 

关于卷积神经网络可以看下面图片中的材料

 

 

 

卷积神经网络是在全连接神经网络上增加四层

 

 

 

import tensorflow as tf
from tensorflow import keras
fashion_mnist=keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()

#第一层是两维的卷积层 64指过滤器(filter)有64个,每个过滤器是3*3像素;激活函数relu;输入值是28*28*1,表明只有灰度值
#第二层 卷积之后使用maxPooling增强图像特征 使用2*2区域  原来的输出会少一半
#第三层也是卷积层和第一层一样
#第四层和第二层也一样 并且不用再指定输入的shape

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'))
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_images = train_images.reshape((60000, 28, 28, 1))
train_images_scaled=train_images/255
model.compile(optimizer=tf.optimizers.Adam(),loss=tf.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
model.fit(train_images_scaled,train_labels,epochs=5)

 

 

 模型的网络结构

model.summary()

 

 out_shape

第一层:原先输入是28*28,卷积之后去掉两个像素变成26*26  6464个过滤器

经过第一层卷积之后,一张图片变成了64张图片

第二层:池化之后 长宽减半 13*13

第三层:卷积,长宽-2  11*11

第四层:池化减半 5*5

第五层:Flatten把所有展平,5*5*64=1600个神经元,

 

param

第一层:过滤器是3*3  所以(3*3+1*64=640  1是一个bias

第二层没有调整参数

第三层:(3*3*64+1*64=36928

 

 

import matplotlib.pyplot as plt
layer_outputs=[layer.output for layer in model.layers]  #读取model的每一层
activation_model=tf.keras.models.Model(inputs=model.input,outputs=layer_outputs) #input和输出层放在一起构成一个对象
pred=activation_model.predict(test_images[0].reshape(1,28,28,1)) #用上面的独享预测图片
print(len(pred))#输出为7  说明是7个层的输出
#print(pred)
#之前用64个过滤器 不同的过滤器提取不同的特征
print(pred[0].shape) #(1,26,26,64) 这个是第一层的输出结果的shape
plt.imshow(pred[0][0,:,:,1]) #这个是第一层的第二个过滤器产生的结果图像

 

有的过滤器可能是对鞋子的底面,有的可能就是对鞋子的鞋面产生明显效果

 

 

posted @ 2021-10-14 22:03  白菜茄子  阅读(77)  评论(0编辑  收藏  举报