1.快捷键 ctrl+p

2.batch_size

batch_size 是什么?

在深度学习中,batch_size(批次大小) 指的是:

  • 一次性输入到神经网络中的样本数量

  • 训练时每次更新权重所处理的数据量

为什么要用 batch_size?

  1. 内存效率:一次性处理多个样本比处理单个样本更高效

  2. 训练稳定性:基于一批样本的平均梯度更新,比单个样本更稳定

  3. 计算效率:利用GPU并行处理多个样本

  4. 泛化能力:避免对单个样本过拟合

代码中的 batch_size

python

复制

下载

# 这里的 -1 表示自动计算
input = torch.reshape(input, (-1, 1, 5, 5))

具体计算过程:

  1. 原始元素总数:5 × 5 = 25 个元素

  2. 目标形状(-1, 1, 5, 5)

  3. 自动计算:PyTorch会自动计算 -1 的位置

    • 总元素数 = batch_size × 1 × 5 × 5 = batch_size × 25

    • 25 = batch_size × 25

    • 所以 batch_size = 1

结果:

  • 重塑后的形状(1, 1, 5, 5)

  • batch_size = 1:只有一个样本

3.神经网络最大池化

最大池化(Max Pooling) 是卷积神经网络(CNN)中常用的一种下采样(down-sampling) 操作。它的核心思想是:在特征图的局部区域内取最大值,从而降低特征图的空间尺寸。

最大池化的作用

  1. 降低计算复杂度:减少特征图尺寸,减少参数和计算量

  2. 提取主要特征:保留最显著的特征,增强特征不变性

  3. 防止过拟合:减少参数数量,提高模型泛化能力

  4. 扩大感受野:让后续层能看到更广的输入区域

4.代码step这是什么意思

这段代码中的 step 是一个用于记录当前训练或处理到第几个批次(batch)的计数器。

具体作用如下:

  1. 作为日志步数索引:在 writer.add_images("input", imgs, global_step=step) 和 writer.add_images("output", output, step) 中,step 被用作 global_step 参数,表示当前是第几个批次的数据。这样在 TensorBoard(或其他日志工具)中,你可以看到不同步数下的输入和输出图像,便于观察模型在每个训练批次的变化。

  2. 逐步递增:在每次循环中,执行 step += 1,使得每次处理一个批次后,step 的值加 1,用于下一次记录的步数。

简单来说:

  • step 从 0 开始。

  • 每处理一个批次,就记录一次输入和输出图像,并将 step 加 1。

  • 这样你可以在日志中按步数查看模型在不同训练阶段的输入输出情况。

如果你使用的是 PyTorch 的 SummaryWriter(通常配合 TensorBoard),step 就是在 TensorBoard 中横轴的步数(或时间步)。

5.交叉熵是什么

简单来说,交叉熵是衡量两个概率分布之间差异的一种方法。在机器学习和信息论中,它被广泛用作损失函数,尤其是在分类任务中(如图像识别、自然语言处理)。


1. 核心思想:从信息论到机器学习

  • 信息论角度:熵表示“惊讶程度”。一个事件发生的概率越低,当它发生时带来的“信息量”或“惊讶度”就越大。交叉熵描述的是,当你用一个错误的分布 Q 去编码 来自真实分布 P 的数据时,所需的平均信息量(即平均编码长度)。显然,如果你的估计分布 Q 和真实分布 P 完全一致,交叉熵就等于 P 自身的熵(最小编码长度)。如果 Q 和 P 不同,交叉熵就会更大。

  • 机器学习角度:我们希望模型预测的概率分布(Q)尽可能接近真实的概率分布(P)。交叉熵就是用来量化这个“接近程度”的。交叉熵越小,说明预测分布与真实分布越接近。

6.在处理图片时,为什么输出都是tensor的一系列数字

1. 核心原因:计算机只能理解数字

图片在计算机中本来就是以数字形式存储的:

  • 黑白图片:每个像素是一个0-255的数字(0=黑色,255=白色)

  • 彩色图片:每个像素是3个0-255的数字(RGB值)

  • 神经网络处理时:这些数字被转换为浮点数(如0.0-1.0)

2. 神经网络各层的输出解读

以您的 Tudui 模型为例:

python

# 输入:一张128×128的彩色图片
# 形状:[1, 3, 128, 128] = [batch_size, 通道数, 高, 宽]

# 经过第一层卷积后:
Conv2d(3, 32, 5, padding=2) → 输出形状:[1, 32, 128, 128]
# 这32个数字张量代表32个不同的"特征图"
# 每个特征图捕捉图片的不同特征(如边缘、纹理等)

# 经过池化后:
MaxPool2d(2) → 输出形状:[1, 32, 64, 64]
# 仍然是数字,但进行了下采样,保留了主要特征

# 经过全连接层后:
Linear(64, 10) → 输出形状:[1, 10]
# 这10个数字就是最终的分类结果!

3. 这些数字的实际含义

示例:CIFAR-10分类任务

假设您的模型对一张"猫"的图片进行预测:

# 模型输出(未经Softmax的"logits"):
tensor([[ 2.1, -0.5,  0.3,  1.2, -1.0,  3.5, -0.2,  0.8,  0.1,  1.5]])

# 经过Softmax转换为概率:
tensor([[0.05, 0.01, 0.03, 0.08, 0.00, 0.70, 0.02, 0.04, 0.02, 0.05]])

# 对应类别(CIFAR-10的类别顺序):
# 0: airplane, 1: car, 2: bird, 3: cat, 4: deer,
# 5: dog, 6: frog, 7: horse, 8: ship, 9: truck

# 解释:模型认为:
# - 是"狗"的概率最高(70%)
# - 是"猫"的概率次之(8%)
# - 其他类别概率很低

4. 可视化理解:从像素到特征

原始图片(像素值) → 卷积层(特征提取) → 全连接层(分类决策)
    [数字矩阵]           [特征数字矩阵]         [类别得分数字]
    
224×224×3像素           32个64×64特征图        10个类别得分
(150,528个数字)        (131,072个数字)        (10个数字)

5. 为什么不是"图片"或"文字"?

中间层输出

# 可视化第一层卷积的某个通道(特征图)
import matplotlib.pyplot as plt

# 获取第一个卷积层的输出
conv_output = model[0](input_image)  # [1, 32, 128, 128]
single_feature_map = conv_output[0, 0]  # 取第一个样本的第一个特征图

plt.imshow(single_feature_map.detach().numpy(), cmap='gray')
plt.title("卷积特征图(仍然是数字矩阵)")
plt.show()

这个特征图仍然是数字矩阵,但已经不是原始图片,而是学到的某种特征表示。

最终输出

# 获取预测结果
output = model(input_image)  # tensor([[...]])

# 转换为人类可读的形式
probabilities = torch.softmax(output, dim=1)
predicted_class = torch.argmax(probabilities, dim=1)

# 对应到类别标签
class_names = ['飞机', '汽车', '鸟', '猫', '鹿', 
               '狗', '青蛙', '马', '船', '卡车']
predicted_label = class_names[predicted_class.item()]
print(f"预测结果:{predicted_label}")

6. 完整示例:理解整个流程

import torch
from PIL import Image
import torchvision.transforms as transforms

# 1. 加载图片
img = Image.open("cat.jpg")  # 实际图片

# 2. 转换为数字张量
transform = transforms.Compose([
    transforms.Resize((128, 128)),  # 调整大小
    transforms.ToTensor(),          # 转换为数字张量 [0-1]
])
input_tensor = transform(img).unsqueeze(0)  # [1, 3, 128, 128]

print(f"输入张量形状:{input_tensor.shape}")
print(f"第一个像素的RGB值:{input_tensor[0, :, 0, 0]}")

# 3. 模型处理(仍然是数字运算)
model = Tudui()
with torch.no_grad():
    output = model(input_tensor)  # tensor([[数字1, 数字2, ..., 数字10]])

# 4. 将数字转换为人类可理解的结果
probabilities = torch.softmax(output, dim=1)
print(f"\n各类别概率:")
for i, prob in enumerate(probabilities[0]):
    print(f"  类别{i}: {prob.item():.4f}")

predicted_class = torch.argmax(probabilities, dim=1).item()
print(f"\n预测类别索引:{predicted_class}")
print(f"对应类别标签:{class_names[predicted_class]}")

7. 关键要点总结

  1. 数字是唯一语言:计算机(包括神经网络)只能处理数字

  2. 不同层,不同含义

    • 输入层:像素的原始RGB值

    • 卷积层:提取的抽象特征(边缘、纹理等)

    • 全连接层:类别得分/概率

  3. 学习过程:神经网络通过学习调整这些数字(权重参数),使得输入图片的数字能正确映射到目标类别的数字

  4. 人类可读化:我们需要额外代码将这些数字转换回图片、文字等人类可理解的形式

简单比喻

  • 神经网络就像一台复杂的数字计算器

  • 您输入图片的"数字密码"(像素值)

  • 它经过一系列计算,输出另一组"数字密码"(类别概率)

  • 您需要一个"解码本"(类别标签映射)来理解这些输出数字的含义

这就是为什么您看到的都是tensor数字——它们既是计算的起点,也是计算的结果。将这些数字解释为有意义的输出,是后续处理步骤的任务。

6.argmax

1是行,0是列

更多推荐