pytorch学习(Dataset和Tensorboard)(二)

pytorch加载数据

主要涉及到两个类:
Dataset提供一种方法去获取数据和label。

  • 如何获取每一个数据及其label。
  • 告诉我们一共有多少数据。

Dataloader为后面的网络提供不同的数据形式。

举例

如数据集:https://download.pytorch.org/tutorial/hymenoptera_data.zip
数据集

  • 在这里插入图片描述
    • 蚂蚁
    • 在这里插入图片描述
from torch.utils.data import Dataset #需要重写__getitem__方法和选择重写__len__方法。
import PIL import Image
import os
img_path = "D:\\PycharmProjects\\pytorch\\dataset\\train\\ants\\0013035.jpg"
dir_path = "dataset/train/ants"
img_path_list = os.listdir(dir.path) #这里是一个list,list里面是所有蚂蚁图片的名称(str类型)

class MyData(Dataset):
	def __init__(self, root_dir, label_dir): #root_dir = "dataset/train",label_dir = "ants"
		self.root_dir = root_dir
		self.label_dir = label_dir
		self.img_path_list = os.listdir(self_path) #这里是一个list,list里面是所有蚂蚁图片的名称(str类型)
	def __getitem__(self,idx):
		img_name = self.img_path_list[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__():
	return len(self.img_path_list)

root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
img, label = ants_dataset[0]#获取蚂蚁数据集的第一个数据和label

bees_dataset = MyData(root_dir, bees_label_dir)

train_dataset = ants_dataset + ants_dataset #可以直接相加整合

TensorBoard的使用

TensorBoard主要用来显示训练过程的一些结果,如训练过程loss是如何变化的,图像是如何变化的。。
先到需要的环境下安装该包,pip install tensorboard

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter("logs") #创建logs文件夹,后续的事件文件都会输入到该文件夹内。
# writer.add_image()
# 例:y = x
for i in range(100):
	writer.add_scalar("y = x", i, i)
# 例 y = 2x
for i in range(100):
	writer.add_scalar("y = 2x", 2*i, i)
for i in range(100):
	writer.add_scalar("y = 2x", 3*i, i) #如果名字不改的话,数据都会写入"y = 2x"这幅图中。有后续的
                                        #数据要写入的话,可以删掉原文件,或者新建文件夹存起来
writer.close()

然后在terminal中输入:

tensorboard --logdir=logs --port=6007 #logs为存放事件的文件夹,并且指定端口

进入到:http://localhost:6007即可,结果如下:
在这里插入图片描述

好的,下面是一个简单的用PyTorch训练模型并用tensorboardX记录loss曲线和acc曲线的代码演示: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.tensorboard import SummaryWriter from torchvision import datasets, transforms # 定义模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) def forward(self, x): x = nn.functional.relu(nn.functional.max_pool2d(self.conv1(x), 2)) x = nn.functional.relu(nn.functional.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = nn.functional.relu(self.fc1(x)) x = nn.functional.dropout(x, training=self.training) x = self.fc2(x) return nn.functional.log_softmax(x, dim=1) # 加载数据集 train_loader = torch.utils.data.DataLoader( datasets.MNIST('../data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader( datasets.MNIST('../data', train=False, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=1000, shuffle=True) # 定义训练函数 def train(model, device, train_loader, optimizer, criterion, epoch, writer): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() writer.add_scalar('train_loss', loss.item(), epoch * len(train_loader) + batch_idx) # 定义测试函数 def test(model, device, test_loader, criterion, epoch, writer): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += criterion(output, target).item() * len(data) pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) accuracy = correct / len(test_loader.dataset) writer.add_scalar('test_loss', test_loss, epoch) writer.add_scalar('test_accuracy', accuracy, epoch) # 初始化模型、优化器、损失函数、设备和tensorboard writer model = Net().to('cuda') optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) criterion = nn.CrossEntropyLoss() device = 'cuda' writer = SummaryWriter() # 训练和测试模型 for epoch in range(1, 11): train(model, device, train_loader, optimizer, criterion, epoch, writer) test(model, device, test_loader, criterion, epoch, writer) writer.close() ``` 运行上述代码后,就可以在tensorboard中看到train_loss、test_loss和test_accuracy的曲线了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值