老师让复现一篇Nature论文代码,但是跑起来后要改需求,让改数据预处理和网络部分,但我压根不会啊,咋办呢?
首先要对整个深度学习程序结构有足够的理解,以 Pytorch 为例,其程序结构主要包含数据加载和网络构建两部分且二者解耦,前者有一个Dataloader负责把数据读出来变成tensor,后者负责把这tensor算成最后的输出。
01
Dataloader部分
修改数据就要改Dataloader。如果是按照pytorch默认的写法,就是重写Dataset类,这里面也很简单,getitem是负责从硬盘读数据的函数,把他写好就行了。预处理和数据增强一般也是发生在这里的。更复杂的需求可能需要修改batch_sampler(比如实现正负样本均衡)或者collect_fn函数(比如Dataset是开源库里写好的,没法改),这需要理解一下整个pytorch dataloader的流程,搞清楚了其实也不是很复杂。
import torch
from torch.utils.data import Dataset
from torchvision import transforms
from PIL import Image
# 图像数据路径列表
image_paths = ["img1.jpg", "img2.jpg"]
# 对应标签列表
labels = [0, 1]
# 重写Dataset类
class MyDataset(Dataset):
def __init__(self, image_paths, labels):
self.image_paths = image_paths
self.labels = labels
self.transform = transforms.Compose([
transforms.Resize((224, 224)), # 简单预处理,调整图像大小
transforms.ToTensor()
])
def __len__(self):
return len(self.image_paths)
def __getitem__(self, idx):
img_path = self.image_paths[idx]
label = self.labels[idx]
img = Image.open(img_path).convert('RGB')
img = self.transform(img)
return img, label
# 创建DataLoader
dataset = MyDataset(image_paths, labels)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=2)
Dataloader改完,你可以单独试着遍历一下,看看是不是会生成想要的tensor,维度和dtype是否正确。图像的话还可以可视化一下看看预处理和数据增强对不对。
import torch
import matplotlib.pyplot as plt
# 前面已经定义好的DataLoader,假设名为dataloader
for batch_data in dataloader:
images, labels = batch_data
print(f"Images tensor shape: {images.shape}")
print(f"Images tensor dtype: {images.dtype}")
print(f"Labels tensor shape: {labels.shape}")
print(f"Labels tensor dtype: {labels.dtype}")
# 可视化图像数据
for i in range(images.size(0)):
img = images[i].permute(1, 2, 0).numpy() # 调整维度以适配可视化格式,并转为numpy数组
plt.imshow(img)
plt.title(f"Label: {labels[i].item()}")
plt.show()
02
网络部分
网络部分是完全和Dataloader解耦的,所以改网络有个debug技巧,就是用tensor.rand([B,C,H,W])丢进去debug,不需要管原本训练用的主函数。
import torch
import torch.nn as nn
# 定义一个简单的卷积神经网络
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
self.relu = nn.ReLU()
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
self.fc1 = nn.Linear(32 * 8 * 8, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.conv1(x)
x = self.relu(x)
x = self.pool(x)
x = self.conv2(x)
x = self.relu(x)
x = self.pool(x)
x = x.view(-1, 32 * 8 * 8)
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
# 设定batch_size(B)、通道数(C)、图像高度(H)、图像宽度(W)
B = 4
C = 3
H = 32
W = 32
# 利用tensor.rand生成随机张量模拟输入数据
random_input = torch.rand([B, C, H, W])
# 创建网络实例
model = SimpleCNN()
# 将随机张量输入网络进行前向传播,相当于调试网络结构是否正常运行
output = model(random_input)
print("Output shape:", output.shape)
网络的代码其实是很单纯的,一般就是卷积层,线性层,某个激活函数,某种归一化层,还有一些矩阵计算比如torch.matmul, torch.reshape这些东西堆叠成的。不过为了调参方便,开源代码不会直接复制粘贴一堆nn.Conv,而是写个make_layer之类的函数,这样网络的规模就可以通过参数设置了。但是缺点是从代码上看,网络结构不是那么直观。
想要直观的看到网络结构,你可以直接print网络,再遍历网络的named_parameters(),看看网络都有啥参数,参数的size是多少。然后再单步调试代码,查看网络类的构造函数,找一找每个层是由哪个类管的,或者是由哪个函数生成的,这些一般也会在论文里有详细说明。知道这些之后应该就清楚怎么修改网络了。
最后,一定要大胆尝试!大不了就debug[手动狗头]
如何学习AI大模型?
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
】

一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。