import torch from torch.utils.data import Dataset, DataLoader import pandas as pd import os from PIL import Image from torchvision import datasets, transforms from torchvision.datasets import ImageFolder class MyCsvDataset(Dataset): def __init__(self, filepath): df = pd.read_csv(filepath) # 删除文字列 df.drop(["学号", "姓名"], inplace=True, axis=1) # 转换为tensor t = torch.tensor(df.values, dtype=torch.float) # 最后一列以前的为data,最后一列为label data = t[...,:-1] label = t[...,-1] self.data = data self.label = label def __len__(self): return len(self.data) def __getitem__(self, index): data = self.data[index] label = self.label[index] return data, label def load(): filepath = '大数据答辩成绩表.csv' dataset = MyCsvDataset(filepath) dataloader = DataLoader(dataset, batch_size=10, shuffle=True) for data,label in dataloader: print(data) print(label) break #图片数据集 class Imgdataset(Dataset): def __init__(self, folder): dirnames = [] filepathlist = [] labels = [] for root, dirs, files in os.walk(folder): if len(dirs) > 0: dirnames = dirs for file in files: filepath = os.path.join(root, file) filepathlist.append(filepath) #获取label classname = os.path.split(root)[-1] index = dirnames.index(classname) labels.append(index) self.data = filepathlist self.labels = labels def __len__(self): return len(self.data) def __getitem__(self, index): filepath = self.data[index] img = Image.open(filepath) transform = transforms.Compose([ #图片缩放,统一宽高 transforms.Resize((112, 112)), transforms.ToTensor() ]) t_img = transform(img) label = self.labels[index] return t_img, label def test01(): folder = os.path.join(os.path.dirname(__file__),'dataset') dataset = Imgdataset(folder) dataloader = DataLoader(dataset, batch_size=4, shuffle=True) for data,label in dataloader: print(data) print(label) break #使用ImageFolder加载图片数据集 #前提:图片的存储目录结构需符合ImageFolder规定的目录结构 def test02(): folder = os.path.join(os.path.dirname(__file__), 'dataset') transform = transforms.Compose([ # 图片缩放,统一宽高 transforms.Resize((112, 112)), transforms.ToTensor() ]) dataset = ImageFolder(folder,transform = transform) dataloader = DataLoader(dataset, batch_size=4, shuffle=True) for data, label in dataloader: print(data) print(label) break #加载MNIST数据集 def test03(): transform = transforms.Compose([ transforms.ToTensor() ]) # MNIST():加载MNIST数据集 # 参数: # root:保存数据集的路径 # train:是否为训练数据,True-训练数据,False-测试数据 # transform:图片预处理 dataset_train = datasets.MNIST( root='./data', train=True, transform=transform, download=True ) dataloader_train = DataLoader(dataset_train, batch_size=1, shuffle=True) for data, label in dataloader_train: print(data) data = torch.squeeze(data) transform = transforms.ToPILImage() img = transform(data) print(label) break if __name__ == "__main__": test03()
import torch import matplotlib.pyplot as plt import torch.nn.functional as F from torch import nn # plt支持中文 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False def test001(): # 一行两列绘制图像 _, ax = plt.subplots(1, 2) # 绘制函数图像 x = torch.linspace(-10, 10, 100) y = torch.sigmoid(x) # 网格 ax[0].grid(True) ax[0].set_title("sigmoid 函数曲线图") ax[0].set_xlabel("x") ax[0].set_ylabel("y") # 在第一行第一列绘制sigmoid函数曲线图 ax[0].plot(x, y) # 绘制sigmoid导数曲线图 x = torch.linspace(-10, 10, 100, requires_grad=True) # y = torch.sigmoid(x) * (1 - torch.sigmoid(x)) # 自动求导 torch.sigmoid(x).sum().backward() ax[1].grid(True) ax[1].set_title("sigmoid 函数导数曲线图", color="red") ax[1].set_xlabel("x") ax[1].set_ylabel("y") # ax[1].plot(x.detach().numpy(), y.detach()) # 用自动求导的结果绘制曲线图 ax[1].plot(x.detach().numpy(), x.grad.detach().numpy()) # 设置曲线颜色 ax[1].lines[0].set_color("red") plt.show() #softmax()函数 def test02(): x = torch.tensor([[1, -2, 3],[4,5,6]],dtype=torch.float) softmax = nn.Softmax() y = softmax(x) print(y) if __name__ == "__main__": test02()