Day 40 图像数据与显存

图像数据与结构化数据不同的是,其是高维数据,保留了图片的空间信息(通道,高度和宽度)。其中通道数表示颜色含义。

1.灰度图

灰度图是单通道图像,只有 "明暗" 没有颜色,就像黑白报纸。每个格子(像素)用一个数字表示亮度,范围是 0(纯黑)~255(纯白)。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")  # 忽略警告信息
# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
# 1. 创建一张简单的灰度图:5×5的矩阵,中间亮、四周暗
gray_img = np.array([
    [0, 0, 0, 0, 0],
    [0, 125, 150, 125, 0],
    [0, 150, 255, 150, 0],
    [0, 75, 150, 75, 0],
    [0, 0, 0, 0, 0]
])

# 2. 显示灰度图
plt.imshow(gray_img, cmap='gray')  # cmap='gray'指定用灰度显示
plt.title('5×5灰度图(中间纯白255,四周黑0)')
plt.axis('off')  # 关掉坐标轴
plt.show()

# 3. 查看灰度图的基本信息
print(f"灰度图形状:{gray_img.shape}")  # (5,5) → 5行5列
print(f"灰度图数据类型:{gray_img.dtype}")  # int64(数字类型)
print(f"单个像素值范围:{gray_img.min()} ~ {gray_img.max()}")  # 0~255

2.彩色图

彩色图,每个像素信息有三个通道组成,每个通道数值还是0~255,其颜色信息可由一个三元组(R,G,B)表示。

python 复制代码
# 1. 创建一张3×3的彩色图:中间是红色,四周是绿色
color_img = np.zeros((3, 3, 3), dtype=np.uint8)  # 先创建全黑的3×3×3矩阵
color_img[1, 1] = [255, 0, 0]  # 中间像素设为纯红(R=255,G=0,B=0)
color_img[0, :] = [0, 0, 255]  # 第一行设为纯蓝
color_img[2, :] = [0, 255, 0]  # 第三行设为纯绿
color_img[1,0] = [125,100,75]
color_img[1,2] = [75,100,125]

# 2. 显示彩色图
plt.imshow(color_img)
plt.title('3×3彩色图(中间红,四周绿)')
plt.axis('off')
plt.show()

# 3. 查看彩色图基本信息
print(f"彩色图形状:{color_img.shape}")  # (3,3,3) → 3行3列,每个像素3个值
print(f"中间像素的RGB值:{color_img[1,1]}")  # [255 0 0] → 纯红

3.图像相关的神经网络

灰度图

python 复制代码
# 先归一化,再标准化
transform = transforms.Compose([
    transforms.ToTensor(),  # 转换为张量并归一化到[0,1]
    transforms.Normalize((0.1307,), (0.3081,))  # MNIST数据集的均值和标准差,这个值很出名,所以直接使用
])
import matplotlib.pyplot as plt

# 2. 加载MNIST数据集,如果没有会自动下载
train_dataset = datasets.MNIST(
    root='./data',
    train=True,
    download=True,
    transform=transform
)

test_dataset = datasets.MNIST(
    root='./data',
    train=False,
    transform=transform
)
# 定义两层MLP神经网络
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.flatten = nn.Flatten()  # 将28x28的图像展平为784维向量
        self.layer1 = nn.Linear(784, 128)  # 第一层:784个输入,128个神经元
        self.relu = nn.ReLU()  # 激活函数
        self.layer2 = nn.Linear(128, 10)  # 第二层:128个输入,10个输出(对应10个数字类别)
        
    def forward(self, x):
        x = self.flatten(x)  # 展平图像
        x = self.layer1(x)   # 第一层线性变换
        x = self.relu(x)     # 应用ReLU激活函数
        x = self.layer2(x)   # 第二层线性变换,输出logits
        return x

# 初始化模型
model = MLP()

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)  # 将模型移至GPU(如果可用)

from torchsummary import summary  # 导入torchsummary库
print("\n模型结构信息:")
summary(model, input_size=(1, 28, 28))  # 输入尺寸为MNIST图像尺寸

彩色图

python 复制代码
class MLP(nn.Module):
    def __init__(self, input_size=3072, hidden_size=128, num_classes=10):
        super(MLP, self).__init__()
        # 展平层:将3×32×32的彩色图像转为一维向量
        # 输入尺寸计算:3通道 × 32高 × 32宽 = 3072
        self.flatten = nn.Flatten()
        
        # 全连接层
        self.fc1 = nn.Linear(input_size, hidden_size)  # 第一层
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, num_classes)  # 输出层
        
    def forward(self, x):
        x = self.flatten(x)  # 展平:[batch, 3, 32, 32] → [batch, 3072]
        x = self.fc1(x)      # 线性变换:[batch, 3072] → [batch, 128]
        x = self.relu(x)     # 激活函数
        x = self.fc2(x)      # 输出层:[batch, 128] → [batch, 10]
        return x

# 初始化模型
model = MLP()

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)  # 将模型移至GPU(如果可用)

from torchsummary import summary  # 导入torchsummary库
print("\n模型结构信息:")
summary(model, input_size=(3, 32, 32))  # CIFAR-10 彩色图像(3×32×32)
    

4.pytorch中的图像张量除了上述三个维度,还有批量大小,习惯用(N,C,H,W)表示,但模型的定

义与输入的尺寸与batchsize无关,torchsummary也无需指定batchsize参数

python 复制代码
class MLP(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten() # nn.Flatten()会将每个样本的图像展平为 784 维向量,但保留 batch 维度。
        self.layer1 = nn.Linear(784, 128)
        self.relu = nn.ReLU()
        self.layer2 = nn.Linear(128, 10)
        
    def forward(self, x):
        x = self.flatten(x)  # 输入:[batch_size, 1, 28, 28] → [batch_size, 784]
        x = self.layer1(x)   # [batch_size, 784] → [batch_size, 128]
        x = self.relu(x)
        x = self.layer2(x)   # [batch_size, 128] → [batch_size, 10]
        return x

5.显存一般被以下内容占用:

  1. 模型参数与梯度:模型的权重(Parameters)和对应的梯度(Gradients)会占用显存,尤其是深度神经网络(如 Transformer、ResNet 等),一个 1 亿参数的模型(如 BERT-base),单精度(float32)参数占用约 400MB(1e8×4Byte),加上梯度则翻倍至 800MB(每个权重参数都有其对应的梯度)。

  2. 部分优化器(如 Adam)会为每个参数存储动量(Momentum)和平方梯度(Square Gradient),进一步增加显存占用(通常为参数大小的 2-3 倍)

  3. 其他开销。

@浙大疏锦行

相关推荐
一只大侠的侠10 小时前
Python实现TTAO算法:优化神经网络中的时序预测任务
python·神经网络·算法
予枫的编程笔记10 小时前
【论文解读】DMD:解耦多模态蒸馏,开启情感识别新范式 (CVPR 2023)
人工智能·python·情感计算
百锦再10 小时前
AI视频生成模型从无到有:构建、实现与调试完全指南
人工智能·python·ai·小程序·aigc·音视频·notepad++
Learn-Python19 小时前
MongoDB-only方法
python·sql
小途软件19 小时前
用于机器人电池电量预测的Sarsa强化学习混合集成方法
java·人工智能·pytorch·python·深度学习·语言模型
扫地的小何尚20 小时前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
wanglei20070820 小时前
生产者消费者
开发语言·python
清水白石00821 小时前
《从零到进阶:Pydantic v1 与 v2 的核心差异与零成本校验实现原理》
数据库·python
昵称已被吞噬~‘(*@﹏@*)’~21 小时前
【RL+空战】学习记录03:基于JSBSim构造简易空空导弹模型,并结合python接口调用测试
开发语言·人工智能·python·学习·深度强化学习·jsbsim·空战