tjdnbj 2024-03-01 11:04 采纳率: 41.2%
浏览 3

动手深度学习NIN提问

以下是我的代码,运行后出现Boolean value of Tensor with more than one value is ambiguous的错误,请问该如何修改呢?

import time
import torch
from torch import nn,optim

import sys
sys.path.append("C:/Users/zyx20/Desktop/深度学习编程/pythonProject")
import d2lzh_pytorch as d2l
#定义NIN块
def nin_block(in_channels,out_channels,kernel_size,stride,padding):
    blk=nn.Sequential(nn.Conv2d(in_channels,out_channels,kernel_size,stride,padding),
                      nn.ReLU(),
                      nn.Conv2d(out_channels,out_channels,kernel_size=1),
                      nn.ReLU(),
                      nn.Conv2d(out_channels,out_channels,kernel_size=1),
                      nn.ReLU())
    return blk

class GlobalAvgPool2d(nn.Module):
    def __init__(self):
        super(GlobalAvgPool2d,self).__init__()
    def forward(self,x):
        return torch.nn.functional.avg_pool2d(x,kernel_size=x.size()[2:])

net=nn.Sequential(
    nin_block(1,96,kernel_size=11,stride=4,padding=0),
    nn.MaxPool2d(kernel_size=3,stride=2),
    nin_block(96,256,kernel_size=5,stride=1,padding=2),
    nn.MaxPool2d(kernel_size=3,stride=2),
    nin_block(256,384,kernel_size=3,stride=1,padding=1),
    nn.MaxPool2d(kernel_size=3,stride=2),
    nn.Dropout(0.5),
    nin_block(384,10,kernel_size=3,stride=1,padding=1),
    GlobalAvgPool2d(),
    d2l.FlattenLayer())
#训练模型
batch_size=128
train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size,resize=224)
#训练
lr,num_epochs=0.002,5
optimizer=torch.optim.Adam(net.parameters(),lr=lr)
d2l.train_ch5(net,train_iter,test_iter,num_epochs,batch_size,optimizer,num_epochs)

  • 写回答

2条回答 默认 最新

  • 关注

    tjdnbj 上午好☀️☀️☀️️
    本答案参考通义千问

    该错误提示Boolean value of Tensor with more than one value is ambiguous是因为你在某些操作中尝试将一个包含多个值(如张量)转换为布尔值,但布尔值只能表示真或假。在你的代码中,可能是nn.functional.avg_pool2d(x, kernel_size=x.size()[2:])这行有问题,因为kernel_size参数可能是一个形状为(H, W)的张量。

    为了解决这个问题,你需要确保kernel_size是一个标量,而不是一个张量。你可以通过kernel_size=int(kernel_size)来实现。下面是修改后的代码:

    class GlobalAvgPool2d(nn.Module):
        def __init__(self):
            super(GlobalAvgPool2d, self).__init__()
        def forward(self, x):
            kernel_size = int(x.size()[2:])
            return torch.nn.functional.avg_pool2d(x, kernel_size=kernel_size)
    
    # 在定义GlobalAvgPool2d时,对kernel_size进行处理
    net = nn.Sequential(
        # 其他代码保持不变
        GlobalAvgPool2d()
        # ...其他层...
    )
    

    这样,kernel_size就会被正确地转换为一个整数,避免了布尔值的混淆。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月1日

悬赏问题

  • ¥15 通过AT指令控制esp8266发送信息
  • ¥15 有哪些AI工具提供可以通过代码上传EXCEL文件的API接口,并反馈分析结果
  • ¥15 二维装箱算法、矩形排列算法(相关搜索:二维装箱)
  • ¥20 nrf2401上电之后执行特定任务概率性一直处于最大重发状态
  • ¥15 二分图中俩集合中节点数与连边概率的关系
  • ¥20 wordpress如何限制ip访问频率
  • ¥15 自研小游戏,需要后台服务器存储用户数据关卡配置等数据
  • ¥15 请求解答odoo17外发加工某工序的实操方法
  • ¥20 IDEA ssm项目 跳转页面报错500
  • ¥20 系统直接进入应急模式了,请教一下,人要裂开了