手算神经网络

简介: 本文介绍了使用2×3×1神经网络实现房价预测的全过程。首先通过手动计算演示了单个样本的前向传播和反向传播,包括权重初始化和梯度更新。随后使用PyTorch实现了完整的神经网络模型,包含数据准备、网络结构定义、损失函数计算和优化器设置。在训练过程中记录了损失值变化,并可视化展示训练效果。最后提供了一个挖空版本的代码框架,帮助读者逐步完成神经网络的关键实现步骤,包括导入包、定义网络框架、数据准备、训练循环和结果可视化等模块。通过这个完整的项目实践,读者可以掌握神经网络从理论到实现的全流程。

 矩阵求导基础

image.gif


手动计算

问题的背景:预测一套房产的价格(一个连续数值)

输入:面积 (0.5), 房龄 (0.8)  输出:现在房子的价格

    为了把问题简单化,这里的话我们使用了2×3×1 网络结构(2 输入 → 3 隐藏 → 1 输出),保持

无偏置项的简化原则。

网络的结构如下:

前向传播

   在这个网络结构中,根据给定的房产面积和房龄,我们预测的房价是 0.260(这个值是归一化后

的结果)。

计算损失函数

现在我们有了前向传播的结果,我们可以用它来演示反向传播了。

我们假设这套房产的真实价格 (Y) 是 0.4。

我们将使用均方误差(MSE)损失函数,这在回归问题中是标准做法:

image.gif

反向传播和更新参数

image.gif


代码实现

一个样本的神经网络的实现

        在 PyTorch 和大多数现代深度学习框架中,惯例是使用 行向量(Row Vector)作为单个样本

的输入:手动计算时习惯用 X 形式 (列向量),但 PyTorch 采用 X 形式 (行向量) 来处理输

入。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
# 1. 定义网络结构 (2 -> 3 -> 1)
class SimpleNet(nn.Module):
    def __init__(self, W1_data, W2_data):
        super(SimpleNet, self).__init__()
        # 隐藏层 (Input=2, Output=3)
        self.fc1 = nn.Linear(2, 3, bias=False)  # 设置 bias=False 对应“无偏置项”
        # 输出层 (Input=3, Output=1)
        self.fc2 = nn.Linear(3, 1, bias=False)  # 设置 bias=False
        # 将我们手算的初始权重加载到网络中
        # 注意 PyTorch 的 nn.Linear 默认使用 W^T 形式,即 W 是 (out_features, in_features)
        with torch.no_grad():
            self.fc1.weight.data = W1_data  # W1 是 3x2 
            self.fc2.weight.data = W2_data  # W2 是 1x3
    def forward(self, x):
        # 隐藏层:Z1 = W1^T * X -> A1 = ReLU(Z1)
        # 注意:PyTorch 内部处理了 W^T * X,我们只需传入 W 即可
        Z1 = self.fc1(x) 
        A1 = nn.functional.relu(Z1)
        # 输出层:Z2 = W2^T * A1 -> A2 = Z2 (恒等激活)
        Z2 = self.fc2(A1)
        A2 = Z2  # A2 = Z2 for identity activation (regression)
        return Z2, A1, Z2 # 返回 Z2, A1, A2 方便检查中间值
# 2. 定义输入和参数
# 注意 PyTorch 默认是 FloatTensor,且输入需要是 [Batch_Size, Features]
# X (1x2 矩阵): [面积, 房龄]
X_tensor = torch.tensor([[0.5, 0.8]], dtype=torch.float32)
# W1 (3x2 矩阵): 对应 PyTorch 的 (out_features, in_features)
W1_init = torch.tensor([
    [0.1, 0.2],  # W1^T 的第一行 (Z1,1)
    [0.3, 0.4],  # W1^T 的第二行 (Z1,2)
    [0.5, 0.6]   # W1^T 的第三行 (Z1,3)
], dtype=torch.float32)
# W2 (1x3 矩阵): 对应 PyTorch 的 (out_features, in_features)
W2_init = torch.tensor([
    [-0.9, 0.8, 0.1]
], dtype=torch.float32)
# 真实标签 Y
Y_tensor = torch.tensor([[0.4]], dtype=torch.float32)
# 学习率
learning_rate = 0.1
# 3. 初始化模型、损失函数和优化器
model = SimpleNet(W1_init, W2_init)
# MSE Loss (PyTorch 默认是 0.5 * (A2 - Y)^2)
criterion = nn.MSELoss() 
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
print("--- 开始前向传播验证 ---")
# 清空之前的梯度
optimizer.zero_grad() 
# 4. 前向传播 (Forward Propagation)
Z2_out, A1_out, A2_pred = model(X_tensor)
# 验证中间结果
print(f"X:\n{X_tensor.numpy()}")
print(f"\nW1 (3x2):\n{model.fc1.weight.data.numpy()}")
print(f"\n隐藏层激活输出 A1 (手算: 0.21, 0.47, 0.73):\n{A1_out.detach().numpy()}")
print(f"\n最终预测 A2 (手算: 0.260):\n{A2_pred.detach().numpy()}")
# 5. 计算损失 (Loss)
loss = criterion(A2_pred, Y_tensor)
print(f"\n真实标签 Y: {Y_tensor.numpy()[0, 0]}")
print(f"损失 L (0.5 * (0.26 - 0.4)^2): {loss.item():.5f}")
# 6. 反向传播 (Backward Propagation)
loss.backward()
# 7. 检查梯度 (Verification of Gradients)
print("\n--- 反向传播梯度验证 (手动计算的梯度值) ---")
# 检查 dL/dW2 (W2 梯度)
# 手算: dL/dW2 = [-0.0294, -0.0658, -0.1022] (转置后)
dL_dW2 = model.fc2.weight.grad
print(f"dL/dW2 (W2 梯度):\n{dL_dW2.numpy()}")
# 检查 dL/dW1 (W1 梯度)
# 手算: dL/dW1 = [[0.0630, -0.0560, -0.0070], [0.1008, -0.0896, -0.0112]]
dL_dW1 = model.fc1.weight.grad
print(f"dL/dW1 (W1 梯度):\n{dL_dW1.numpy()}")
# 8. 权重更新 (Gradient Descent)
optimizer.step()
# 9. 检查更新后的权重 (Verification of New Weights)
print("\n--- 权重更新验证 ---")
# W2_new = W2 - alpha * dL/dW2
W2_new = model.fc2.weight.data
# 手算 W2_new: [-0.8971, 0.8066, 0.1102]
print(f"W2 新权重:\n{W2_new.numpy()}")
# W1_new = W1 - alpha * dL/dW1
W1_new = model.fc1.weight.data
# 手算 W1_new: [[0.0937, 0.3056, 0.5007], [0.1899, 0.4090, 0.6011]]
print(f"W1 新权重:\n{W1_new.numpy()}")

image.gif

image.gif

逐行解析

image.gif

初始化

image.gif

计算第一层

image.gif

计算第二层和损失函数

多个样本的神经网络的实现

   现在我们将会使用的 2×3×1 回归网络来构造一个小型数据集,并定义一个简单的训练循环,展

示网络如何通过多轮迭代(Epochs)来不断学习和减少误差。

们构造四个数据点,代表四种不同房产的面积、房龄和实际价格(均已归一化到 0 到 1 之间)。

编号 面积 (X1) 房龄 (X2) 实际价格 (Y) 描述
D1 0.5 0.8 0.40 (我们刚才手算的数据)
D2 0.9 0.2 0.85 新房,面积大,价格高
D3 0.2 0.9 0.15 旧房,面积小,价格低
D4 0.6 0.4 0.50 中等房,价格中等
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
# --- 1. 定义网络模型 ---
class SimpleNet(nn.Module):
    def __init__(self, W1_data, W2_data):
        super(SimpleNet, self).__init__()
        # 隐藏层 (Input=2, Output=3), 无偏置项
        self.fc1 = nn.Linear(2, 3, bias=False) 
        # 输出层 (Input=3, Output=1), 无偏置项
        self.fc2 = nn.Linear(3, 1, bias=False)
        # 加载手动计算的初始权重
        with torch.no_grad():
            # fc1.weight 维度是 (out_features, in_features) 即 (3, 2)
            self.fc1.weight.data = W1_data  
            # fc2.weight 维度是 (out_features, in_features) 即 (1, 3)
            self.fc2.weight.data = W2_data  
    def forward(self, x):
        # 隐藏层:ReLU 激活
        Z1 = self.fc1(x) 
        A1 = nn.functional.relu(Z1)
        # 输出层:恒等激活 (回归)
        A2 = self.fc2(A1)
        return A2
# --- 2. 数据集与初始参数 ---
# 输入特征 X (4x2 矩阵: 4个样本, 2个特征 [面积, 房龄])
X_data = torch.tensor([
    [0.5, 0.8], # D1 (手算起始点)
    [0.9, 0.2], # D2
    [0.2, 0.9], # D3
    [0.6, 0.4]  # D4
], dtype=torch.float32)
# 真实标签 Y (4x1 矩阵: 实际价格)
Y_data = torch.tensor([
    [0.40],
    [0.85],
    [0.15],
    [0.50]
], dtype=torch.float32)
# 初始权重 (与手算时使用的 W1^T 和 W2^T 维度保持一致)
W1_init = torch.tensor([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], dtype=torch.float32)
W2_init = torch.tensor([[-0.9, 0.8, 0.1]], dtype=torch.float32)
learning_rate = 0.1
EPOCHS = 50 
# --- 3. 初始化模型、损失函数和优化器 ---
model = SimpleNet(W1_init, W2_init)
criterion = nn.MSELoss() 
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# --- 4. 训练循环 ---
print("--- 神经网络开始学习 (50 轮训练) ---")
print(f"初始损失: {criterion(model(X_data), Y_data).item():.6f}")
for epoch in range(EPOCHS):
    # 零化梯度
    optimizer.zero_grad() 
    # 前向传播
    predictions = model(X_data)
    # 计算损失
    loss = criterion(predictions, Y_data)
    # 反向传播
    loss.backward()
    # 权重更新 (梯度下降)
    optimizer.step()
    if (epoch + 1) % 10 == 0:
        print(f"Epoch {epoch + 1:2d}/{EPOCHS} | Loss: {loss.item():.6f}")
print("--- 训练结束,网络已学习 ---")
# --- 5. 最终结果展示 ---
final_predictions = model(X_data)
print("\n--- 最终预测与权重对比 ---")
print("样本数据 (面积/房龄):", X_data.numpy().round(2).T)
print("实际价格 Y:           ", Y_data.squeeze().numpy().round(4))
print("最终预测 A2:        ", final_predictions.squeeze().detach().numpy().round(4))
print("\n最终 W1 (2x3) 权重:\n", model.fc1.weight.data.numpy().round(4))
print("\n最终 W2 (1x3) 权重:\n", model.fc2.weight.data.numpy().round(4))

image.gif

image.gif

初始化

第一层的计算

image.gif

第二层的计算

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt # 导入绘图库
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
# --- 1. 定义网络模型 ---
class SimpleNet(nn.Module):
    def __init__(self, W1_data, W2_data):
        super(SimpleNet, self).__init__()
        self.fc1 = nn.Linear(2, 3, bias=False)
        self.fc2 = nn.Linear(3, 1, bias=False)
        with torch.no_grad():
            self.fc1.weight.data = W1_data
            self.fc2.weight.data = W2_data
    def forward(self, x):
        Z1 = self.fc1(x)
        A1 = nn.functional.relu(Z1)
        A2 = self.fc2(A1)
        return A2
# --- 2. 数据集与初始参数 ---
X_data = torch.tensor([
    [0.5, 0.8], [0.9, 0.2], [0.2, 0.9], [0.6, 0.4] 
], dtype=torch.float32)
Y_data = torch.tensor([
    [0.40], [0.85], [0.15], [0.50]
], dtype=torch.float32)
W1_init = torch.tensor([[0.1, 0.2], [0.3, 0.4], [0.5, 0.6]], dtype=torch.float32)
W2_init = torch.tensor([[-0.9, 0.8, 0.1]], dtype=torch.float32)
learning_rate = 0.1
EPOCHS = 50 
# --- 3. 初始化模型、损失函数和优化器 ---
model = SimpleNet(W1_init, W2_init)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 新增:用于存储每一步的损失值
loss_history = []
# --- 4. 训练循环 ---
print("--- 神经网络开始学习 ---")
initial_loss = criterion(model(X_data), Y_data).item()
print(f"初始损失: {initial_loss:.6f}")
loss_history.append(initial_loss)
for epoch in range(EPOCHS):
    optimizer.zero_grad()
    predictions = model(X_data)
    loss = criterion(predictions, Y_data)
    
    # 记录当前损失
    loss_history.append(loss.item())
    
    loss.backward()
    optimizer.step()
    
    if (epoch + 1) % 10 == 0:
        print(f"Epoch {epoch + 1:2d}/{EPOCHS} | Loss: {loss.item():.6f}")
print("--- 训练结束 ---")
# --- 5. 损失曲线可视化 ---
plt.figure(figsize=(10, 6))
# 注意:我们记录了 1个初始损失 + 50个训练损失,共 51 个点
plt.plot(range(len(loss_history)), loss_history, label='Training Loss', marker='o', markersize=4, linestyle='-')
plt.title('Loss Curve during Training (MSE)')
plt.xlabel('Epoch (0 is Initial Loss)')
plt.ylabel('Mean Squared Error (MSE)')
plt.grid(True)
plt.legend()
plt.show()
# --- 6. 最终结果展示 (略) ---
final_predictions = model(X_data)
print("\n--- 最终预测与权重对比 ---")
print("实际价格 Y: ", Y_data.squeeze().numpy().round(4))
print("最终预测 A2: ", final_predictions.squeeze().detach().numpy().round(4))

image.gif


挖空版本

   由于AI的出现,详细很多的小伙伴和我一样已经很久没有自己写过代码,或者是项目了,但是我

个人还是觉得,写代码是计算机专业的基本的内容,下面的内容的目的是为了辅助你自己写一个完

整的多个项目神经网络的实现。我会把上面的项目分解成的四个模块的挖空版本,重点突出需要你

自己动手完成的关键步骤和数值。

一般简单任务的框架:

image.gif 编辑

第一个任务:导入我们所需要的包

import (基础张量运算)
import (神经网络模块)
import (优化器)
imoirt (可视化模块)

image.gif

第二个任务:定义网络框架

image.gif

# --- 1. 定义网络模型 (无需修改) ---
class SimpleNet(nn.Module):
    def __init__(self, W1_data, W2_data):
        super(SimpleNet, self).__init__()
        # 隐藏层:2输入, 3输出, 无偏置
        self.fc1 = 
        # 输出层:3输入, 1输出, 无偏置
        self.fc2 = 
        with torch.no_grad():
            self.fc1.weight.data = W1_data
            self.fc2.weight.data = W2_data
    def forward(self, x):
        Z1 = 
        A1 = # ReLU 激活
        A2 =  # 恒等激活 (Z2)
        return A2

image.gif

第3个任务:数据准备与初始化 (Data & Initialization)

这部分定义了训练数据、初始权重和超参数。

# 真实标签 Y (4x1 矩阵)
Y_data = torch.tensor([
    [0.40], 
    [0.85], 
    [0.15], 
    [0.50]
], dtype=torch.float32)
# W1 (3x2): 初始化权重矩阵 W1
W1_init = torch.tensor([
    [0.1, 0.2], 
    [0.3, 0.4], 
    [____, ____] # 请补齐 (0.5, 0.6)
], dtype=torch.float32)
# W2 (1x3): 初始化权重矩阵 W2
W2_init = torch.tensor([[-0.9, 0.8, 0.1]], dtype=torch.float32)
# 超参数
learning_rate =   #把学习率设置成0.1
EPOCHS =           #把迭代次数设置成50次
# --- 3. 初始化模型、损失函数和优化器 (请填充) ---
model =   #初始化模型
criterion = nn.____() # 请选择损失函数 (MSE)
optimizer = optim.____(model.parameters(), lr=learning_rate) # 请选择优化器 (SGD)
# 用于存储每一步的损失值
loss_history = []

image.gif

第4个任务:核心训练循环 (Training Loop)

这部分是反向传播和梯度下降逻辑实现的地方。

# --- 4. 训练循环 (请填充反向传播和更新的核心步骤) ---
print("--- 神经网络开始学习 ---")
initial_loss = criterion(model(X_data), Y_data).item()
print(f"初始损失: {initial_loss:.6f}")
loss_history.append(initial_loss)
for epoch in range(EPOCHS):
    # 步骤 1: 零化梯度
    optimizer.____() 
    
    # 步骤 2: 前向传播
    predictions = model(X_data)
    
    # 步骤 3: 计算损失
    loss = criterion(predictions, Y_data)
    
    # 步骤 4: 反向传播
    loss.____()
    
    # 步骤 5: 权重更新 (梯度下降)
    optimizer.____() 
    
    # 记录损失值
    loss_history.append(loss.item())
    
    if (epoch + 1) % 10 == 0:
        print(f"Epoch {epoch + 1:2d}/{EPOCHS} | Loss: {loss.item():.6f}")
print("--- 训练结束 ---")

image.gif

第5个任务:可视化与结果展示 (Visualization & Results)

这部分用于验证训练效果。

# --- 5. 损失曲线可视化 (请补齐绘图指令) ---
plt.figure(figsize=(10, 6))
plt.plot(range(len(loss_history)), loss_history, label='Training Loss', marker='o', markersize=4, linestyle='-')
plt.title('Loss Curve during Training (MSE)')
plt.xlabel('Epoch (0 is Initial Loss)')
plt.ylabel('____') # 请补齐 Y 轴标签
plt.grid(True)
plt.legend()
plt.____() # 请补齐显示图表的指令
# --- 6. 最终结果展示 (请补齐用于提取数值的关键方法) ---
final_predictions = model(X_data)
print("\n--- 最终预测与权重对比 ---")
# 提取最终预测的数值并格式化
print("最终预测 A2: ", final_predictions.squeeze().____().numpy().round(4))
print("\n最终 W1 (3x2) 权重:\n", model.fc1.weight.data.numpy().round(4))
print("\n最终 W2 (1x3) 权重:\n", model.fc2.weight.data.numpy().round(4))

image.gif


目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能 算法
图解人工智能的数学基础(高数)
本文系统讲解微积分核心概念:数列与递推、极限(含无穷小/大)、导数(含中值定理、泰勒公式)、积分(不定/定/变上限/反常)及微分方程,并延伸至多元函数、偏导数、链式法则与二重积分,结合Sigmoid函数、药物衰减等实例及SymPy代码演示,突出其在AI与工程中的应用基础。
465 5
|
5月前
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch深度学习实战 |手动计算 Transformer和完整的代码实现
本文介绍了基于PyTorch实现Transformer模型的完整过程。主要内容包括:1)Transformer架构的核心组件实现,如多头注意力机制、位置前馈网络、位置编码等;2)模型构建步骤,包括词嵌入层、编码器/解码器块和输出层的实现;3)完整的训练流程,包含数据处理、损失计算和参数优化;4)评估方法验证模型性能。文章通过代码示例详细展示了如何从零开始构建Transformer,并应用于机器翻译任务,同时对模型各层的输入输出维度进行了说明。该实现可作为深度学习实践者学习Transformer架构的实用指南
414 0
|
5月前
|
机器学习/深度学习 PyTorch 测试技术
PyTorch深度学习实战 |多头注意力机制
摘要:本文详细介绍了Transformer中的多头自注意力机制,从整体结构到实现细节,包括四部分内容:(1)多头自注意力的基本架构;(2)内部计算流程解析;(3)注意力计算公式详解;(4)代码实现。重点阐述了多头并行的计算方式、缩放点积注意力的计算步骤(QK转置、缩放、softmax和加权求和),以及残差连接和层归一化的作用。通过"Are you OK?"示例展示了输入张量如何经过8个64维注意力头处理后拼接成512维输出。文章最后提供了完整的PyTorch实现代码,并附测试用例验证模型
357 0
|
5月前
|
机器学习/深度学习 编解码 算法
PyTorch深度学习实战 |手算​​U-net
本文详细解析了U-Net网络架构及其在医学图像分割中的应用。重点对比了U-Net与FCN的核心区别:U-Net采用特征拼接(Concat)保留所有层级信息,而FCN使用特征相加(Add)进行融合。文章深入剖析了U-Net的编码器-瓶颈-解码器结构,解释了其独特的裁剪拼接机制和Overlap-tile策略,并提供了完整的PyTorch实现代码。现代U-Net通过SamePadding实现了输入输出尺寸一致,显著提升了分割精度。文章还探讨了弹性形变数据增强和带空间权重的损失函数设计,为医学图像分析提供了实用解决
434 2
|
5月前
|
机器学习/深度学习 数据挖掘 PyTorch
PyTorch深度学习实战 |手算​​FCN全卷积神经网络
本文介绍了FCN-8s语义分割网络的实现细节。首先解释了语义分割的概念及其与图像分类的区别,重点分析了FCN网络结构中的全卷积化、上采样和跳跃连接三个关键技术。全卷积化将传统CNN的全连接层改为卷积层,实现像素级分类;上采样通过双线性插值恢复特征图尺寸;跳跃连接则融合高低层特征以提升细节表现。文章详细推导了损失函数的计算过程,并提供了完整的PyTorch实现代码,包括双线性插值权重初始化、VGG16骨干网络和FCN-8s主体结构。最后通过测试验证了模型能正确输出与输入尺寸匹配的预测结果。
463 3
|
5月前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch深度学习实战 | 基于LSTM的时间序列预测任务
本文介绍了使用LSTM模型预测印度德里市平均温度的两个项目。项目1对温度数据进行归一化处理,采用滑动窗口法构建监督学习样本,设计5层LSTM网络结构,并详细说明了模型训练过程及评估方法。项目2在数据处理上增加了标准化和周期性特征,改进了网络架构,引入了学习率调整和早停机制优化训练过程。两个项目均通过可视化对比预测值和真实值,验证了LSTM模型在时间序列预测中的有效性。文章从数据处理、模型构建到训练优化,完整呈现了温度预测的实现流程,为时序预测任务提供了实用参考。
340 0
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch深度学习实战 |层归一化层和FeedForward
本文介绍了PyTorch深度学习中Add&Norm层和FeedForward层的实现原理。Add&Norm层由残差连接(Add)和层归一化(Norm)组成,能加速模型收敛并稳定训练。层归一化会对神经网络每层的输出进行归一化处理,文中详细展示了其计算方法和PyTorch实现代码。FeedForward层是一个两层的全连接网络,通过线性变换提取更深层次特征。文章还分析了Transformer模型中使用层归一化的原因,并提供了完整的代码实现,包括参数初始化和前向传播过程。
261 0
|
5月前
|
人工智能 知识图谱
图解人工智能的数学基础(概率论)
本内容系统讲解概率论与数理统计核心知识:从随机事件、古典/几何概型、条件概率、贝叶斯公式,到一维随机变量及其分布(离散型/连续型)、数字特征(期望、方差、协方差、相关系数),再到大数定律、中心极限定理及卡方/t/F分布,最后涵盖最大似然估计方法。理论结合水果店、掷骰子等生活实例,图文并茂,深入浅出。
477 2
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
图解人工智能的数学基础(最优化)
本文深入解析人工智能中最优化问题的核心:通过最小化损失函数来训练模型。涵盖回归(MSE)与分类(交叉熵)任务的典型损失函数,详解梯度下降原理及BGD、SGD、Mini-batch等算法差异,并介绍Momentum、Adam等现代优化技巧,辅以PyTorch代码实现。
222 0
|
5月前
|
机器学习/深度学习 PyTorch BI
PyTorch深度学习实战 |损失函数
本文介绍了PyTorch深度学习中四种核心损失函数及其应用场景。交叉熵损失(CrossEntropyLoss)适用于多分类任务,二进制交叉熵损失(BCELoss)专用于二分类问题,KL散度损失(KLDivLoss)用于衡量概率分布差异(如VAE模型),均方误差(MSELoss)则是回归任务的基础损失函数。通过具体代码示例(如图像分类、广告点击预测、房价预测等),文章展示了每种损失函数的PyTorch实现方式,并比较了不同损失函数的适用场景和计算特点,帮助读者根据任务需求选择合适的损失函数。
332 0