首页 > 技术文章 > Tensorflow——卷积神经网络(CNN)

digger72 2020-10-25 19:51 原文

卷积神经网络

主要应用于计算机视觉相关任务,但它能处理的任务并不局限于图像,其实语音识别也是可以使用卷积神经网络。

工作概述

卷积层 conv2d
参数:ksize 卷积核大小 strides 卷积核移动跨度 padding 边缘填充
非线性层 relu/sigmiod/tanh
池化(下采样)层 pooling2d

  1. 最大池化
    在这里插入图片描述
    2.平均池化
    全连接层 Dense:w*x+b

卷积

卷积是指将卷积应用到某个张量的所有点上,通过将卷积核在输入的张量上滑动而生成经过滤波处理的张量。
在这里插入图片描述
卷积完成的是对图像特征的提取或者说信息匹配,当一个包含某些特征的图像经过一个卷积核时,一些卷积核被激活,输出特定信号。

整体结构

在这里插入图片描述
一句话概括:把图像变小(减小维度)变厚(特征提取)
卷积神经网络需要四维的图片数据(数量,宽度,高度,通道数)

示例:

import tensorflow as tf
print('Tensorflow version:{}'.format(tf.__version__))
# 测试gpu是否可以使用
tf.test.is_gpu_available()
from tensorflow import keras
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
# 加载fashion_mnist数据集
fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
# 对图片数据进行扩维
train_images = np.expand_dims(train_images,-1) # 在最后一个维度上进行扩张
test_images = np.expand_dims(test_images,-1) # 在最后一个维度上进行扩张

建立模型

model= tf.keras.Sequential() # 顺序模型
# 第一层使用卷积层,卷积层提取图片特征的能力强   32-fliter个数  (3,3)-卷积核大小,一般使用3*3或5*5  input_shape-图片大小
model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=train_images.shape[1:],activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(64,(3,3),activation='relu',padding='same'))
# 最大池化层
model.add(tf.keras.layers.MaxPool2D())
# 抑制过拟合
model.add(tf.keras.layers.Dropout(0.5))
# 卷积核以2的指数增长
model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(128,(3,3),activation='relu',padding='same'))
# 最大池化层
model.add(tf.keras.layers.MaxPool2D())
# 抑制过拟合
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu',padding='same'))
model.add(tf.keras.layers.Conv2D(256,(3,3),activation='relu',padding='same'))
# 抑制过拟合
model.add(tf.keras.layers.Dropout(0.5))
# 全局平均池化:得到一个二维的数据
model.add(tf.keras.layers.GlobalAveragePooling2D())
# Dense 输出层:输出一个维度为10的数据  softmax:输出概率值
model.add(tf.keras.layers.Dense(256,activation='relu'))
model.add(tf.keras.layers.Dense(10,activation='softmax'))
model.summary()

在这里插入图片描述

# 对模型进行配置
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.keys()
plt.plot(history.epoch,history.history.get('acc'),label='acc')
plt.plot(history.epoch,history.history.get('val_acc'),label='val_acc')
plt.legend()

在这里插入图片描述

plt.plot(history.epoch,history.history.get('loss'),label='loss')
plt.plot(history.epoch,history.history.get('val_loss'),label='val_loss')
plt.legend()

在这里插入图片描述

推荐阅读