【问题标题】:Passing variable to nn.Conv2d arguments within a class init definition python将变量传递给类初始化定义python中的nn.Conv2d参数
【发布时间】:2020-09-26 15:17:31
【问题描述】:

所以我想在启动新对象时传递一些新变量,例如 kernel_size。假设net=Net10(5,2,4,3,1,1)。这样我就得到了这个类的一个对象,它的参数我不希望总是恒定的,因为否则我将不得不定义很多类。现在,我想在self.Conv2d 中传递kernel_size,我得到一个语法错误:positional argument follows keyword argument 有谁知道如何解决这一问题?我应该将其全部更改为函数而不是类吗?

    class Net10(nn.Module):   
    def __init__ (self, kernel_size, stride, pooling, num_classes, neurons, ActFunn, *args):
        super(Net10, self).__init__()
        self.kernel = kernel_size
        self.stride = stride
        self.pooling = pooling
        self.num_classes = num_classes
        self.neurons = neurons
        self.Actfun = ActFunn   
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel, padding=2, stride=1)                 
        self.pool = nn.MaxPool2d(pooling, pooling)
        self.fcinput= round (28 / pooling)

【问题讨论】:

标签: image-processing computer-vision pytorch conv-neural-network


【解决方案1】:

试试:

self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=self.kernel, padding=2, stride=1)

更详细地说:python 函数(例如,conv 层的__init__)可以有两个“风格”的输入参数: 位置 参数:即将输入参数与函数变量相关联根据其在参数列表中的位置
另一个“风格”是 keyword 参数:使用关键字给出的参数,例如 in_channels=1 等。

作为一项规则,python 不允许位置参数和关键字参数的随意混合。
您可以在关键字参数后跟位置参数,但是一旦开始声明关键字参数,就不能再有位置参数了。

self.conv1 = nn.Conv2d(in_channels=1,   # keyword argument
   out_channels=32,   # keyword argument
   kernel,   # positional argument (no "keyword" defining this argument)
   padding=2,  # keyword
   stride=1)   # keyword

【讨论】:

  • 我这样做了。现在我得到一个 NameError: name 'kernel' is not defined
  • @SabaDaftari 这是kernel_size=kernel
  • 没有kernel变量,只有self.kernelkernel_size,所以要么是kernel_size=self.kernel要么是kernel_size=kernel_size
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2022-07-19
  • 1970-01-01
  • 2021-01-20
  • 2020-11-09
  • 1970-01-01
相关资源
最近更新 更多