PyTorch 教程-图像识别中的图像转换

在PyTorch中进行图像识别,加载和转换是两个基本的概念,是识别过程的起始步骤。
以下是逐步执行加载和转换的步骤:
步骤1:
在第一步中,我们安装所有必需的库,如pip、torchvision、numpy等。如果已经满足所有必需的库,则导入torch,然后从torchvision导入datasets和transforms。为了绘制我们的数据集,我们将导入matplotlib.pyplot库,还将导入numpy执行操作。导入库如下:
import torch
import matplotlib.pyplot as plt
import numpy as np
from torchvision import datasets, transforms
步骤2:
在第二步中,我们使用datasets的MNIST()方法加载MNIST数据集。在第一个参数中,我们指定了数据的根目录,如下所示:
training_dataset=datasets.MNIST(root='./data')
在第二个参数中,我们设置train='true'。我们这样做是为了初始化MNIST训练数据集。之后,我们设置download='true',如果数据文件夹中没有数据文件,它将下载到数据文件夹中。
Training_dataset=datasets.MNIST(root='./data',train=True,download=True)
最后一个参数将是transform,它等于在training_dataset之前初始化的transform1参数。此参数规定了您希望在图像上应用的任何图像操作。
training_dataset=datasets.MNIST(root='./data',train=True,download=True,transform=transform1)
注意:我们的MNIST图像是28*28的灰度图像,这意味着每个图像都是一个28像素宽和28像素长的二维数字数组,每个像素的强度范围从0到255。
我们必须将图像从数组转换为张量。我们将使用transforms的Compose()方法,它允许我们将多个转换链接在一起。因此,我们的第一个转换,作为组合的第一个参数传递,将是transforms.ToTensor()。这将将我们的0到255范围内的numpy数组转换为0到1范围内的浮点张量。
transform1=transforms.Compose([transforms.ToTensor()])
我们还将使用transforms的normalize()方法应用标准化转换。
transform1=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])
在normalize()方法中,我们指定用于规范化张量图像的均值,并指定中心偏差。现在,我们调用我们的训练数据集:
training_dataset
步骤3:
我们将通过绘制来进一步分析此数据集中的图像。为了绘制张量图像,我们必须将其转换回numpy数组。我们将在一个包含一个参数的函数def im_convert()中执行此操作,该参数将是我们的张量图像。
def im_convert(tensor):
在将张量转换为numpy数组之前,我们首先将其克隆。它将创建张量的新副本,然后我们使用detach()函数,然后使用numpy:
image=tensor.clone().detach().numpy()
注意:将转换为numpy数组的张量具有第一、第二和第三维的形状。第一维代表颜色通道,第二和第三维代表图像的宽度和高度以及像素。
我们知道MNIST数据集中的每个图像都是一个对应于单个颜色通道的灰度图像,宽度和高度为28*28像素。因此,形状将为(1,28,28)。
步骤4:
为了绘制我们的图像,要求图像具有形状(28,28,1)。因此,我们将通过交换轴0、1和2来转置我们的图像:
image=image.transpose(1,2,0)
此方法交换轴0与轴1,轴1与轴2。
步骤5:
在接下来的步骤中,我们对我们之前进行过规范化的图像进行反规范化。规范化是通过减去均值并除以标准差完成的。我们将通过标准差乘以均值,然后加上均值来进行反规范化:
image=image*(np.array((0.5,0.5,0.5))+np.array((0.5,0.5,0.5)))
为了确保在0到1之间的范围,我们使用clip()函数,并将零和一作为参数传递。我们将clip函数应用于最小值为0和最大值为1,并返回图像:
image=image.clip(0,1)
return image
步骤6:
现在,我们为更好的可视化绘制我们的MNIST数据集。我们将从training_loader()加载图像开始。training loader是我们在训练神经网络时之前用于指定训练批次的。对于每个epoch,我们执行整个数据集的单次传递。但是,具有六万张训练图像的一个epoch对于一次性适应计算机来说太大了。因此,我们将其划分为较小的批次,使用我们的train loader:
training_loader=torch.utils.data.DataLoader(dataset=training_dataset,batch_size=100,shuffle=True)
第一个参数是数据集,等于我们的training_dataset。第二个参数是我们的批量大小,等于100。第三个参数,我们将shuffle设置为true。
注意:批量大小为100将花费600次迭代才能完成一个epoch,并且每次迭代都会更新神经网络的权重并最小化错误。
步骤7:
在下一步中,我们包装我们的train loader。它将创建一个对象,允许我们一次遍历可变的训练 loader 中的一个元素。我们通过在dataiter上调用next来一次访问它的一个元素。next()函数将获取我们训练数据的第一个批次,该训练数据将分为图像和标签:
dataiter=iter(training_loader)
images,labels=dataiter.next()
步骤8:
现在,我们将绘制批次中的图像以及它们对应的标签。这将通过plt的figure函数以及将figsize设置为整数元组25*4来完成,该元组将指定图的宽度和高度:
fig=plt.figure(figsize=(25,4))
现在,我们绘制来自我们批次的20个MNIST图像。我们使用add_subplot()方法向当前图添加一个子图,并传递2、10和idx作为函数的参数。这里两是行数,十是列数,idx是索引。
ax=fig.add_subplot(2,10,idx+1)
现在,我们将显示我们的图像,使用im_show()函数,并为每个图像绘制一个标题:
plt.imshow(im_convert(images[idx]))
ax.set_title([labels[idx].item()])
最后调用plt.show(),它将为我们提供预期的结果。
完整代码
import torch
import matplotlib.pyplot as plt
import numpy as np
from torchvision import datasets,transforms
transform1=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])
training_dataset=datasets.MNIST(root='./data',train=True,download=True,transform=transform1)
training_loader=torch.utils.data.DataLoader(dataset=training_dataset,batch_size=100,shuffle=True)
def im_convert(tensor):
image=tensor.clone().detach().numpy()
image=image.transpose(1,2,0)
print(image.shape)
image=image*(np.array((0.5,0.5,0.5))+np.array((0.5,0.5,0.5)))
image=image.clip(0,1)
return image
dataiter=iter(training_loader)
images,labels=dataiter.next()
fig=plt.figure(figsize=(25,4))
for idx in np.arange(20):
ax=fig.add_subplot(2,10,idx+1)
plt.imshow(im_convert(images[idx]))
ax.set_title([labels[idx].item()])
plt.show()
现在,借助这些标签图像,我们将实现一个神经网络,用于对新的测试图像进行分类。