少女祈祷中...

首先,最重要的一点,所有的数据(不管是表格、图像、文本)都要转化成张量。

经典数据集

这里的经典数据集是指可以直接用pytorch中的torchvision下载和直接使用的数据集,如MNIST,CIFAR。这些数据这些数据都可以直接用torch.utils.data.DataLoader加载。

1
2
3
4
5
6
7
8
9
10
import torch
import torchvision
from torch.utils import data
from torchvision import transforms

trans = transforms.ToTensor() #在导入数据时直接转为张量。
mnist_train = torchvision.datasets.FashionMNIST(root='./data',
train=True,transform=trans,download=False)

train_load = data.DataLoader(mnist_train,batch_size=16,shuffle=True)

表格数据

表格数据一般是csv格式,在导入时用pandas中的函数处理。一般会取其中某几列为特征,某一列为标签。

1
2
3
4
import pandas as pd
df = pd.read_csv(path)
features = df.drop(['A1','A2'],axis=1) #其中A1,A2是剔除掉的列,其余的列被选为特征。
labels = df.loc[:,'A3'] #A3列被选为标签。

用sklearn中的preprocessing.scale可以将特征归一化,结果会返回一个numpy的数组。经过一些实践发现,有时候归一化反而会导致负提升,所以并不是所有数据都要归一化,具体问题具体分析。

1
2
from sklearn import preprocessing
features = preprocessing.scale(features)

之后将Dateframe或者numpy数组转为张量。

1
2
features_tensor = torch.from_numpy(features).float()  #numpy数组转张量。
labels_tensor = torch.tensor(labels.values,dtype=torch.long) #DataFrame转张量。

将两个张量features_tensor和lables_tensor合并为数据集dataset,并划分为训练集和测试集。

1
2
3
4
from torch.utils.data import TensorDateset,random_split

dataset = TensorDataset(features_tensor,labels_tensor)
train_set,test_set = random_split(dataset,[train_size,test_size]) #随机划分。

到这一步,自建的数据集和经典数据集就没太大差别了,之后创建数据加载器加载小批量数据。

1
2
from torch.utils.data import DataLoader
train_load = DataLoader(train_set,batch_size=2^n,shuffle=True)

其中,batch_size一般设为2的n次方大小(充分利用GPU),shuffle为是否随机打乱顺序。

图像数据

一般我们需要把图像数据都放进一个文件夹中,并在程序中打开文件夹导入数据。假如数据的总目录是./data,在该目录下有两个文件夹,分别打包了训练集和测试集,./data/train和./data/test。假如这是一个二分类任务,在训练集文件夹中,又有两个文件夹,分别是两类图像,./data/train/data1和./data/train/data2。进入每一类文件夹后,再列出每个图像文件名,将其导入程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import os
from PIL import Image #用来读入图片
import torchvision.transforms as transforms

transform = transforms.Compose([transforms.ToTensor()]) #用来将图像数据转为张量。

imgs_list = [] #两个列表用来存放特征和标签。
labels_list = []

#这里演示训练集数据的导入方法,测试集同理。
train_path = './data/train'
file = os.listdir(train_path)

path = train_path+'/' #img_path = './data/train'多了一条/。

for i in file: #列举在这个文件夹中的每个文件名,在本例中就是data1和data2两个文件夹。

imgs_path = path + i #imgs_path = './data/train/data1'
for j in imgs_path: #列举该路径下的所有图片文件名
imgs_file = imgs_path + '/' + j #imgs_file = './data/train/data1/img1.jpg'

img = Image.open(imgs_file) #读取图像。
img = img.resize((width,height),Image.NEAREST) #可以调整图像尺寸。
img_tensor = transform(img) #图像转为张量。
imgs_list.append(img_tensor) #打包成列表。
labels_list.append(torch.tensor(labels))#标签可能是手动添加的,
#也可能是数据直接给了标签,
#总之一一对应上就行。

这样可以得到两个列表,一个装着图片张量,一个装着标签张量。再将两个列表转为张量。

1
2
imgs_tensor = torch.tensor(imgs_list)
labels_tensor = torch.tensor(labels_list)

到这里得到的两个张量相当于表格数据中的特征张量和标签张量,之后用与构建表格数据集相同的方法打包成数据集。

1
2
from torch.utils.data import TensorDateset
dataset = TensorDataset(imgs_tensor,labels_tensor)

文本数据处理方法

不懂哦,太难了。 直接用Huggingface的工具吧。 a1045b3cf6425870d559bad8b37ceb7f.png