首先,pytorch是分下面几个部分的
- 第一个为核心部分
- 第二个为处理语音的部分
- 第三个为文本部分
- 第四个为视觉部分
- 下面的比较不常用
数据及加载数据
当我们需要用自己的数据去完成一些任务的时候,我们就需要定义自己的数据类
import torch
from torch.utils.data import Dataset
#首先要继承Dataset
class MyData(Dataset):
#参数为数据路径和标签路径
def __init__(self,root_dir,label_dir):
self.root_dir=root_dir
self.label_dir=label_dir
self.path=os.path.join(self.root_dir,self.label_dir)
self.img_path=os.listdir(self.path)
#按照索引去获取某个数据和标签 比如第1张图片和它的标签 实现这个方法才能完成后面对应的操作
def __getitem__(self, idx):
img_name=self.img_path[idx]
img_item_path=os.path.join(self.root_dir,self.label_dir,img_name)
img=Image.open(img_item_path)
label=self.label_dir
return img,label
def __len__(self):
return len(self.img_path)
接着是关于pytorch中视觉的一点方法
torchvision.transforms
transforms 里面有很多对图片数据的处理
首先它们都是类:
- Totensor
Convert aPIL Image
ornumpy.ndarray
to tensor. This transform does not support torchscript. - ToPILImage
- Normalize:归一化
- resize
- Compose Compose()中的参数需要是一个列表 Python中,列表的表示形式为[数据1,数据2,.….] 在Compose中,数据需要是 transforms类型,所以得到,Compose([transforms参数1 transforms参数2.….])
- 等一些列
具体例子
#Totensor
#转成tensor PIL image----->tensor
img_path='D:\PycharmProjects\pytorch_learn\hymenoptera_data\\train\\ants\\6240338_93729615ec.jpg'
img=Image.open(img_path)
tran_tensor=transforms.ToTensor()
img_tensor=tran_tensor(img)
#Normalize
#归一化 tensor---tensor
#第一个参数为均值 第二个参数为标准差
#然后按照归一化的公式对每个通道进行计算 input[channel] = (input[channel] - mean[channel]) / std[channel] 根据相应通道的均值标准差进行计算
#值得注意的是,在使用该语句之前,需使用transforms.ToTensor()函数将输入数据的形状由H、W、C变为C、H、W,然后将所有像素值除以255,即将数据归一化到[0,1]。
#其中mean和std分别通过(0.5,0.5,0.5)和(0.5,0.5,0.5)进行指定。原来的0-1最小值0则变成(0-0.5)/0.5=-1,而最大值1则变成(1-0.5)/0.5=1
tran_norm=transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm=tran_norm(img_tensor)
#resize
#resize PIL image---->PIL image
# print(img.size)
trans_resize=transforms.Resize((512,512))
img_re=trans_resize(img)
# print(type(img_re))
# print(img_re.size)
#Compose 其实就是把多个步骤整合到一起 让图片经过里面的一些列操作
trans_resize_2=transforms.Resize(512)
#这里就是先resize 然后转成tensor
img_compose=transforms.Compose([trans_resize_2,tran_tensor])
img_resize_2=img_compose(img)
# print(type(img_resize_2))
#torchvision中数据集的使用
dataset_tranforms=transforms.Compose([transforms.ToTensor()])
#root存放的目录 train是否为训练集 download是否下载 transform对数据进行一些列操作
train_set=torchvision.datasets.CIFAR10(root='./dataset',train=True,download=True,transform=dataset_tranforms)
test_set=torchvision.datasets.CIFAR10(root='./dataset',train=False,download=True,transform=dataset_tranforms)
#这个数据集的用法跟我们自定义数据集是一样的 直接按索引拿到对应图片数据与标签
print(test_set[0])
dataloader
#dataloader 把dataset比喻成一打扑克 那dataloader就是手 里面的方法比如batch_size一次拿多少到我们的手上 shuffle就是打乱牌 跟洗牌一样 transform的目的是把它转成tensor
test_set=torchvision.datasets.MNIST(root='./root',train=False,transform=dataset_tranforms,download=True)
test_loader=DataLoader(test_set,batch_size=4,shuffle=True,num_workers=0,drop_last=False)
for data in test_loader:
img,target=data
print(img.shape)
print(target)