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

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.显存一般被以下内容占用:
-
模型参数与梯度:模型的权重(Parameters)和对应的梯度(Gradients)会占用显存,尤其是深度神经网络(如 Transformer、ResNet 等),一个 1 亿参数的模型(如 BERT-base),单精度(float32)参数占用约 400MB(1e8×4Byte),加上梯度则翻倍至 800MB(每个权重参数都有其对应的梯度)。
-
部分优化器(如 Adam)会为每个参数存储动量(Momentum)和平方梯度(Square Gradient),进一步增加显存占用(通常为参数大小的 2-3 倍)
-
其他开销。