卷积神经网络原理与实战

卷积神经⽹络原理与实战
卷积神经⽹络原理与实战
卷积神经⽹络原理与实战
Time:2021-07-16
Author:雾⾬霜星
泰安市地方税务局
个⼈⽹站:
转载请注明出处
前⾔
开始学习CNN,试着跑了⼀个分类MNIST⼿写数据的卷积神经⽹络模型,跑了⼀个猫狗图⽚分类的demo,经过测试与总结后写下笔记。内容包括:卷积神经⽹络的原理、各个卷积神经⽹络对于数据格式、相应的keras接⼝、实战全过程源码记录及其分析
重点记录了使⽤Keras完成⼀次卷积神经⽹络训练的代码思路,其中关键记录了GPU内存分配设置和使
图像数据⽣成器,以及两个训练中遇到的错误及其解决⽅法。
卷积神经⽹络的原理
卷积运算
连续函数间的卷积运算公式如下:
矩阵间的卷积运算:⾸先将卷积核矩阵翻转180度(上下对换,不是倒置),然后卷积核对应在被卷积的矩阵上,每个元素对应相乘,将各个元素对应计算结果相加即得到某次运算的值。然后按照步幅沿着相应维度移动,再次重复上述计算。
特点:局部数据的总体计算
卷积神经⽹络的维度
卷积神经⽹络的维度是指卷积核的移动有⼏个维度。对于⼀维卷积神经⽹络,卷积核只沿着⼀个维度进⾏移动。⼆维卷积神经⽹络中卷积核将会沿着两个不同的维度移动(先沿着⾏移动再沿着列移动)。
运作的本质
田李蓓
通过使⽤卷积运算,来发掘⼀个完整的整体数据各个局部区域的细节特征
通过使⽤不同的滤波器(不同的卷积核)来提取得到不同的特征。
f (x )∗
g (x )=f (τ)g (x −∫τ)dτ
每⼀层卷积神经⽹络计算后得到内容的本质是样本特征。⽐如对于图像,使⽤⼆维卷积神经⽹络就是在发掘图像每个局部区域的特征,得到⼀些列的特征图,再进⾏下次的卷积,在每个特征图上进⼀步划分特征细节,最终得到许多的细节特征图,通过组合细节特征图,来进⾏决策。
Keras搭建的卷积神经⽹络训练前的数据处理
1. 数据向量化
即把数据转化为⽹络输⼊要求的张量形式。
⼀般对数据使⽤shape()⽅法。不是为了改变⼤⼩,⽽是为了设置深度维度(通常对⼆维卷积神经⽹络的数据需要)。因为图⽚输⼊时,被看做为(M * N)的⼆维数据,⽽实际上应该是M * N * 1 或 M * N * 3的数据。
(train_data,train_label),(test_data,test_label)=mnist.load_data()
train_image = shape((60000,28,28,1))
test_image = shape((10000,28,28,1))
2. 数据归⼀化
1. 对于图像数据,转化为float类型并且全部值除以255
train_image = train_image.astype(np.float32)/255
test_image = test_image.astype(np.float32)/255
经过测试,如果不除以255,那么训练结果会较早出现过拟合且最终效果明显下降。
2. 对于序列数据,
还未具体进⾏相关实践,按照之前的经验,应该是对各个特征分别进⾏数据的标准化。
3. 数据集打乱
对于序列数据集或者图像数据集,容易出现相关性较强的两个数据在附件,为了让验证集和训练集的状况更加接近,应该进⾏数据集打乱。
打乱数据集的同时要保证对于⽬标值/标签值按照相同的顺序打乱。
医生哥波子
可以采⽤如下⽅法:
# 数据集(样本与标签)对应序号打乱
permutation = np.random.permutation(train_label.shape[0])
train_image_shuffled = train_image[permutation]
train_labels_shuffled = train_label[permutation]
np.random.permutation⽅法,输⼊⼀个数字,则⽣成⼀个该数字范围内的数字随机排列。
然后样本和标签分别按照这个顺序进⾏排列即可。
4. 标签处理
⽐如标签向量化:
train_label = _categorical(train_label)
test_label = _categorical(test_label)
_categorical⽅法即转化为one-hot编码标签,通常对分类任务的标签进⾏处理。
或者其他提取标签特征,以更好⽅式表现标签特征的⽅法。
⼀维卷积神经⽹络
时间序列数据与序列数据
⼀维卷积神经⽹络通常是对 时间序列数据 或者 序列数据 进⾏使⽤的。
时间序列数据:每⼀⾏代表⼀个特征,每⼀列代表⼀个时刻(看作⼀帧)。每个矩阵是⼀个样本。
时间序列数据的⼀个样本的shape为:(feature_dimension,total_time_step,batch_size)。
实例:交易市场某只股票价格数据
数据特征:该时刻股票价格、上⼀时刻股票最⾼价格、上⼀时刻股票最低价格
通达erp
单位时间长度:1min(即每⼀帧之间的时间间隔)
每个样本总时间长度:1天(24*60min=1440min)
故⼀个样本有3⾏,1440列。⼀个样本集中的样本数就是有⼏天这样的数据。
数据集的样⼦:
每个样本:[[...],[...],[...]]
序列数据:每⼀⾏代表⼀个特征,每⼀列代表⼀个单位间隔,每个样本是矩阵。
时间序列数据是序列数据的⼀种,只是时间序列数据中每个单位间隔是时间。
序列输出常有的⼀种是字符串(⽂本类数据):每个字符的编码号是⼀个特征,每个单位间隔是这个字符串(⽂本)中的每个字符。
实例:⽂章内容数据集
合肥中医推拿数据特征:假设定义字符编码形式500种,即⽂章中只有这500个字可能出现。
(即出现该字符则相应该位置为1,其余位置为0)
单位间隔:⽂章每个字符
每个样本的间隔总数:假设限制⽂章最多1000字,则⼀篇⽂章最多只有1000个字符。
故⼀个样本共有500⾏,1000列。每个样本代表⼀篇这样的⽂章。⼀个数据集中的样本数就是这样的⽂章的数量。
数据集的样⼦:
每个样本[[...],[...],[...],[...],[...],...]
⼀维卷积运算:
卷积核是⼀个矩阵(features * kernel_size),kernel_size即卷积核的长度(卷积核每次卷积所包括的时间长度),features即样本特征数(样本⾏数)。其中矩阵的每个元素是⼀个整数。
对于被卷积的数据是⼀个矩阵或者⾏向量。
⼀维卷积运算就是卷积核沿着⼀个维度进⾏卷积,⼀般默认这个维度就是描述“time_step/单位间隔”的维度。
每个卷积核进⾏卷积运算的最终的输出结果⼤⼩取决于采⽤“窄卷积”或者“宽卷积”的模式。
注意不是⼀个⾏向量每次⼀⾏⼀⾏地进⾏卷积,⽽是⼀个矩阵,直接对⼀个时刻的所有特征,沿着时间步骤的维度进⾏卷积。Keras⼀维卷积神经⽹络API
参考:
import numpy as np
import tensrflow as tf
import tensorflow.keras as keras
model = dels.Sequential()
model.add(keras.layers.Conv1D(filters=100, kernel_size=10, padding="valid", input_shape=(1440,3)))
model.add(keras.layers.Activation(lu))
model.add(keras.layers.MaxPooling1D(3))
化学是你化学是我model.add(karas.layers.Flatten())
model.add(karas.layers.Dense(1))
此处需要注意的是Conv1D⽅法的input_shape,输⼊的是(time_period, features),time_period代表时间区间,即所输⼊数据每个样本的时间序列长度(列数)。⽽features是特征维度,即每个样本有⼏个特征(⾏数)。
滤波器(filter),在给定参数时filters参数即设置滤波器的个数,每个滤波器会使⽤不同的卷积核进⾏卷积运算,从⽽实现不同细节特征的提取。
每个滤波器使⽤⼀个卷积核进⾏卷积运算得到⼀个⾏向量。因此对于⼀个样本,经过每⼀层得到的数据是⼀个2D张量,其shape为(新的时间步骤长度,滤波器的个数),⽽每⼀⾏则代表了⼀个滤波器的卷积核运算后所得某种特征的时间序列。
kernel_size参数⽤于指定窗体的宽度(把样本⾏数看做窗体的⾼度),即每次卷积运算中包括数据的时间范围⼤⼩。
如果使⽤的是keras.Input作为输⼊尺⼨的指定,那么我猜测应是这样的:
model.add(keras.Input(shape=(1440,3,)))
因为没有试过所以我也不太清楚对不对了。。。建议还是采⽤上述把input_shape写到卷积层⾥的官⽅⽂档的写法。
代码中的MaxPooling1D是⼀维池化层,池化层的作⽤都是⼀样的,这⾥是⽤⼀个矩阵沿着⼀个维度进⾏池化。
官⽅⽂档中说明了,相应输⼊下,最终的输出为:
Input shape
3+D tensor with shape: batch_shape + (steps, input_dim)
Output shape
3+D tensor with shape: batch_shape + (new_steps, filters) steps value might have changed due to padding or strides.
Returns
A tensor of rank 3 representing activation(conv1d(inputs, kernel) + bias).
⼆维卷积神经⽹络
图像数据
应⽤:⼆维卷积神经⽹络的使⽤对象通常是图像数据,即每个样本代表了⼀张图像。
图像在计算机中的表⽰:使⽤矩阵(或者三维矩阵)进⾏描述的,每个矩阵的点代表⼀个像素点,矩阵的⾏列代表了图像的长宽。
图像的分辨率:图像中存储的信息量,是每英⼨图像内有多少个像素点。单位:PPI。即相应的长宽下如何切分图像为等⼤⼩的⽅块。
(关于dpi与ppi的区别参考:)
图像的像素(像素值):图像分割为相应的⼩块,每⼀⼩块处计算机赋予的值。⽤于描述该⼩块平均亮度信息,⼤⼩范围是0~255px。
灰度图图像的像素值:范围是0~255px,值越⼤说明亮度越⾼(⽩⾊),值越⼩则相应越⿊。
RGB图像:在计算机中是⼀个含有三个矩阵数据元素的数组。每个矩阵记录⼀个颜⾊通道的图⽚各个像素点的像素值。三个通道分别为红绿蓝。
数据形式:
1. 灰度图:每个样本是⼀个矩阵(2D张量),矩阵每个值代表图像像素点的像素值。⼀个样本集中样本数量图⽚的数量。
2. RGB图像:每个样本是⼀个3D张量,格式为:(height,width,color_depth),即三个颜⾊通道各⾃⼀个矩阵进⾏描述。⼀个样本
集中样本数量图⽚的数量。
⼆维卷积运算
卷积核⼀般是⼀个矩阵(⽅阵),即shape为(kernel_size* kernel_size),对图像样本数据进⾏卷积运算,就是线性代数的矩阵的卷积运算。
实际上,卷积核是多层的矩阵。如果对象是RGB图像,即输⼊样本的input_depth=3,那么每个滤波器的卷积核是(kernel_size*
kernel_size*3)的。最终的计算结果,⼀般是采⽤将滤波器每层进⾏卷积的结果相加。即对于RGB图像,每个滤波器有三层,分别对三个通道进⾏卷积运算,再把各层卷积运算结果对应相加,得到该滤波器在这个RGB图像样本上的卷积计算结果。
对多通道图像的⼆维卷积,每次卷积运算公式如下:
可见只是沿着两个⽅向进⾏卷积,卷积核只有两个移动维度,第三维度(图⽚通道数/深度)是直接相加的。
注意卷积核会沿着两个维度进⾏移动,⼀般默认是,⾸先沿着⾏维度进⾏移动,该⾏卷积完成后先沿着列维度进⾏移动到下⼀⾏,再继续沿着这⼀⾏移动进⾏卷积运算,如此循环。
Keras ⼆维卷积神经⽹络API
参考:
搭建⼆维卷积层,使⽤keras的layers接⼝中提供的Conv2D⽅法。
例如:
model .add (keras .layers .Conv2D (filters =100, kernel_size =10, padding ="valid", input_shape =(28,54,3)))
其中input_shape⽤于指定每个样本的形状,此处即 28*54 ⼤⼩的RGB图像。其中28是⾏宽,54是列宽。
filters同理⽤于指定滤波器的个数,样本与每个滤波器卷积运算后得到⼀个2D张量(矩阵),⽽所有滤波器的结果总体就是⼀个3D张量,即相应每⼀层的输出数据形状为:(new_row, new_col, filters)。
官⽅⽂档说明的如下:
Input shape
4+D tensor with shape: batch_shape + (channels, rows, cols) if data_format='channels_first' or 4+D tensor with shape: batch_shape + (rows, cols, channel s) if data_format='channels_last'.
Output shape
4+D tensor with shape: batch_shape + (filters, new_rows, new_cols) if data_format='channels_first' or 4+D tensor with shape: batch_shape + (new_rows, n ew_cols, filters) if data_format='channels_last'. rows and cols values might have changed due to padding.
Returns
A tensor of rank 4+ representing activation(conv2d(inputs, kernel) + bias).
三维卷积神经⽹络
视频数据
应⽤:三维卷积神经⽹络的应⽤对象通常是视频数据。
视频数据:通常每个视频数据样本是⼀个4D张量,可认为许多图⽚(帧)组合为⼀个视频,每个图⽚时3D张量(灰度图则第三维度为1)。Keras 三维卷积神经⽹络API
参考:
使⽤⽅法keras.layers.Conv3D搭建三维卷积层。
Keras 卷积神经⽹络实战记录
环境
Windows10f (x ,y ,z )∗g (x ,y ,z )=(f (u ,v ,z )g (x −∫∫∫u ,y −v ,z )dudv )dz

本文发布于:2024-09-22 04:27:45,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/475102.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:卷积   数据   样本   特征   图像
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议