深度学习入门:手把手搭建简单神经网络(含代码详解+报错避坑)

一、前言

很多刚入门深度学习的同学,第一次写神经网络代码,都会遇到各种各样的问题:模型属性报错、维度不匹配、损失函数乱用、device非法、张量类型报错等。
本文将从神经网络核心原理、PyTorch模型搭建、前向传播、损失函数选择、实战代码、全网最详细报错解析全套讲解,适合零基础入门、作业实训、CSDN发文学习。
读完本文你将掌握:

  • 简单全连接神经网络的结构原理
  • PyTorch 标准模型类的搭建规范
  • Sigmoid、ReLU、Softmax 激活函数适用场景
  • 单标签分类损失函数 CrossEntropyLoss 正确用法
  • 新手90%都会踩的神经网络报错坑与解决方案

二、神经网络核心原理

1. 什么是全连接神经网络

全连接神经网络(FC层/Linear层)是深度学习最基础的网络结构:上一层的每一个神经元,和下一层所有神经元全部相连。
作用:对输入特征进行特征变换、特征提取、维度映射。

2. 网络训练核心流程

深度学习训练永远只有四步:

  1. 前向传播:输入数据 → 网络计算 → 输出预测概率
  2. 计算损失:对比预测值和真实标签的差距
  3. 反向传播:根据损失计算梯度
  4. 参数更新:优化器更新权重,降低损失

3. 激活函数作用

  • Sigmoid:将数据压缩到 0~1,适合概率映射
  • ReLU:最常用激活,解决梯度消失,加速收敛
  • Softmax:多分类专用,输出所有类别概率之和为1

三、任务场景说明

本文搭建一个3输入、2输出的单标签多分类神经网络:

  • 输入特征:3维特征
  • 隐藏层:两层全连接+激活函数
  • 输出:2个类别概率(二分类/多分类通用)
  • 任务:单标签分类(一个样本只属于一个类别)

四、完整可运行代码

import torch
import torch.nn as nn
from torchsummary import summary

搭建神经网络模型

class Model(nn.Module):
def init(self):
super().init()

三层全连接网络
    self.linear1 = nn.Linear(3, 3)
    self.linear2 = nn.Linear(3, 2)
    self.out = nn.Linear(2, 2)
前向传播
def forward(self, x):
    x = self.linear1(x)
    x = torch.sigmoid(x)

    x = self.linear2(x)
    x = torch.relu(x)

    logits = self.out(x)
多分类输出概率
    out = torch.softmax(logits, dim=-1)
    return out

if name == ‘main’:

实例化模型
model = Model()
随机构造5组3维输入数据
x = torch.randn(5, 3)
前向传播预测
out = model(x)
print(f"模型预测输出:\n{out}")
打印网络结构
summary(model, input_size=(3,), batch_size=10, device="cpu")
查看网络参数
print("\n==========网络参数详情==========")
for name, params in model.named_parameters():
    print(f"{name} : {params}")

五、代码逐行详解

1. 导入模块

  • torch:深度学习核心库
  • nn:网络层、激活函数、损失函数工具库
  • summary:打印网络结构、参数量

2. 模型类搭建规范

所有神经网络必须继承 nn.Module,固定两个函数:

  • init:定义网络层(必须加self!)
  • forward:定义数据传播逻辑

3. 网络层结构

  • nn.Linear(3,3):3输入→3输出全连接层
  • nn.Linear(3,2):3特征→2特征降维
  • nn.Linear(2,2):输出层,对应2个分类

4. 前向传播逻辑

  • 第一层 + Sigmoid 做特征压缩
  • 第二层 + ReLU 增强非线性拟合能力
  • 最后一层输出 logits,Softmax 转概率

六、关键知识点:损失函数怎么选?

1. 单标签多分类

必须用 CrossEntropyLoss
特点:

  • 输入为模型原始 logits(不要提前softmax)
  • 标签为 Long 类型类别索引(0、1、2…)
  • 内部自带 log_softmax + NLLLoss,数值更稳定

2. 多标签二分类

使用 BCEWithLogitsLoss
标签只能是 0/1,不能是类别索引。

3. 避坑重点

如果代码结尾手动写了 softmax,训练时一定要删掉,否则会双重归一化,损失不收敛!

七、新手高频报错汇总)

报错1:‘NoneType’ object has no attribute ‘linear1’
原因:拼写错误 seif 而非 self,网络层没有绑定到模型实例。
解决:所有网络层必须写 self.xxx。
报错2:Input device is not valid, please specify ‘cuda’ or ‘cpu’
原因:device=’ cpu’ 多了空格。
解决:改为 device=“cpu”。
报错3:log_softmax_lastdim_kernel_impl not implemented for ‘Long’
原因:模型输出被强行转成 long 整数类型。
解决:预测输出必须是 float,标签必须是 long。
报错4:模块导入错误
错误写法:from sympy.printing.pytorch import torch
正确写法:import torch

八、总结

  1. 基础全连接神经网络由Linear全连接层 + 激活函数 堆叠而成,是深度学习的基石。
  2. 单标签多分类固定搭配:输出logits + CrossEntropyLoss。
  3. 新手90%报错都是:self拼写错误、维度不匹配、数据类型错乱、导入错误、device空格。
  4. 网络搭建核心规范:__init__定义层,forward写传播逻辑。

更多推荐