一个简单的神经网络例子

来自《老饼讲解神经网络》 :www.bbbdata.com


目录

一.问题与数据

二.确定模型结构与训练算法

三.代码实现

四. 网络预测

五. 获取最终的数学表达式


在本文,展示一个matlab2014实现神经网络的简单例子。

一.问题与数据

数据如下,x1,x2为输入,y为对应的输出,现需要训练一个网络,用x1,x2预测y.

二.确定模型结构与训练算法

我们这里采用的网络结构如下

1:节点个数设置: 输入层、隐层、输出层的节点个数分别为[2 ,3,1]。
2:传递函数设置:隐层( tansig函数)。输出层(purelin函数)。
3:训练方式:trainlm。

则模型结构拓扑图如下:

模型的数学表达式如下:

三.代码实现

 在matlab2014b里写代码:

x1 = [-3,-2.7,-2.4,-2.1,-1.8,-1.5,-1.2,-0.9,-0.6,-0.3,0,0.3,0.6,0.9,1.2,1.5,1.8];% x1:x1 = -3:0.3:2;
x2 = [-2,-1.8,-1.6,-1.4,-1.2,-1,-0.8,-0.6,-0.4,-0.2,-2.2204,0.2,0.4,0.6,0.8,1,1.2]; % x2:x2 = -2:0.2:1.2;
y  = [0.6589,0.2206,-0.1635,-0.4712,-0.6858,-0.7975,-0.8040,...
          -0.7113,-0.5326,-0.2875 ,0,0.3035,0.5966,0.8553,1.0600,1.1975,1.2618];    % y: y = sin(x1)+0.2*x2.*x2;

inputData  = [x1;x2];      % 将x1,x2作为输入数据
outputData = y;            % 将y作为输出数据
setdemorandstream(88888);%指定随机种子,这样每次训练出来的网络都一样。

%使用用输入输出数据(inputData、outputData)建立网络,
%隐节点个数设为3.其中隐层、输出层的传递函数分别为tansig和purelin,使用trainlm方法训练。

net = newff(inputData,outputData,3,{'tansig','purelin'},'trainlm');

%设置一些常用参数
net.trainparam.goal = 0.0001;               % 训练目标:均方误差低于0.0001
net.trainparam.show = 400;                  % 每训练400次展示一次结果
net.trainparam.epochs = 15000;              % 最大训练次数:15000.
[net,tr] = train(net,inputData,outputData); % 调用matlab神经网络工具箱自带的train函数训练网络


simout = sim(net,inputData);                % 调用matlab神经网络工具箱自带的sim函数得到网络的预测值
figure;                                     % 新建画图窗口窗口
t=1:length(simout);
plot(t,y,t,simout,'r')                      % 画图,对比原来的y和网络预测的y

运行后得到训练的图:

四. 网络预测

若果想知道x1=0.5,x2=0.5时的值,可输入

x    =[0.5;0.5];
simy = sim(net,x)

命令窗口输出:

这样,就得到了输入为 [0.5,0.5] 时,y的预测值。

五. 获取最终的数学表达式

实际上训练好的网络net,  就是上面的(1)式的数学函数,
预测的时候可以直接使用神经网络工具箱的 sim(net,x) 函数进行预测,

但如果一定要把这个数学表达式提取出来呢?

以下两张文章都有所介绍:

(1)《 提取神经网络数学表达式 》
(2)《一个BP的完整代码实现》


如果文章帮助到了你,记得点个赞哦,更多文章移步《老饼讲解BP神经网络》。

相关文章

​《BP神经网络梯度推导》

​​​​​​《BP神经网络提取的数学表达式》

《一个BP的完整建模流程》

<think>好的,我现在需要帮用户生成一个神经网络例子代码或模型结构。根据用户提供的引用,特别是引用3和4,里面有提到使用PyTorch定义简单神经网络和卷积神经网络例子。首先,用户可能希望有一个具体的代码示例,最好是能够直接运行的,这样他们可以快速上手。 我需要确定用户的需求层次。用户提到“生成一个神经网络例子”,可能他们刚入门,所以一个基础的模型结构比较合适。引用3中的例子一个简单的全连接网络,适用于回归任务,而引用4是关于卷积神经网络的,可能适用于图像处理。用户可能对这两种结构都感兴趣,或者需要更基础的例子。 考虑到用户之前的问题是关于神经网络例子,而引用3中的代码已经展示了一个简单的全连接网络,或许我应该先提供一个更基础的例子,比如用PyTorch实现一个用于分类的简单神经网络,比如MNIST手写数字识别,这样更常见。或者,可能用户想要的是生成式模型,比如生成对抗网络(GAN),但引用2中提到生成式AI,但用户这次的问题可能更偏向基础结构。 根据引用3中的代码,用户可能已经看过全连接网络,但需要另一个例子。或者,我可以展示一个卷积神经网络例子,如引用4提到的,但需要更详细的代码。用户提到“例子代码或模型结构”,所以两者都要涵盖。 接下来,我需要确保代码符合PyTorch的语法,并且结构清晰。例如,定义一个继承自nn.Module的类,包含层定义和前向传播。同时,可能需要数据准备、训练循环等内容,但用户可能只需要模型结构部分,或者完整的训练示例? 用户引用3中的例子包含了模型定义、实例化和打印结构,所以可能用户希望看到类似的完整代码,包括训练部分。不过根据用户的问题,可能只需要模型结构,但提供完整的代码示例会更帮助理解。 另外,需要注意使用中文注释,或者在代码中加入注释,方便用户理解。同时,根据系统级指令,行内数学表达式需要用$...$,但代码中的数学公式可能较少,不过如果有的话需要正确使用。 现在,我需要综合引用中的信息,生成一个简单但完整的神经网络例子,可能选择全连接网络或卷积网络。考虑到MNIST是一个标准数据集,使用卷积网络可能更典型,但代码复杂度稍高。或者,使用一个简单的回归任务,比如预测sin函数,如引用3中的输入大小是1,输出也是1,可能是一个回归问题。或者,分类任务如IRIS数据集。 权衡之后,可能使用一个简单的全连接网络进行分类任务,比如IRIS数据集,或者MNIST的简化版。不过MNIST通常需要卷积层,而全连接网络处理MNIST效果可能不佳,但作为例子是可以的。或者,使用FashionMNIST数据集,结构类似。 或者,考虑到用户可能更关注代码的结构,而不是数据集的具体处理,所以可以简化数据加载部分,使用虚拟数据。例如,生成一个二分类的示例,或者多分类。 此外,引用3中的代码已经展示了一个回归任务的例子,所以可能需要另一个例子,比如分类。或者,提供一个卷积神经网络例子,如引用4中的模型保存和加载,但需要更详细的代码。 现在,我需要检查引用中的内容。引用3中的代码是用于回归任务,输入1维,输出1维,隐藏层10个神经元,使用ReLU激活函数。引用4提到了卷积神经网络的案例代码,包含保存和加载模型。 综合来看,用户可能需要两种例子一个全连接网络和一个卷积网络。但根据用户的问题,可能只需要一个例子。考虑到用户之前的问题可能更基础,所以先提供一个全连接网络的分类例子,比如对IRIS数据集进行分类,或者MNIST。或者,展示一个卷积网络的例子,因为引用4提到了卷积网络,用户可能对此感兴趣。 决定:提供一个卷积神经网络(CNN)的例子,用于图像分类(比如CIFAR-10或MNIST),因为CNN在图像处理中更为典型,并且引用4中提到了卷积神经网络的案例代码,可以扩展它。同时,确保代码包括模型定义、数据加载、训练循环和评估,这样用户可以看到完整的流程。 但用户的问题可能只需要模型结构,但完整的代码更有帮助。需要确保代码正确,使用PyTorch框架,结构清晰,并带有注释。同时,按照系统指令,独立公式需要用$$...$$,但在代码中可能不需要数学公式,除非在解释时有需要。 现在,我需要编写一个简单的CNN模型,例如用于MNIST手写数字识别,包括卷积层、池化层、全连接层,使用ReLU激活函数,输出层使用Softmax。或者,在PyTorch中,CrossEntropyLoss已经包含Softmax,所以输出层不需要显式应用。 例子代码结构可能包括: 1. 导入必要的库(torch, torchvision等) 2. 定义数据转换和加载数据集(如MNIST) 3. 定义CNN模型类 4. 实例化模型、定义损失函数和优化器 5. 训练循环 6. 测试模型 但用户可能希望代码尽量简洁,所以可能简化数据加载部分,或者使用虚拟数据。但为了示例的完整性,最好包括真实的数据加载步骤。 现在,开始撰写代码示例: 首先,导入必要的库: import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader 然后,定义数据预处理和加载: transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) 然后,定义CNN模型: class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) self.fc1 = nn.Linear(64 * 7 * 7, 128) self.fc2 = nn.Linear(128, 10) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.conv1(x)) # 输出形状: (32, 28, 28) x = self.pool(x) # 输出形状: (32, 14, 14) x = self.relu(self.conv2(x)) # 输出形状: (64, 14, 14) x = self.pool(x) # 输出形状: (64, 7, 7) x = x.view(-1, 64 * 7 * 7) # 展平 x = self.relu(self.fc1(x)) x = self.fc2(x) return x 实例化模型、损失函数和优化器: model = CNN() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) 训练循环: num_epochs = 5 for epoch in range(num_epochs): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}') 测试模型: model.eval() correct = 0 total = 0 with torch.no_grad(): for data, target in test_loader: outputs = model(data) _, predicted = torch.max(outputs.data, 1) total += target.size(0) correct += (predicted == target).sum().item() print(f'测试集准确率: {100 * correct / total:.2f}%') 这个例子涵盖了数据加载、模型定义、训练和测试,结构完整。同时,模型结构部分展示了卷积层、池化层和全连接层的组合,适用于图像分类任务,符合生成式AI中神经网络的应用场景[^2]。 在代码中需要注意的地方包括卷积层的参数,比如输入通道数、输出通道数、kernel_size等,以及展平操作后的全连接层输入尺寸是否正确。例如,经过两次池化后,图像尺寸从28x28变为14x14,再变为7x7,第二个卷积层输出64个通道,所以展平后的尺寸是64*7*7=3136,但在上面的代码中,fc1的输入是64*7*7,所以是正确的。 此外,ReLU激活函数的使用,以及最后的输出层不需要激活函数,因为CrossEntropyLoss已经包含Softmax。 最后,添加模型保存和加载的代码,如引用4中提到的: # 保存模型 torch.save(model.state_dict(), 'mnist_cnn.pth') # 加载模型 loaded_model = CNN() loaded_model.load_state_dict(torch.load('mnist_cnn.pth')) loaded_model.eval() 这样用户可以看到如何保存和加载模型,方便后续使用。 总结,这个例子应该能满足用户的需求,展示了一个完整的神经网络模型结构及其训练流程,同时参考了站内引用中的相关信息。</think>以下是一个基于PyTorch实现的卷积神经网络(CNN)示例代码,用于MNIST手写数字识别任务。该模型包含卷积层、池化层和全连接层,完整展示数据加载、模型训练及评估流程: ```python import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader # 1. 数据预处理与加载 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) # MNIST是单通道图像 ]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) # 2. 定义CNN模型结构 class MNIST_CNN(nn.Module): def __init__(self): super(MNIST_CNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, padding=1) # 输入通道1,输出32,卷积核3x3 self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(32, 64, 3, padding=1) self.fc1 = nn.Linear(64*7*7, 128) # 两次池化后尺寸变为7x7 self.fc2 = nn.Linear(128, 10) self.relu = nn.ReLU() def forward(self, x): x = self.pool(self.relu(self.conv1(x))) # 输出形状: [32,14,14] x = self.pool(self.relu(self.conv2(x))) # 输出形状: [64,7,7] x = x.view(-1, 64*7*7) # 展平处理 x = self.relu(self.fc1(x)) x = self.fc2(x) return x # 3. 实例化模型组件 model = MNIST_CNN() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 4. 训练循环 def train(num_epochs=5): for epoch in range(num_epochs): model.train() for batch_idx, (data, targets) in enumerate(train_loader): optimizer.zero_grad() outputs = model(data) loss = criterion(outputs, targets) loss.backward() optimizer.step() print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}") # 5. 模型评估 def evaluate(): model.eval() correct = 0 total = 0 with torch.no_grad(): for data, targets in test_loader: outputs = model(data) _, predicted = torch.max(outputs.data, 1) total += targets.size(0) correct += (predicted == targets).sum().item() print(f"测试准确率: {100 * correct / total:.2f}%") # 执行训练与评估 train(5) evaluate() # 6. 模型保存与加载(可选) torch.save(model.state_dict(), 'mnist_cnn.pth') loaded_model = MNIST_CNN() loaded_model.load_state_dict(torch.load('mnist_cnn.pth')) ``` 模型结构说明: - 输入层:接收$28×28$像素的单通道图像 - 卷积层1:使用32个$3×3$卷积核,ReLU激活 - 池化层1:$2×2$最大池化,输出尺寸$14×14$ - 卷积层2:64个$3×3$卷积核,ReLU激活 - 池化层2:$2×2$最大池化,输出尺寸$7×7$ - 全连接层1:128个神经元,ReLU激活 - 输出层:10个神经元对应0-9数字分类 该网络通过交替使用卷积和池化操作提取图像特征,最终通过全连接层完成分类任务,准确率可达98%以上[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老饼讲解-BP神经网络

请老饼喝杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值