(学习笔记)
操作内容
- 搭建简单CNN;
- 运用CNN相关的计算:卷积后的长宽高 ;
- 可视化卷积后的特征图
目标
- 理解视觉感知、图像表达的概念
- 理解图像卷积的原理、通道的概念
- 理解卷积神经网络对图像处理的优点
- 理解全连接神经网络图像识别的原理
- 理解padding、striding、感受野的概念
- 掌握单/多通道卷积算法的实现
实验环境
- python 3.6
- tensorflow 2.4.1
- Keras 2.4.3
- pandas 0.24.2
- numpy 1.19.5
- matplotlib 3.3.4
实验原理及步骤
步骤1:导入相关包或模块
import os
import cv2
import numpy as np
import shutil # 复制文件
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense,
Dropout,BatchNormalization, Activation
from keras.optimizers import RMSprop
from keras.models import Model
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
from keras.preprocessing import image
步骤2:设置目录
# 存储较小数据集的目录
base_dir = '../Dataset/dogs-vs-cats/'
# 训练、验证、测试数据集的目录
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'val')
test_dir = os.path.join(base_dir, 'test')
# 猫训练图片所在目录
train_cats_dir = os.path.join(train_dir, 'cat')
# 狗训练图片所在目录
train_dogs_dir = os.path.join(train_dir, 'dog')
# 猫验证图片所在目录
validation_cats_dir = os.path.join(validation_dir, 'cat')
# 狗验证数据集所在目录
validation_dogs_dir = os.path.join(validation_dir, 'dog')
# 猫测试数据集所在目录
test_cats_dir = os.path.join(test_dir, 'cat')
# 狗测试数据集所在目录
test_dogs_dir = os.path.join(test_dir, 'dog')
步骤3:数据增强
- 数据增强:将数据量适当扩充,以提高模型的泛化能力
- ImageDataGenerator() :keras.preprocessing.image模块中的图片生成器,可以每一次给模型“喂”一个batch_size大小的样本数据,同时也可以在每一个批次中对这batch_size个样本数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等等
- ImageDataGenerator() 关键参数
rescale
:
重缩放因子。默认为
None
。如果是
None
或
0
,不进行缩放,否则将数据乘以所提供的
值(在应用任何其他转换之前)
rotation_range
:
整数。随机旋转的度数范围
width_shift_range
:
浮点数、一维数组或整数。
float:
如果
<1
,则是除以总宽度的值,或者如果
>=1
,则为像素值。
1-D
数组
:
数组中的随机元素。
height_shift_range
:
浮点数、一维数组或整数。
float:
如果
<1
,则是除以总宽度的值,或者如果
>=1
,则为像素值。
1-D array-like:
数组中的随机元素。
shear_range
:
浮点数。剪切强度(以弧度逆时针方向剪切角度)
zoom_range
:
浮点数 或
[lower, upper]
。随机缩放范围
horizontal_flip
:
布尔值。随机水平翻转
fill_mode
: {"constant", "nearest", "reflect" or "wrap"}
之一。默认为
'nearest'
。输入边界以外的
点根据给定的模式填充
"""数据增强"""
# 对训练图像进行数据增强
train_pic_gen = ImageDataGenerator(rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.5,
horizontal_flip=True,
fill_mode='nearest')
# 对测试图像进行数据增强
test_pic_gen = ImageDataGenerator(rescale=1./255)
# 利用 .flow_from_directory 函数生成训练数据
train_flow = train_pic_gen.flow_from_directory(train_dir,
target_size=(224,224),
batch_size=64,
class_mode='categorical')
# 利用 .flow_from_directory 函数生成测试数据
test_flow = test_pic_gen.flow_from_directory(test_dir,
target_size=(224,224),
batch_size=64,
class_mode='categorical')
print(train_flow.class_indices)
训练数据类别输出:
Found 4000 images belonging to 2 classes.Found 200 images belonging to 2 classes.{'cat': 0, 'dog': 1}
步骤4:搭建网络模型
- 可使用序列模型 Sequential
- 序列模型各层之间是依次顺序的线性关系,模型结构通过一个列表来制定或者采用.add()逐层添加网络结构
"""网络构建"""
resize = 224
model = Sequential()
Conv2D
创建一个卷积层,对输入数据进行卷积操