图像分类学习:X光胸片诊断识别----迁移学习

  刚进入人工智能实验室,不知道是在学习机器学习还是深度学习,想来他俩可能是一个东西,查阅之后才知道这是两个领域,或许也有些交叉,毕竟我也刚接触,不甚了解。
  在我还是个纯度小白之时,写下这篇文章,希望后来同现在的我一样,刚刚涉足此领域的同学能够在这,跨越时空,在小白与小白的交流中得到些许帮助。

开始

  在只会一些python语法,其他啥都没有,第一周老师讲了一些机器学习和深度学习的了解性内容,就给了一个实验,让我们一周内弄懂并跑出来,其实老师的代码已经完成了,我们可以直接放进Pycharm里跑出来,但是代码细节并没有讲,俗话说师傅领进门,修行在个人。那就从最基本的开始,把这个代码弄懂,把实验理解。
  下面我会先把整个代码贴出来,之后一步一步去分析每个模块,每个函数的作用。

说明

  本实验来自此处博客,我们的实验也是基于这个博客的内容学习的。

一、数据集

数据源于kaggle,可在此链接自行下载

二、运行代码

三、解析 从头开始,先来看这段代码(注释进行解释): # 进行一系列数据增强,然后生成训练(train)、验证(val)、和测试(test)数据集 data_transforms = { 'train': transforms.Compose([ transforms.RandomResizedCrop(input_size), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'val': transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'test': transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]) }

这是一个字典数据类型,其中键分别为:train、val、test对应数据集里的三个文件夹train、val、test
键train对应的值是一个操作transfroms.Compose( [列表] )
参数为一个列表,列表中的元素为四个操作:

transforms.RandomResizedCrop()
transforms.RandomHorizontalFlip()
transforms.ToTensor
transforms.ToTensortransforms.Normalize()

transforms在torchvision中,一个图像处理包,可以通过它调用一些图像处理函数,对图像进行处理

transfroms.Compose( [列表] ):此函数存在于torchvision.transforms中,一般用Compose函数把多个步骤整合到一起

transforms.RandomResizedCrop(数字):将给定图像随机裁剪为不同的大小和宽高比,然后缩放所裁剪得到的图像为制定的大小;(即先随机采集,然后对裁剪得到的图像缩放为同一大小)
例如:

图像分类学习:X光胸片诊断识别----迁移学习

transforms.RandomHorizontalFlip():以给定的概率随机水平旋转给定的PIL的图像,默认为0.5;
例如:

图像分类学习:X光胸片诊断识别----迁移学习

transforms.ToTensor:将给定图像转为Tensor(一个数据类型,类似有深度的矩阵)
例如:

图像分类学习:X光胸片诊断识别----迁移学习

transforms.ToTensortransforms.Normalize():归一化处理
例如:

图像分类学习:X光胸片诊断识别----迁移学习


函数详细内容请查看此处文章

可以看出,这一块的代码就是定义一种操作集合,将一张图片进行剪裁、旋转、转为一种数据、数据归一化

继续往下看,相应的解释都在注释中 image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val', 'test']} dataloaders_dict = { x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=0) for x in ['train', 'val', 'test']}

首先是数据导入部分,这里采用官方写好的torchvision.datasets.ImageFolder接口实现数据导入。这个接口需要你提供图像所在的文件夹
x是字典的键,从后面的for迭代的范围中获取,有'train', 'val', 'test'三个值
datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x])高亮部分是数据集的文件夹路径,找到文件后,确定x,在执行第二个参数data_transforms[x],把x进行一些列处理
前面torchvision.datasets.ImageFolder只是返回列表,列表是不能作为模型输入的(我也不知道为什么),因此在PyTorch中需要用另一个类来封装列表,那就是:torch.utils.data.DataLoader
torch.utils.data.DataLoader类可以将列表类型的输入数据封装成Tensor数据格式,以备模型使用。

好,我们继续往下看 # 定义一个查看图片和标签的函数 def imshow(inp, title=None): # transpose(0,1,2),0是x轴,1是y轴,2是z轴,由(0,1,2)变为(1,2,0)就是x和z轴先交换,x和y轴再交换 inp = inp.numpy().transpose((1, 2, 0)) mean = np.array([0.485, 0.456, 0.406]) # 创建一个数组[0.485, 0.456, 0.406] std = np.array([0.229, 0.224, 0.225]) # 同样也是创建一个数组 inp = std * inp + mean # 调整图像尺寸大小等 inp = np.clip(inp, 0, 1) # 小于0的都为0,大于1的都为1,之间的不变 plt.imshow(inp) # 设置图像为灰色 if title is not None: # 如果图像有标题则显示标题 plt.title(title) # 设置图像标题 plt.pause(0.001) # 窗口绘制后停留0.001秒 imgs, labels = next(iter(dataloaders_dict['train'])) # 自动往下迭代参数对象 out = torchvision.utils.make_grid(imgs[:8]) # 将8个图拼成一张图片 classes = image_datasets['test'].classes # 每个图像的文件名 # out是一个8个图片拼成的长图,经过imshow()处理后附加标题(图片文件名的前8个字母)输出 # imshow(out, title=[classes[x] for x in labels[:8]])

输出后,在IDE中是这样的(右上角):

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsszxs.html