用Pytorch进行图像分类
(对一张猫和一张鱼的图片进行区分)
传统挑战
1、首先需要数据
要想有效地使用深度学习技术,需要较大量的数据来训练神经网络,让神经网络学习并记忆他们的特征。所以我们需要很多鱼和猫的图片
**监督学习和无监督学习的区别
- 有监督学习必须要有训练集和测试样本。在训练集中找规律,而对测试样本使用这种规律。非监督学习没有训练集,只有一组数据,在该数据集中寻找规律
- 有监督学习的方法就是识别事物,识别的结果表现在给识别数据加上了标签。因此训练样本集必须由带标签的样本组成。而非监督学习方法只有要分析的数据集本身,预先没有什么标签。如果发现数据集呈现某种聚集性,则可按自然的聚集性分类,但不予以某种预先分类标签对上号为目的
- 非监督学习的方法在寻找数据集中的规律性,这种规律性并不一定要达到划分数据集的目的,也就是说不一定要”分类“。这一点是比有监督学习的用途要广。例如分析一堆数据的主分量,或分析数据集有什么特点都可以归于非监督学习的范畴
2、PyTorch和数据加载器
# 能与Pytorch进行数据交互的抽象类
class Dataset(object):
#将数据转换成张量并返回张量和标签
def __getitem__(self,index):
pass
def __len__(self):
pass
__len__方法用于返回数据集的大小
__getitem__方法用于接收一个图像,将它转换为一个张量,再返回这个张量和标签,以便PyTorch进行处理
3、建立一个训练数据集
import torchvision
from torchvision import transforms#进行训练数据的转换
#要求我们的图像都在一个适当的目录结构中,其中每个目录分别是一个标签
train_data_path="./train/"
#设置转换的各项参数
transforms=transforms.Compose([transforms.Resize(64),#将每个图片都缩放为相同的分辨率64x64,便于GPU的处理
transforms.ToTensor(),#将数据集转化为张量
transforms.Normalize(mean=[0.485,0.456,0.406],
std=[0.229,0.224,0.225])#设置用于归一化的参数
])
#处理训练数据集
train_data=torchvision.datasets.ImageFolder(root=train_data_path,transform=transforms)
4、建立验证和测试数据集
深度学习面临一个危险是过拟合(overfitting)概念:你的模型确实能很好地识别所训练的数据,不过不能泛化到它没有见过的例子。为了解决这个问题,可以下载一个验证集,这是未出现在训练集中的一系列猫和鱼的图像。在每个训练周期(也称为epoch)的最后,我们会与这个验证集进行比较,来确保我们的的网络没有做错。
val_data_path="./val/"
# 直接使用了前面的设置
val_data=torchvision.datasets.ImageFolder(root=val_data_path,transform=transforms)
#除了验证集,还需要创建一个测试集(test set),这个数据集要在所有训练完成之后用来测试模型
test_data_path="./test/"
test.data=torchvision.datasets.ImageFolder(root=test_data_path,transform=transforms)
三种数据集:
- 训练集:在训练过程中用来更新模型
- 验证集:用来评价模型在这个问题领域的泛化能力,而不是与训练数据的拟合程度,不用来直接更新模型
- 测试集:最后一个数据集,训练完成后对模型的性能提供最后的评价
然后就可以建立我们的数据加载器:
#batch_size的值表示在训练和更新网络之前将为这个网络提供多少图像
batch_size=64
train_data_loader=data.DataLoader(train_data,batch_size=batch_size)
val_data_loader=data.DataLoader(val_data,batch_size=batch_size)
test_data_loader=data.DataLoader(test_data,batch_size=batch_size)
建立一个神经网络
激活函数
max(0,x) 输入为x