如何做百度收录的网站,无锡做网站费用,网店代运营合同,网站建设中存在的问题大家好#xff0c;我是微学AI#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解#xff0c;包括全连接模型的设计、数学原理介绍#xff0c;并从手写数字识别到猫狗识…大家好我是微学AI今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解包括全连接模型的设计、数学原理介绍并从手写数字识别到猫狗识别实战演练。 文章目录 一、引言二、全连接模型的设计1. 神经元模型2. 网络结构 三、全连接模型的参数计算1. 前向传播2. 反向传播 四、全连接模型实现手写数字识别1. 数据准备2. 模型构建3. 代码实现 五、阶段实战猫狗识别1. 数据准备2. 模型构建3. 代码实现 六、数学原理详解1. 激活函数2. 损失函数3. 优化算法 七、总结 一、引言
全连接神经网络Fully Connected Neural NetworkFCNN是一种经典的神经网络结构它在众多领域都有着广泛的应用。本文将详细介绍全连接神经网络的设计、参数计算及其在图像识别任务中的应用。通过本文的学习读者将掌握全连接神经网络的基本原理并能够实现手写数字识别和猫狗识别等实战项目。
二、全连接模型的设计
1. 神经元模型
全连接神经网络的基本单元是神经元其数学表达式为 f ( x ) σ ( ∑ i 1 n w i x i b ) f(x) \sigma(\sum_{i1}^{n}w_ix_i b) f(x)σ(i1∑nwixib) 其中 x x x 为输入向量 w w w 为权重向量 b b b 为偏置 σ \sigma σ 为激活函数。
2. 网络结构
全连接神经网络由输入层、隐藏层和输出层组成。每一层的神经元都与上一层的所有神经元相连如图1所示。
三、全连接模型的参数计算
1. 前向传播
假设一个全连接神经网络共有 l l l层第 k k k层的输入为 X ( k ) X^{(k)} X(k)输出为 Y ( k ) Y^{(k)} Y(k)则有 Y ( k ) σ ( W ( k ) X ( k ) b ( k ) ) Y^{(k)} \sigma(W^{(k)}X^{(k)} b^{(k)}) Y(k)σ(W(k)X(k)b(k)) 其中 W ( k ) W^{(k)} W(k) 和 b ( k ) b^{(k)} b(k) 分别为第 k k k层的权重和偏置。
2. 反向传播
全连接神经网络的参数更新通过反向传播算法实现。对于输出层损失函数为 L 1 2 ( Y t r u e − Y p r e d ) 2 L \frac{1}{2}(Y_{true} - Y_{pred})^2 L21(Ytrue−Ypred)2 其中 Y t r u e Y_{true} Ytrue 为真实标签 Y p r e d Y_{pred} Ypred 为预测值。 根据链式法则输出层的权重梯度为 ∂ L ∂ W ( l ) ∂ L ∂ Y ( l ) ⋅ ∂ Y ( l ) ∂ Z ( l ) ⋅ ∂ Z ( l ) ∂ W ( l ) \frac{\partial L}{\partial W^{(l)}} \frac{\partial L}{\partial Y^{(l)}} \cdot \frac{\partial Y^{(l)}}{\partial Z^{(l)}} \cdot \frac{\partial Z^{(l)}}{\partial W^{(l)}} ∂W(l)∂L∂Y(l)∂L⋅∂Z(l)∂Y(l)⋅∂W(l)∂Z(l) 其中 Z ( l ) W ( l ) X ( l ) b ( l ) Z^{(l)} W^{(l)}X^{(l)} b^{(l)} Z(l)W(l)X(l)b(l)。 同理可求得输出层的偏置梯度、隐藏层的权重梯度和偏置梯度。
四、全连接模型实现手写数字识别
1. 数据准备
使用MNIST数据集包含60000个训练样本和10000个测试样本。
2. 模型构建
构建一个简单的全连接神经网络包含一个输入层784个神经元、两个隐藏层128个神经元和一个输出层10个神经元。
3. 代码实现
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 定义模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.model nn.Sequential(nn.Flatten(),nn.Linear(28*28, 128),nn.ReLU(),nn.Linear(128, 128),nn.ReLU(),nn.Linear(128, 10),nn.Softmax(dim1))def forward(self, x):return self.model(x)# 加载数据
transform transforms.Compose([transforms.ToTensor()])
dataset datasets.MNIST(root./data, trainTrue, downloadTrue, transformtransform)
dataloader DataLoader(dataset, batch_size32, shuffleTrue)test_dataset datasets.MNIST(root./data, trainFalse, downloadTrue, transformtransform)
test_dataloader DataLoader(test_dataset, batch_size32, shuffleTrue)# 初始化模型和优化器
device torch.device(cuda if torch.cuda.is_available() else cpu)
model Net().to(device)
optimizer optim.Adam(model.parameters(), lr0.001)
criterion nn.CrossEntropyLoss()# 训练模型
for epoch in range(5):for i, (images, labels) in enumerate(dataloader):images, labels images.to(device), labels.to(device)optimizer.zero_grad()outputs model(images)loss criterion(outputs, labels)loss.backward()optimizer.step()# 评估模型
correct 0
total 0
with torch.no_grad():for images, labels in test_dataloader:images, labels images.to(device), labels.to(device)outputs model(images)_, predicted torch.max(outputs.data, 1)total labels.size(0)correct (predicted labels).sum().item()print(Accuracy of the network on the 10000 test images: %d %% % (100 * correct / total))五、阶段实战猫狗识别
1. 数据准备
使用猫狗数据集包含25000张猫和狗的图片。我们将猫和狗的照片放在目录’data/train’下。
2. 模型构建
构建一个全连接神经网络包含一个输入层64643个神经元、三个隐藏层256、128、64个神经元和一个输出层2个神经元。
3. 代码实现
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 定义数据预处理
data_transforms transforms.Compose([transforms.Resize((64, 64)),transforms.RandomRotation(40),transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.RandomAffine(0, translate(0.2, 0.2), scale(0.8, 1.2)),transforms.ToTensor(),
])# 加载数据
train_dataset datasets.ImageFolder(data/train, transformdata_transforms)
train_loader DataLoader(train_dataset, batch_size32, shuffleTrue)# 定义模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.model nn.Sequential(nn.Flatten(),nn.Linear(64*64*3, 256),nn.ReLU(),nn.Linear(256, 128),nn.ReLU(),nn.Linear(128, 64),nn.ReLU(),nn.Linear(64, 1),nn.Sigmoid())def forward(self, x):return self.model(x)# 初始化模型和优化器
device torch.device(cuda if torch.cuda.is_available() else cpu)
model Net().to(device)
optimizer optim.Adam(model.parameters(), lr0.001)
criterion nn.BCELoss()# 训练模型
for epoch in range(15):for i, (images, labels) in enumerate(train_loader):images, labels images.to(device), labels.float().unsqueeze(1).to(device)optimizer.zero_grad()outputs model(images)loss criterion(outputs, labels)loss.backward()optimizer.step()# 评估模型
# 假设有一个测试数据集的加载器叫做 validation_loader
correct 0
total 0
with torch.no_grad():for images, labels in validation_loader:images, labels images.to(device), labels.to(device)outputs model(images)predicted (outputs 0.5).float()total labels.size(0)correct (predicted labels).sum().item()
print(Accuracy of the network on the test images: %d %% % (100 * correct / total))六、数学原理详解
1. 激活函数
激活函数用于引入非线性因素使得神经网络能够学习和模拟复杂函数。常用的激活函数有
Sigmoid函数 σ ( x ) 1 1 e − x \sigma(x) \frac{1}{1 e^{-x}} σ(x)1e−x1ReLU函数 R e L U ( x ) max ( 0 , x ) ReLU(x) \max(0, x) ReLU(x)max(0,x)Softmax函数 s o f t m a x ( x ) i e x i ∑ j e x j softmax(x)_i \frac{e^{x_i}}{\sum_j e^{x_j}} softmax(x)i∑jexjexi
2. 损失函数
损失函数用于衡量模型预测值与真实值之间的差异。常用的损失函数有
均方误差MSE M S E ( y , y ^ ) 1 n ∑ i 1 n ( y i − y ^ i ) 2 MSE(y, \hat{y}) \frac{1}{n}\sum_{i1}^{n}(y_i - \hat{y}_i)^2 MSE(y,y^)n1∑i1n(yi−y^i)2交叉熵损失对于二分类问题 C E ( y , y ^ ) − y log ( y ^ ) − ( 1 − y ) log ( 1 − y ^ ) CE(y, \hat{y}) -y\log(\hat{y}) - (1-y)\log(1-\hat{y}) CE(y,y^)−ylog(y^)−(1−y)log(1−y^)
3. 优化算法
优化算法用于更新网络的权重和偏置以最小化损失函数。常用的优化算法有
梯度下降Gradient Descent w : w − α ∂ L ∂ w w : w - \alpha \frac{\partial L}{\partial w} w:w−α∂w∂LAdam优化器结合了动量Momentum和自适应学习率Adagrad的优点。
七、总结
本篇文章从全连接神经网络的基本原理出发介绍了全连接模型的设计、参数计算以及如何实现手写数字识别和猫狗识别。通过配套的完整可运行代码读者可以更好地理解全连接神经网络的实现过程。在实际应用中全连接神经网络虽然已被卷积神经网络CNN等更先进的网络结构所取代但其基本原理仍然是深度学习领域的重要基石。希望本文能帮助读者深入掌握全连接神经网络并为后续学习打下坚实的基础。