PyTorch Tutorial 09 - Dataset and Dat...

教程Python代码如下:
"""
epoch = 1 forward and backward pass of ALL training samples
batch_size = numberlof training samples in one forward & backward pass
number of iterations = number of passes,each pass using [batch_size] number of samples
e.g. 100 samples,batch_size=20 --> 100/20 = 5 iterations for 1 epoch
"""
import torch
import torchvision
from torch.utils.data import Dataset, DataLoader
import numpy as np
import math
#实现自己的自定义数据集
class WineDataset():
def __init__(self):
# data loading, 数据加载
xy = np.loadtxt('./Data/wine.csv',delimiter=",", dtype=np.float32, skiprows=1) #delomiter分隔符,skiprows=1跳过第一行(第一行为标题)
# 把数据集分成 x 和 y
self.x = torch.from_numpy(xy[:,1:]) #不要第一行
self.y = torch.from_numpy(xy[:, [0]]) # n_samples, 1:只要第一列,这样就有了样品的大小数
self.n_samples = xy.shape[0]
def __getitem__(self, index):
# dataset[0], 允许以后进行索引,所以我们可以调用索引为0的数据集
return self.x[index], self.y[index]
def __len__(self):
# len(dataset), 调用数据集的长度
return self.n_samples
dataset = WineDataset()
# firat_data = dataset[0]
# features, labels = firat_data
# print(features, labels)
# 使用数据加载器
dataloader = DataLoader(dataset = dataset, batch_size=4, shuffle=True, num_workers=0)
"""
datatiter = iter(dataloader)
data = next(datatiter)
features, labels = data
print(features, labels)
"""
# training loop
num_epochs = 2
total_samples = len(dataset)
n_iterations = math.ceil(total_samples/4)
print(total_samples, n_iterations)
for epoch in range(num_epochs):
for i, (inputs, labels) in enumerate(dataloader):
#forward, backward, updata
if (i+1) % 5 == 0:
print(f'epoch {epoch+1}/{num_epochs}, step {i+1}/{n_iterations}, inputs {inputs.shape}')