PyTorch 循序渐进建立一个简单的神经网络模型

该博客展示了如何使用PyTorch构建和训练神经网络模型。首先通过torch.nn.Sequential建立简单模型,然后使用nn.Module创建自定义类进行模型搭建。数据集通过Dataset类实现,使用SGD优化器和MSELoss损失函数进行训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例子一:建立一个简单的神经网络模型,主体是使用torch.nn.Sequential完成神经网络的模型建立,使用SGD方法优化模型参数,代价函数选择torch.nn.MSELoss()完成(均方误差代价函数)

注意:程序是在jupytpycharmer notebook完成的,和pycharm之类的可能有细微不同(比如print)

import torch
import torch.nn as nn
import numpy as np
import torch.nn.functional as F
from torch.utils.data import Dataset,DataLoader, RandomSampler

#仅限jupyter notebook上使用(没什么重要意义)
#from IPython.core.interactiveshell import InteractiveShell
#InteractiveShell.ast_node_interactivity = 'all'

#数据构建——方法一:直接建
#构建输入集
x = np.array([
    [0,0],
    [0,1],
    [1,0],
    [1,1]
])
x = torch.tensor(x).float()
#labels
y = np.array([
    [1],
    [0],
    [0],
    [1]
])
y = torch.tensor(y).float()

#搭建网络——方法一
LinearModel = nn.Sequential(
    nn.Linear(2,10),  #输入2,输出10
    nn.ReLU(),
    nn.Linear(10,1),  #输入10,输出1
    nn.Sigmoid()
)
print(LinearModel)

#设置优化器
#采用SGD方法训练优化,传入网络参数和学习率
optimizer = torch.optim.SGD(LinearModel.parameters(),lr=0.05)  
loss_func = nn.MSELoss()   #代价函数选择的MSE(均方误差代价函数)

#训练网络
for epoch in range(1000):  #训练迭代500次
    #1. 数据放入模型,计算出结果
    out = LinearModel(x)
    #2. 计算误差
    loss = loss_func(out,y)
    #3. 清除梯度(是为了每一次重新迭代时清除上一步所求出的梯度)
    optimizer.zero_grad()
    #4. 误差反向传播
    loss.backward()
    #5. 优化参数
    optimizer.step()

#测试
#tensor变量包含两部分:tensor数据+tensor自动求导参数  不加.data全部显示
print(LinearModel(x).data)  

例子二:数据建立方式不变,模型采用nn.Module继承类建立,需要训练参数的网络层放在__init__()构造函数里;不需要训练参数的层(比如ReLU,dropout)放在forward()中,需要使用torch.nn.functional来构建。forward()函数就是用来定义网络层间的连接情况。

nn.Module继承方法可以查看这篇博客,讲的很清晰:pytorch教程之nn.Module类详解——使用Module类来自定义模型

import torch
import torch.nn as nn
import numpy as np
import torch.nn.functional as F
from torch.utils.data import Dataset,DataLoader, RandomSampler

#from IPython.core.interactiveshell import InteractiveShell
#InteractiveShell.ast_node_interactivity = 'all'

#数据构建——方法一:直接建
#构建输入集
x = np.array([
    [0,0],
    [0,1],
    [1,0],
    [1,1]
])
x = torch.tensor(x).float()
#labels
y = np.array([
    [1],
    [0],
    [0],
    [1]
])
y = torch.tensor(y).float()

#搭建网络——方法二
class LModel(nn.Module):
    def __init__(self):
        super(LModel,self).__init__()
        self.linear1 = nn.Linear(2,10)
        self.linear2 = nn.Linear(10,1)
    def forward(self,x):
        x = self.linear1(x)
        x = F.relu(x)
        x = self.linear2(x)
        x = F.sigmoid(x)
        return x
        
lmodel = LModel()
print(lmodel)

#设置优化器
#采用SGD方法训练优化,传入网络参数和学习率
optimizer = torch.optim.SGD(lmodel.parameters(),lr=0.05)  
loss_func = nn.MSELoss()   #代价函数选择的MSE(均方误差代价函数)

#训练网络
for epoch in range(1000):  #训练迭代500次
    #1. 数据放入模型,计算出结果
    out = lmodel(x)
    #2. 计算误差
    loss = loss_func(out,y)
    #3. 清除梯度(是为了每一次重新迭代时清除上一步所求出的梯度)
    optimizer.zero_grad()
    #4. 误差反向传播
    loss.backward()
    #5. 优化参数
    optimizer.step()
    
#测试
#tensor变量包含两部分:tensor数据+tensor自动求导参数  不加.data全部显示
print(lmodel(x).data)  

例子三:数据使用torch.utils.data中的Dataset继承类来实现,因此数据集中的各类属性可以在类中设置,模型还是使用nn.Module继承类

import torch
import torch.nn as nn
import numpy as np
import torch.nn.functional as F
from torch.utils.data import Dataset,DataLoader, RandomSampler

#from IPython.core.interactiveshell import InteractiveShell
#InteractiveShell.ast_node_interactivity = 'all'

#构建输入集
x = np.array([
    [0,0],
    [0,1],
    [1,0],
    [1,1]
])
x = torch.tensor(x).float()
#labels
y = np.array([
    [1],
    [0],
    [0],
    [1]
])
y = torch.tensor(y).float()

#数据构建——方法二:使用Dataset类
class MyDataset(Dataset):
    def __init__(self, dataset, labels):
        self.dataset = dataset
        self.labels = labels
        self.nums = len(dataset)
        
    def __getitem__(self, index):
        data = {'dataset': self.dataset[index],
                'labels': self.labels[index]}
        return data
    
    def __len__(self):
        return self.nums
    
train_dataset = MyDataset(x,y)
train_dataset

train_sampler = RandomSampler(train_dataset)    #将训练集打乱
train_loader = DataLoader(dataset=train_dataset,   #按batch_size加载训练集
                          batch_size=2, 
                          sampler=train_sampler,
                          num_workers=0)

"""
#把第一个batch_data拿出来看看
cnt=0
for step, batch_data in enumerate(train_loader):
    #print(step)
    #print(batch_data)
    cnt = cnt+1
    if cnt>=1:
        break
print(batch_data)
batch_data['dataset']
batch_data['labels']
"""

#搭建网络——方法二
class LModel(nn.Module):
    def __init__(self):
        super(LModel,self).__init__()
        self.linear1 = nn.Linear(2,10)
        self.linear2 = nn.Linear(10,1)
    def forward(self,x):
        x = self.linear1(x)
        x = F.relu(x)
        x = self.linear2(x)
        x = F.sigmoid(x)
        return x
        
lmodel = LModel()
print(lmodel)

#设置优化器
#采用SGD方法训练优化,传入网络参数和学习率
optimizer = torch.optim.SGD(lmodel.parameters(),lr=0.05)  
loss_func = nn.MSELoss()   #代价函数选择的MSE(均方误差代价函数)

#训练网络
for epoch in range(1000):  #训练迭代500次
    for step, batch_data in enumerate(train_loader):
        #1. 数据放入模型,计算出结果
        #lmodel.train()
        out = lmodel(batch_data['dataset'])
        #2. 计算误差
        loss = loss_func(out,batch_data['labels'])
        #loss = lmodel(**batch_data)[0]    #应该就是训练后的loss值,误差计算
        #3. 清除梯度(是为了每一次重新迭代时清除上一步所求出的梯度)
        optimizer.zero_grad()
        #4. 误差反向传播
        loss.backward()
        #5. 优化参数
        optimizer.step()

#测试
#tensor变量包含两部分:tensor数据+tensor自动求导参数  不加.data全部显示
print(lmodel(x).data)  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音无八重

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值