tjdnbj 2024-03-01 11:04 采纳率: 36.8%
浏览 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条回答 默认 最新

  • 檀越@新空间 2024-03-01 11:04
    关注

    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日