Tensorflow2——卷积神经网络的搭建


***** 以下有关代码全是在jupyter notebook 里面调试完后曾,如果直接复制粘贴到pycharm可能不太行,自己得改改

1、卷积神经网络

1、卷积神经网络
CNN最大的特点就是在于卷积的权值共享,利用空间结构减少学习的参数量,防止过拟合的同时减少计算量。在卷积神经网络中,第一个卷积层直接接受图像像素级的输入,卷积之后传给后面的网络,每一层的卷积操作相当于滤波器,对图像进行特征提取,原则上可保证尺度,平移和旋转不变性。
一般的卷积网络包含一下操作:
(1)卷积。图像通过不同卷积核卷积并且加偏置(bias),提取局部特征,每一个卷积核产生一幅新的2D图像。
(2)非线性激活。对卷积输出结果进行非线性激活函数处理,以前常用Sigmoid函数,现在常用ReLU函数。
(3)池化(Pooling)。降采样操作,包括平均池化和最大值池化,一般选择最大值池化,保留最显著特征,提升模型容畸变能力。
(4)完成以上操作之后,就完成了最常见的卷积层。当然也可以加一个LRN(Local Response Nomalization,局部响应归一化)层,目前流行Trick和Batch Nomalization等。
卷积神经网络的好处在于,参数数量只与滤波器数目和卷积核大小有关,与输入图像尺寸无关。总结一下CNN的要点:局部连接,权值共享,池化(降采样)。
2、使用卷积核扫描区域并将卷积核对应位置的参数和扫描区域数值相乘求和得到特征值,扫描多个区域得到多个特征值组合的矩阵就是特征图(feature map)。需要注意的是,卷积操作是针对矩阵区域的,对多个通道的同区域会进行相应合并得到一个特征图(合并一般是分别对每个通道提取特征,然后特征值求和得到该区域的特征)。之所以使用卷积操作提取特征,这是由来已久的,在计算机视觉的历史上使用特定的滤波器处理图片是个常用手段,卷积很早就被提出了,不过那时候对于不同的任务人为设计不同的滤波器(卷积核),这里只是在深度学习的基础上沿用罢了(卷积核变为自动学习而不是人为设计)。
这个过程表现为feature map长宽减小,channel增加,所以卷积神经网络的卷积核数目逐层增加或不变

Fasion_minst识别卷积神经网络搭建代码

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

(train_images,train_labels),(test_images,test_labels)=tf.keras.datasets.fashion_mnist.load_data() #加载图片数据
 #下载下来的图片的shape为(60000,28,28)
train_images=np.expand_dims(train_images,-1) #将训练图片增加一个维度(60000,28,28,1)最后一个数字代表的是图片的通道数为1
test_images=np.expand_dims(test_images,-1) 

model=tf.keras.Sequential()  #建立顺序模型

model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=(28,28,1),activation="relu",padding="same")) 
#第一层采用卷积核数目为64,卷积核大小(3,3),卷积神经网络可以图片直接输入,不需要Flatten,输入图片的shape为(28,28,1),激活函数:relu,padding填充方式采用“same”方式,希望卷积后不改变图片的长和宽
#此时模型的图片输出shape为  (None, 28, 28, 64)
model.add(tf.keras.layers.Conv2D(64,(3,3),activation="relu",padding="same"))  
#再同样进行特征提取
#此时模型的图片输出shape为  (None, 28, 28, 64)
model.add(tf.keras.layers.MaxPool2D())  #进行Maxpooling池化,默认的pool_size为(2, 2),就是图片的长宽减少一半
#此时模型的图片输出shape为 (None, 14, 14, 64)
model.add(tf.keras.layers.Dropout(0.5))  #防止过拟合,丢弃一半(0.5)
#此时模型的图片输出shape为 (None, 14, 14, 64)

model.add(tf.keras.layers.Conv2D(128,(3,3),activation="relu",padding="same"))
#此时模型的图片输出shape为(None, 14, 14, 128)
model.add(tf.keras.layers.Conv2D(128,(3,3),activation="relu",padding="same"))
#此时模型的图片输出shape为(None, 14, 14, 128)
model.add(tf.keras.layers.MaxPool2D())
#此时模型的图片输出shape为(None, 7, 7, 128)
model.add(tf.keras.layers.Dropout(0.5))  #防止过拟合

model.add(tf.keras.layers.Conv2D(256,(3,3),activation="relu",padding="same"))
#此时模型的图片输出shape为(None, 7, 7, 256)
model.add(tf.keras.layers.Conv2D(256,(3,3),activation="relu",padding="same"))
#此时模型的图片输出shape为(None, 7, 7, 256)
model.add(tf.keras.layers.MaxPool2D())
#此时模型的图片输出shape为(None, 3, 3, 256)
model.add(tf.keras.layers.Dropout(0.5))  #防止过拟合

model.add(tf.keras.layers.Conv2D(512,(3,3),activation="relu",padding="same"))
model.add(tf.keras.layers.Conv2D(512,(3,3),activation="relu",padding="same"))
#此时模型的图片输出shape为(None, 3, 3, 512)
model.add(tf.keras.layers.Dropout(0.5))  #防止过拟合
model.add(tf.keras.layers.MaxPool2D())
#此时模型的图片输出shape为(None, 1, 1, 512)
model.add(tf.keras.layers.GlobalAveragePooling2D())
#通过GlobalAveragePooling2D()和后面的Dense层好连接,此时模型的图片输出shape为(None, 512)
model.add(tf.keras.layers.Dense(256,activation="relu"))  #此时模型的图片输出shape为(None, 256)
model.add(tf.keras.layers.Dense(10,activation="softmax")) #此时模型的图片输出shape为(None, 10)

model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=["acc"])
history=model.fit(train_images,train_labels,epochs=30,validation_data=(test_images,test_labels)) #将训练数据记录到history中

history.history.keys()  #
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值