当前位置: 首页 > news >正文

Day 39

一、 图像数据的介绍

1.1 灰度图像

# 先继续之前的代码
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader , Dataset
from torchvision import datasets, transforms 
torch.manual_seed(42)transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))  
])
import matplotlib.pyplot as plttrain_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)# 随机选择一张图片,可以重复运行,每次都会随机选择
sample_idx = torch.randint(0, len(train_dataset), size=(1,)).item()
image, label = train_dataset[sample_idx]
def imshow(img):img = img * 0.3081 + 0.1307 npimg = img.numpy()plt.imshow(npimg[0], cmap='gray') plt.show()print(f"Label: {label}")
imshow(image)

1.2彩色图像

在 PyTorch 中,图像数据的形状通常遵循 (通道数, 高度, 宽度) 的格式(即 Channel First 格式),这与常见的 (高度, 宽度, 通道数)(Channel Last,如 NumPy 数组)不同。---注意顺序关系,

注意点:
1. 如果用matplotlib库来画图,需要转换下顺序,我们后续介绍
2. 模型输入通常需要 批次维度(Batch Size),形状变为 (批次大小, 通道数, 高度, 宽度)。例如,批量输入 10 张 MNIST 图像时,形状为 (10, 1, 28, 28)。
 

# 打印一张彩色图像,用cifar-10数据集
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as nptorch.manual_seed(42)
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  
])trainset = torchvision.datasets.CIFAR10(root='./data',train=True,download=True,transform=transform
)trainloader = torch.utils.data.DataLoader(trainset,batch_size=4,shuffle=True
)classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')sample_idx = torch.randint(0, len(trainset), size=(1,)).item()
image, label = trainset[sample_idx]print(f"图像形状: {image.shape}")  # 输出: torch.Size([3, 32, 32])
print(f"图像类别: {classes[label]}")def imshow(img):img = img / 2 + 0.5  npimg = img.numpy()plt.imshow(np.transpose(npimg, (1, 2, 0))) plt.axis('off')  plt.show()imshow(image)

 二、 图像相关的神经网络的定义

只提定义,不涉及训练和测试过程

transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) 
])
import matplotlib.pyplot as plttrain_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  self.layer1 = nn.Linear(784, 128)  self.relu = nn.ReLU()  self.layer2 = nn.Linear(128, 10)          def forward(self, x):x = self.flatten(x)  x = self.layer1(x)   x = self.relu(x)     x = self.layer2(x)   return xmodel = MLP()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)  from torchsummary import summary  
print("\n模型结构信息:")
summary(model, input_size=(1, 28, 28)) 

2.2彩色图像模型的定义

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宽 = 3072self.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)

2.3 模型定义与batchsize的关系

实际定义中,输入图像还存在batchsize这一维度

在 PyTorch 中,模型定义和输入尺寸的指定不依赖于 batch_size,无论设置多大的 batch_size,模型结构和输入尺寸的写法都是不变的。

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

相关文章:

  • pycharm debug的时候无法debug到指定的位置就停住不动了
  • 智能厨房系统—御控物联网IoT平台
  • 利用海外代理IP,做Twitter2026年全球趋势数据分析
  • 数据库 | 时序数据库选型
  • EXCEL中的TEXTJOIN用法(基础版),将Excel 多个单元格内容按条件合并到一个单元格
  • YOLOX 的动态标签分类(如 SimOTA)与 Anchor-free 机制解析2025.5.29
  • 变更数据捕获(CDC)与流处理引擎实现医疗数据实时同步(上)
  • 国产 BIM 软件万翼斗拱的技术突破与现实差距 —— 在创新与迭代中寻找破局之路
  • 《DeepSeek R1 新发布,AI再掀波澜》
  • Onvif协议:IPC客户端开发-IPC相机控制(c语言版)
  • 【论文精读】2024 ECCV--MGLD-VSR现实世界视频超分辨率(RealWorld VSR)
  • 进行性核上性麻痹健康护理全指南:从症状管理到生活照护
  • 广告流量监测和IP地址离线库
  • 从 “金屋藏娇” 到 自然语言处理(NLP)
  • 【第4章 图像与视频】4.2 图像的缩放
  • XMOS以全新智能音频及边缘AI技术亮相广州国际专业灯光音响展
  • vue计算属性computed的详解
  • C语言的函数调用,允许参数缺省和乱序
  • python----下载安装,配置环境
  • mkdir: cannot create directory ‘gitlab-stu’: No space left on device
  • 北京做网站多少钱/汕头网站关键词推广
  • 公司的网站的设计/免费网络推广公司
  • qq网站建设/自己制作一个网页
  • 专做视频和ppt的网站/百度地图3d实景地图
  • 备案怎么关闭网站吗/cnzz
  • 苏州建设网站电话/网站排名seo