victory的博客

长安一片月,万户捣衣声

0%

基于ResNet的CIFAER-10图像分类

CIFAR-10数据集

数据集规模
60000张32×32的彩色图片,共有十个类别,每个类别6000张图片。共50000张训练集图片和10000测试集图片。
数据集样本类别
飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车(汽车和卡车无重叠)—> 10分类任务
数据集网址
http://www.cs.toronto.edu/~kriz/cifar.html
网络
ResNet18

Dogs VS Cats

猫狗大战任务

猫狗大战是来源于Kaggle的一个比赛项目,任务为给定一个有猫狗照片数据集,设计一种算法对测试集中的猫狗图片进行分类。
比赛项目网址:
https://www.kaggle.com/
网络

layer1: Conv2d(3, 16, 3, padding=1)
layer2: relu():
layer3: max_pool2d(2)
layer4: Conv2d(16, 16, 3, padding=1)
layer5: relu()
layer6: max_pool2d(2)
layer7: Linear(50*50*16, 128)
layer8: relu()
layer9: Linear(128, 64)
layer10: relu()
layer11: Linear(64, 2)

模型存储的5种方法

方法1:csv/txt
存储为csv、text或者json是最为简单的存储格式,阅读和解析起来非常方便。
如果使用Pandas则可以在存储的过程中设置压缩方法,对磁盘比较友好。

· 场景:通用
· 数据:表格、文本
· 文件大小:压缩后较少
· 读取速度:较慢

compression_opts = dict(method='zip',
                        archive_name='out.csv')  
df.to_csv('out.zip', index=False,
          compression=compression_opts) 

方法2:hdf
HDF(Hierarchical Data File)是能满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式。
HDF格式支持分层存储,可以将多个变量同时存在一个HDF文件中,同时在读取速度上也比较快。

· 场景:通用
· 数据:表格、文本
· 文件大小:较大
· 读取速度:较快

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]},
                  index=['a', 'b', 'c'])
df.to_hdf('data.h5', key='df', mode='w')

方法3:npy
如果将特征和数据处理为Numpy格式,则可以考虑存储为Numpy中的npy或npz格式。

· 场景:文件存储
· 数据:矩阵
· 文件大小:适中
· 读取速度:较快

  1. npy文件:二进制格式
    np.load()和np.save()是读写磁盘数组数据的两个重要函数。使用时数组会以未压缩的原始二进制格式保存在扩展名为.npy的文件中。
import numpy as np
arr=np.arange(5)
np.save('test',arr)
print(np.load('test.npy'))

2.npz文件:压缩文件
使用np.savez()函数可以将多个数组保存到同一个文件中。读取.npz文件时使用np.load()函数,返回的是一个类似于字典的对象,因此可以通过数组名作为关键字对多个数组进行访问。

import numpy as np

a = np.arange(5)
b = np.arange(6)
c = np.arange(7)
np.savez('test', a, b, c_array=c)  # c_array是数组c的命名

data = np.load('test.npz')
print('arr_0 : ', data['arr_0'])
print('arr_1 : ', data['arr_1'])
print('c_array : ', data['c_array'])

方法4:memmap
NumPy实现了一个类似于ndarray的memmap对象,它允许将大文件分成小段进行读写,而不是一次性将整个数组读入内存。

如果需要存储的对象大于内存,则可以选择memmap进行存储。

· 场景:大文件存储
· 数据:矩阵
· 文件大小:较大、特别大
· 读取速度:适中

newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
fpc[0,:] = 0

方法5:joblib
类似于pkl存储,joblib.dump可以将任意的Python对象持久化到一个文件中,并使用joblib.load进行读取。

· 场景:任意
· 数据:任意
· 文件大小:适中
· 读取速度:适中

from joblib import load, dump

X = [[0, 0], [1, 1]]
Y = [1, 0]

dump((X, Y), "data.pkl")
X, Y = load("data.pkl")

卷积和卷积核

1.卷积
原理:卷积过程就是卷积核行列对称翻转后,在图像上滑动,并且依次相乘求和.(与滤波器不同的一点就是多了一个卷积核翻转的过程).然后经过池化,激活后输入下一层.
单个卷积层可以提取特征,当多个卷积叠加后即可逐步学习出更高语义的抽象特征.
2.卷积核
卷积核:其中卷积核主要有两类,普通卷积核和11的卷积核.普通卷积核同时改变图像的空间域和通道域,如下图所示,每个卷积核的通道数与输入相同,
卷积后会得到一个通道为一的特征图,我们希望卷积后的通道数有几个,卷积核就有几个.
1
1卷积核,视野大小为单个特征位点,能够实现在空间域不改变的情况下实现通道域信息的交流,
并且获得我们想要的通道数量(一般是降维).

VGG使用3x3卷积核的优点

2个3x3的卷积核串联和一个5x5的卷积核拥有相同的感受野,但是,2个3x3的卷积核拥有更少的参数,
对于通道为1的5x5特征图得到通道为1的输出特征图,前者有3x3x2=18个参数,后者5x5=25个参数,
其次,多个3x3的卷积核比一个较大的尺寸的卷积核加入了更多的非线性函数,增强了模型的非线性表达能力。
1x1卷积核的作用: 改变通道数目,保持尺度不变情况下增强非线性表达能力,可以实现跨通道的信息交互。

BatchNormalization

由于深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,
通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。
为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。
也就是随是着网络加深,参数分布不断往激活函数两端移动(梯度变小),导致反向传播出现梯度消失,收敛困难。
原理:可在每层的激活函数前,加入BN,将参数重新拉回0-1正态分布,加速收敛。