pytorch函数参数传递不要直接传递模型参数,可直接传递字符串

在主函数中创建模型,其中conv_relu_res_relu_block()函数生成一个网络块,经过resblock()为结构体,将block为主体循环block_num次创建网络,输入通道输出通道数分别为input_channel和output_channel。先建立block,然后再将模型块传递到结构体,该种方法在参数传递的过程中会出现误差。因此不能直接传递block。

    block = conv_relu_res_relu_block()
    print(block)
    model = resblock(block=block, block_num=16,input_channel=3,output_channel=31)
    # print(model)
    if torch.cuda.is_available():
        model.cuda()
    model.eval()

打印结果为:


#block为内容为:
conv_relu_res_relu_block(
  (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu1): ReLU(inplace=True)
  (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (relu2): ReLU(inplace=True)
)

#最后训练结果为:
Epoch [1], Iter[8], Time:33.130220890, learning rate : 0.000199998, Train Loss: 9778.415039062 Test Loss: 0.000000000, testLoss: 0.000000000
Epoch [2], Iter[16], Time:29.219235897, learning rate : 0.000199995, Train Loss: 415.426544189 Test Loss: 0.000000000, testLoss: 0.000000000
Epoch [3], Iter[24], Time:29.250241280, learning rate : 0.000199993, Train Loss: 192.262710571 Test Loss: 0.000000000, testLoss: 0.000000000

Process finished with exit code 0

block 结构体为:

def conv3x3(in_channels, out_channels):
    return nn.Conv2d(in_channels, out_channels, kernel_size=3, 
                     stride=1, padding=1, bias=True)



class conv_relu_res_relu_block(nn.Module):
    def __init__(self):
        super(conv_relu_res_relu_block, self).__init__()
        self.conv1 = conv3x3(64, 64)
        self.relu1 = nn.ReLU(inplace=True)
        self.conv2 = conv3x3(64, 64)
        self.relu2 = nn.ReLU(inplace=True)

    def forward(self, x):
        residual = x
        out = self.conv1(x)
        out = self.relu1(out)
        out = self.conv2(out)
        out = torch.add(out,residual) 
        out = self.relu2(out)
        return out


class resblock(nn.Module):
    def __init__(self, block, block_num, input_channel, output_channel):
        super(resblock, self).__init__()
        self.in_channels = input_channel
        self.out_channels = output_channel
        self.input_conv = conv3x3(self.in_channels, out_channels=64)  
        self.conv_seq = self.make_layer(block, block_num)
        self.conv = conv3x3(64, 64)
        self.relu = nn.ReLU(inplace=True)
        self.output_conv = conv3x3(in_channels=64,  out_channels=self.out_channels)
        
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                n=m.kernel_size[0]*m.kernel_size[1]*m.out_channels
                m.weight.data.normal_(0,sqrt(2./n))# the devide  2./n  carefully  
                
    def make_layer(self,block,num_layers):
        layers = []
        for i in range(num_layers):
            layers.append(block) # 在该过程传入的是已经定义的模型
        return nn.Sequential(*layers)   
    
    def forward(self, x):
        out = self.input_conv(x)
        residual = out
        out = self.conv_seq(out)
        out = self.conv(out)
        out = torch.add(out,residual)  
        out = self.relu(out)
        out = self.output_conv(out)
        return out

我们将主函数改为:

    cudnn.benchmark = True

    block = conv_relu_res_relu_block
    print(block)
    model = resblock(block=block, block_num=16,input_channel=3,output_channel=31)
    # print(model)
    if torch.cuda.is_available():
        model.cuda()
    model.eval()

将block创建时的“()”去掉,因此传递的参数为class型,而没有真正创建好模型。同样的在定义resblock()时要用到block()。

<class 'resblock.conv_relu_res_relu_block'>


Epoch [1], Iter[8], Time:31.917398214, learning rate : 0.000199998, Train Loss: 277.220520020 Test Loss: 0.000000000, testLoss: 0.000000000
Epoch [2], Iter[16], Time:28.568632841, learning rate : 0.000199995, Train Loss: 8.912072182 Test Loss: 0.000000000, testLoss: 0.000000000
Epoch [3], Iter[24], Time:28.751415253, learning rate : 0.000199993, Train Loss: 2.755993366 Test Loss: 0.000000000, testLoss: 0.000000000

Process finished with exit code 0
### 回答1: datasets.imagefolder是在PyTorch中用于创建图像数据集的函数。它的参数如下: root:图像数据集的根目录。 transform:对图像进行的变换操作。 target_transform:对目标变量进行的变换操作。 loader:图像读取函数,默认为PIL的Image.open()函数。 is_valid_file:一个函数,用于确定文件是否为有效的图像文件。 例如,以下代码将创建一个名为"my_dataset"的图像数据集,并将其存储在名为"data"的文件夹中: ``` import torchvision.datasets as datasets my_dataset = datasets.ImageFolder(root='data', transform=None) ``` 在这个例子中,图像将以原始的形式加载,没有进行任何变换操作。 ### 回答2: datasets.imagefolder函数是在PyTorch中用于读取图像数据集的一个函数。该函数参数包括两个主要部分:数据集根目录和数据的转换。 1. 数据集根目录参数(root):这个参数是指数据集所在的文件夹的路径。在这个文件夹中,应该包含一系列的子文件夹,每个子文件夹代表一个类别,每个子文件夹中包含该类别下的所有图像。这个参数一般为一个字符串,表示数据集的根目录。 2. 数据的转换参数(transform):这个参数是用于对图像数据进行预处理和转换的。它可以是一个由torchvision.transforms模块中的各种图像变换函数组成的变换管道,也可以是自定义的图像变换函数。通过对图像数据进行预处理和转换,可以使得数据更好地适应模型的输入需求,例如缩放、裁剪、正则化等。 在使用datasets.imagefolder函数时,先通过root参数指定数据集的根目录,然后通过transform参数指定对图像数据进行的转换。函数会自动遍历数据集根目录下的所有子文件夹,并将每个子文件夹中的图像和对应的标签作为数据集的样本添加到最终返回的数据集对象中。 最后,datasets.imagefolder函数会返回一个数据集对象,可以将这个数据集对象传递给torch.utils.data.DataLoader等其他相关的函数,用于在训练过程中加载和处理图像数据。这样,我们就可以方便地使用PyTorch框架进行图像数据的读取和处理。 ### 回答3: datasets.imagefolder函数是torchvision库中用于创建图像数据集的函数。它的参数解释如下: 1. root:字符串类型,必需参数,表示数据集的根目录路径。在这个目录下,应该有一些子目录,每个子目录都包含一类图像数据。 2. transform:torchvision.transforms类型,可选参数,表示对PIL图像进行的转换操作。可以通过transforms.Compose()函数将多个转换操作组合起来。常见的转换操作有:对图像进行标准化、随机裁剪、随机水平翻转等。 3. target_transform:可调用对象(函数或类)类型,可选参数,表示对目标标签进行的转换操作。如果不指定,默认返回原始标签。常见的转换操作有:将类别标签转为独热编码、将标签映射到另一种编码等。 4. loader:函数类型,可选参数,表示用于加载图像的函数。如果不指定,默认使用PIL库中的Image.open()函数。 5. is_valid_file:可调用对象(函数或类)类型,可选参数,表示用于过滤图像文件的函数。如果不指定,则默认保留所有文件。 通过指定这些参数,可以方便地创建一个图像数据集,用于训练、验证或测试深度学习模型。该函数会自动根据目录结构,将每个子目录下的图像数据与对应的标签关联起来,并返回一个可以迭代的数据集对象。可以使用迭代器来逐批读取数据集中的图像和标签,方便地进行模型训练和评估。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值