大数跨境

基于pytorch自定义神经网络训练实例

基于pytorch自定义神经网络训练实例 AI探索时代
2024-06-10
0
导读:“神经网络需要大量数据的训练,才能达到适当的效果

 神经网络需要大量数据的训练,才能达到适当的效果。



了解过深度学习和神经网络的人都会好奇,神经网络到底是什么样的,怎么构建一个自己的神经网络,今天就用代码创建一个神经网络,并完成基础训练流程。


神经网络训练步骤:


  • 创建数据集

  • 加载数据集

    • 数据格式转换,使用transforms转换为Tensor格式

  • 构建神经网络

    • 用户可以根据需要自定义神经网络层数以及每层的功能

  • 训练神经网络

    • 正向传播函数

    • 反向传播函数

    • 损失函数

    • 优化器





01



创建并加载数据集


  创建数据集


神经网络模型训练第一步就是创建数据集,创建数据集有两种方式,并且创建的数据集需要经过转换器转换为tensor格式才能输入到神经网络中。


第一种是自定义数据集:


pytorch框架提供了一个Dataset的数据集接口,用户如果要加载自己的数据集,只需继承此接口即可。


如下代码为自定义数据集:


import osfrom PIL import Imageimport torchvisionfrom torch.utils.data import Dataset, DataLoader

class MyDataSet(Dataset): # 类初始化方法 python语言基础 在这个自定义数据集中主要用来传入数据集的路径与标签 用户可以根据自己的文件路径进行适当调整 def __init__(self, root_dir, label_dir, transforms = None): # 训练数据文件路径 self.root_dir = root_dir # 训练数据标签 self.label_dir = label_dir # 拼接文件路径 self.path = os.path.join(root_dir, label_dir) self.img_path = os.listdir(self.path) self.transforms = transforms
def __getitem__(self, index): img_name = self.img_path[index] img_item_path = os.path.join(self.root_dir, self.label_dir, img_name) # 重要 todo 从文件路径中获取图片 img = Image.open(img_item_path) # 转换器 把输入转化为神经网络可以识别的tensor(张量) if transforms is not None: img = self.transforms(img)        label = self.label_dir return img, label
def __len__(self): return len(self.img_path)
# pytorch提供的转换器transforms = torchvision.transforms.ToTensor()
rootDir = "dataset/train"labelDir = "ants"dataset = MyDataSet(rootDir, labelDir, transforms)
dataloader = DataLoader(dataset, batch_size=64)
for data in dataloader: img, label = data print("自定义数据集", img, label)
print("---------------------------------------------------------------")


第二种创建数据集的方法就比较简单,直接使用pytorch官网提供的数据集:


# 加载pytorch提供的数据集, 自定义数据集比较复杂,需要经过处理才可以使用,所以如果嫌麻烦也可以直接使用pytorch提供的数据集dataset = torchvision.datasets.CIFAR10("dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)


对初学者来说,最好的方式是选择第二种创建数据集的方法,因为自定义数据集处理比较复杂,很容易出问题,所以为了防止挫伤积极性,可以先使用官方提供的数据集。


创建完数据集之后,需要加载数据集:


加载数据集就比较简单:


# 数据集加载 dataset为前面创建的数据集 batch_size 表示批次加载数量dataloader = DataLoader(dataset, batch_size=64)


自此,数据集处理部分结束,下面开始构建神经网络。



02



构建神经网络并训练


pytorch所有神经网络都要继承nn.Module接口:


# 定义卷积神经网络(CNN) 用户可以根据需求实现不同的神经层 此神经网络经过多次卷积与池化class NNetwork(nn.Module):    def __init__(self):        super(NNetwork, self).__init__()
# 卷积 self.conv1 = Conv2d(3, 32, 5, padding=2) # 池化 self.pool1 = MaxPool2d(2) # 卷积 self.conv2 = Conv2d(32, 32, 5, padding=2) # 池化 self.pool2 = MaxPool2d(2) # 卷积 self.conv3 = Conv2d(32, 64, 5, padding=2) # 池化 self.pool3 = MaxPool2d(2) # flatten self.flt = Flatten() # 线性层 self.lin1 = Linear(1024, 64) self.lin2 = Linear(64, 10)
    # 前向传播 通过定义的神经网络层处理 def forward(self, x): x = self.conv1(x) x = self.pool1(x) x = self.conv2(x) x = self.pool2(x) x = self.conv3(x) x = self.pool3(x) x = self.flt(x) x = self.lin1(x) x = self.lin2(x) return x
# 创建神经网络myModel = NNetwork()
# 控制台输出神经网络结构print(myModel)


下面开始训练模型,并使用损失函数与优化器调整模型参数:


# 创建损失函数 pytorch提供loss = nn.CrossEntropyLoss()
# 优化算法 pytorch提供 parameters() 获取模型参数 tensor格式optime = torch.optim.SGD(myModel.parameters(), lr=0.01)
# 数据集加载 batch_size 表示批次加载数量dataloader = DataLoader(dataset, batch_size=64)
# 记录训练次数total_train_step = 0
# 训练次数 这里是10次for epoch in range(10):
for data in dataloader: img, targets = data # print(img, label) outputs = myModel(img)
# 计算损失差 损失差越小 训练效果越好 result_loss = loss(outputs, targets)
# 优化模型
# 优化器梯度置为0 optime.zero_grad()
# 反向传播 result_loss.backward()
optime.step()
total_train_step = total_train_step + 1 print("训练次数: {}, 损失差Loss: {}".format(total_train_step, result_loss.item()))


自此,模型训练完成。


完整代码可以在公众号发送 模型代码 四个字获取。





【声明】内容源于网络
0
0
AI探索时代
专注AI工程化落地,让你的技术不再纸上谈兵
内容 367
粉丝 0
AI探索时代 专注AI工程化落地,让你的技术不再纸上谈兵
总阅读133
粉丝0
内容367