PIL读取图片
from PIL import Image
img_path = 'D:\\Project\\pytorch\\datasets\\practice_dataset\\train\\ants_image\\0013035.jpg'
img = Image.open(img_path)
img.show()
加载数据集
from torch.utils.data import Dataset
from PIL import Image
import os
class MyData(Dataset):
def __init__(self, root_dir,label_dir):
"""
:param root_dir:根路径
:param 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)
def __getitem__(self, idx):
"""
:param idx:id
:return:
"""
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)
root_dir = "datasets/practice_dataset/train"
ants_label_dir = "ants_image"
ants_dataset = MyData(root_dir, ants_label_dir)
img ,label = ants_dataset[0]
img.show()
print(label)
绝对路径和相对路径
# 绝对路径
img_path = 'D:\\Project\\pytorch\\datasets\\practice_dataset\\train\\ants_image'
# 相对路径
img_path = 'datasets/practice_dataset/train/ants_image'
TensorBoard
神经网络
import torch
from jinja2 import optimizer
from torch import nn
# from model import Network
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
class Network(nn.Module):
def __init__(self):
super().__init__()
# 线性层1:输入层和隐藏层之间的线性层
self.layer1 = nn.Linear(784,256)
# 线性层2:隐藏层和输出层之间的线性层
self.layer2 = nn.Linear(256,10)
def forward(self,x):
x = x.view(-1,28*28) # 使用view函数,将x展平
x = self.layer1(x) # 将x输入至layer1
x = torch.relu(x) # 使用relu激活
return self.layer2(x) # 输入至layer2计算结果
# 这里我们没有直接定义softmax层
if __name__ == '__main__':
# 1 加载数据集
transform = transforms.Compose([
transforms.Grayscale(num_output_channels=1), #转化为单通道灰度图
transforms.ToTensor() #转化为张量
])
# 读入并构造数据集
train_dataset = datasets.ImageFolder(root='./mnist_images/train', transform=transform)
print("train_dataset length:",len(train_dataset))
# 小批量的数据读入
train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
print("train_loader length:",len(train_loader))
# 2 训练过程
for epoch in range(10):
# 训练轮次
for batch_index ,(data,label) in enumerate(train_loader):
# enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
# 同时列出数据和数据下标,一般用在for 循环当中。
# 1 计算神经网络的前向传播结果
output = model(data)
# 2 计算output和标签label之间的损失loss
loss = criterion(output,label)
# 使用backward计算梯度
loss.backward()
# 3 使用backward计算梯度
optimizer.step()
optimizer.zero_grad()
if batch_index % 100 == 0:
print(f"epoch:{epoch} batch:{batch_index} loss:{loss}")
# 3 保存训练模型
torch.save(model.state_dict(),'./mnist_model.pth') # 保存模型
# 4 测试
right = 0 # 保存正确识别的数量
for i ,(x,y) in enumerate(train_dataset):
output = model(x) # 将其中的数据x输入到模型
predict = output.argmax(1).item() # 选择概率最大标签的作为预测结果
# 对比预测值predict和真实标签y
if predict == y:
right += 1
else :
img_path = test_dataset.samples[i][0]
print(f"wrong case:predict = {predict} y = {y} img_path:{img_path}")
输入层
隐藏层
输出层