“ 神经网络需要大量数据的训练,才能达到适当的效果。”
了解过深度学习和神经网络的人都会好奇,神经网络到底是什么样的,怎么构建一个自己的神经网络,今天就用代码创建一个神经网络,并完成基础训练流程。
神经网络训练步骤:
创建数据集
加载数据集
数据格式转换,使用transforms转换为Tensor格式
构建神经网络
用户可以根据需要自定义神经网络层数以及每层的功能
训练神经网络
正向传播函数
反向传播函数
损失函数
优化器

01
—
创建并加载数据集
创建数据集
神经网络模型训练第一步就是创建数据集,创建数据集有两种方式,并且创建的数据集需要经过转换器转换为tensor格式才能输入到神经网络中。
第一种是自定义数据集:
pytorch框架提供了一个Dataset的数据集接口,用户如果要加载自己的数据集,只需继承此接口即可。
如下代码为自定义数据集:
import osfrom PIL import Imageimport torchvisionfrom torch.utils.data import Dataset, DataLoaderclass 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 = transformsdef __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_dirreturn img, labeldef __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 = dataprint("自定义数据集", 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)# flattenself.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)# 优化模型# 优化器梯度置为0optime.zero_grad()# 反向传播result_loss.backward()optime.step()total_train_step = total_train_step + 1print("训练次数: {}, 损失差Loss: {}".format(total_train_step, result_loss.item()))
自此,模型训练完成。
完整代码可以在公众号发送 模型代码 四个字获取。

