pytorch代码实战-关于dict的用法

文章介绍了Python字典在编程中的基础概念,特别是如何在FasterRCNN的骨干网络设置中作为配置结构,如指定ResNet类型、深度、阶段和归一化选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在Python中,dict 是一种内置的数据类型,代表字典(dictionary)。字典是一种无序的数据结构,用于存储一组键值对(key-value pairs)。每个键(key)都唯一,并且与一个值(value)相关联。这种键值对的映射关系使得字典非常适合用于存储和检索数据,因为你可以使用键来快速访问相应的值。

以下是字典的基本特性和解释:

  1. 键-值对(key-value pairs):字典由一系列键值对组成,每个键和值之间使用冒号 : 分隔,而不同的键值对之间使用逗号 , 分隔。例如:{'name': 'Alice', 'age': 30, 'city': 'New York'}

  2. 键的唯一性:字典中的键必须是唯一的,每个键只能出现一次。如果尝试使用相同的键添加一个新的值,它会覆盖已存在的键对应的值。

  3. 无序性:字典中的键值对没有固定的顺序,它们不会按照特定的顺序存储或迭代。这意味着你不能依赖字典的顺序来访问元素。

  4. 可变性:字典是可变的数据类型,可以通过添加、修改或删除键值对来改变字典的内容。

  5. 用途:字典通常用于存储关联性数据,其中每个键表示一个唯一的标识符,而对应的值表示与该标识符相关联的数据。字典适用于许多不同的应用场景,例如配置文件、数据库查询结果的存储、缓存等。

  6. 例如
    person = {
        'name': 'Alice',
        'age': 30,
        'city': 'New York'
    }
    print(person['name'])  # 输出: 'Alice'
    print(person['age'])   # 输出: 30
    
    

    在FasterRCNN的骨干网络设置中dict的用法

backbone=dict( type='ResNet', 
# 'type'键,用于指定骨干网络的类型,这里是'ResNet' 
depth=50,
#'depth':键,用于指定ResNet的深度,这里是50层。 
num_stages=4, 
# 'num_stages':键,用于指定骨干网络的阶段数量,这里是4个阶段。
out_indices=(0, 1, 2, 3), 
# 'out_indices':键,用于指定输出特征的阶段索引,这里是一个包含0、1、2和3的元组。 frozen_stages=1, 
# 'frozen_stages':键,用于指定冻结(不进行训练)的阶段数量,这里是1个阶段。 
#dict中嵌套字典的使用 
norm_cfg=dict(type='BN', requires_grad=True), 
# 这个键值对定义了一个名为norm_cfg的键,它的值是另一个字典。这个字典包含了两个键值对: type='BN': 这个键值对指定了归一化(Normalization)的类型为Batch Normalization('BN')。 requires_grad=True: 这个键值对表示要对归一化的参数进行梯度计算(requires_grad=True)。 norm_eval=True, 
# 在评估模式下使用归一化 style='pytorch', # 使用PyTorch风格的网络初始化 init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')) 
# 这个键值对定义了一个名为init_cfg的键,它的值是另一个字典。这个字典包含了两个键值对: type='Pretrained': 这个键值对指定了初始化模型的类型为预训练模型('Pretrained')。 checkpoint='torchvision://resnet50': 这个键值对指定了预训练模型的路径,具体是torchvision库中的ResNet-50模型。

### 学习 PyTorch 新手入门与实战技巧 对于新手来说,掌握 PyTorch 的基本操作以及如何将其应用于实际项目是非常重要的。以下是关于 PyTorch 基础用法实战技巧的内容。 #### 1. PyTorch 基本概念 PyTorch 是一种基于 Python 的科学计算包,广泛用于深度学习研究。它提供了强大的张量运算功能,并支持动态计算图。了解其核心组件(如 Tensor 和 Autograd)是入门的关键[^1]。 #### 2. 创建简单的神经网络并训练 下面是一个完整的代码示例,展示如何构建一个简单的全连接神经网络来解决分类问题: ```python import torch from torch import nn, optim from torchvision import datasets, transforms # 数据预处理 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False) # 定义模型结构 class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10) ) def forward(self, x): x = self.flatten(x) logits = self.linear_relu_stack(x) return logits model = NeuralNetwork() # 设置损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练过程 def train(dataloader, model, loss_fn, optimizer): size = len(dataloader.dataset) model.train() for batch, (X, y) in enumerate(dataloader): X, y = X.to('cpu'), y.to('cpu') # 如果有 GPU 支持可以改为 .to('cuda') pred = model(X) loss = loss_fn(pred, y) optimizer.zero_grad() loss.backward() optimizer.step() if batch % 100 == 0: loss_value = loss.item() current = batch * len(X) print(f"loss: {loss_value:>7f} [{current:>5d}/{size:>5d}]") # 测试过程 def test(dataloader, model, loss_fn): size = len(dataloader.dataset) num_batches = len(dataloader) model.eval() test_loss, correct = 0, 0 with torch.no_grad(): for X, y in dataloader: X, y = X.to('cpu'), y.to('cpu') # 如果有 GPU 支持可以改为 .to('cuda') pred = model(X) test_loss += loss_fn(pred, y).item() correct += (pred.argmax(1) == y).type(torch.float).sum().item() test_loss /= num_batches correct /= size print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f}") epochs = 5 for t in range(epochs): print(f"Epoch {t+1}\n-------------------------------") train(train_loader, model, criterion, optimizer) test(test_loader, model, criterion) print("Done!") # 保存模型权重 torch.save(model.state_dict(), "mnist_model.pth") # 使用 save 方法存储模型参数 ``` 上述代码展示了如何加载数据集、定义模型架构、设置损失函数和优化器,并完成模型的训练与测试流程[^3]。 #### 3. 处理更复杂的任务 当掌握了基础知识之后,可以通过实现更多复杂的功能提升技能水平,比如自定义层设计、分布式训练或多 GPU 并行加速等。此外,在实践中不断积累经验也非常重要[^2]。 #### 4. 社区资源推荐 除了官方文档外,还有许多优秀的第三方资料可以帮助加深理解,例如 GitHub 上的一些开源项目或者技术博客文章。遇到困难时也可以通过加入相关论坛寻求帮助和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值