tjdnbj 2024-02-29 11:45 采纳率: 41.2%
浏览 2
已结题

动手深度学习VGG实现询问

以下是我的代码,运行后出现RuntimeError: Given groups=1, weight of size [32, 16, 3, 3], expected input[64, 32, 56, 56] to have 16 channels, but got 32 channels instead的错误,请问是哪里的通道数设置有问题?该如何修改呢?

import time
import torch
from torch import nn,optim
import torchvision

import sys
sys.path.append("C:/Users/zyx20/Desktop/深度学习编程/pythonProject")
import d2lzh_pytorch as d2l
device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#使用vgg—block函数来实现这个基础的VGG块
def vgg_block(num_convs,in_channels,out_channels):
    blk=[]
    for i in range(num_convs):
        if i==0:
            blk.append(nn.Conv2d(in_channels,out_channels,kernel_size=3,padding=1))
        else:
            blk.append(nn.Conv2d(in_channels,out_channels,kernel_size=3,padding=1))
        blk.append(nn.ReLU())
    blk.append(nn.MaxPool2d(kernel_size=2,stride=2))
    return nn.Sequential(*blk)
#构造VGG网络
conv_arch=((1,1,64),(1,64,128),(2,128,256),(2,256,512),(2,512,512))
fc_features=512*7*7
fc_hiddens_units=4096

def vgg(conv_arch,fc_features,fc_hiddens_units=4096):
    net=nn.Sequential()
    #卷积层部分
    for i,(num_convs,in_channels,out_channels) in enumerate(conv_arch):
        #每经过一个vgg_block都使宽高减半
        net.add_module("vgg_block_"+str(i+1),vgg_block(num_convs,in_channels,out_channels))
    #全连接层部分
    net.add_module("fc",nn.Sequential(d2l.FlattenLayer(),nn.Linear(fc_features,fc_hiddens_units),nn.ReLU(),nn.Dropout(0.5),
                                      nn.Linear(fc_hiddens_units,fc_hiddens_units),
                                      nn.ReLU(),
                                      nn.Dropout(0.5),
                                      nn.Linear(fc_features,10)))
    return net
#获取数据和训练模型
ratio=8
small_conv_arch=[(1,1,64//ratio),(1,64//ratio,128//ratio),(2,128//ratio,256//ratio),(2,256//ratio,512//ratio),(2,512//ratio,512//ratio)]
net=vgg(small_conv_arch,fc_features//ratio,fc_hiddens_units//ratio)
batch_size=64
train_iter,test_iter=d2l.load_data_fashion_mnist(batch_size,resize=224)
#训练
lr,num_epochs=0.001,5
optimizer=torch.optim.Adam(net.parameters(),lr=lr)
d2l.train_ch5(net,train_iter,test_iter,num_epochs,batch_size,optimizer,device,num_epochs)

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-02-29 15:42
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据您提供的错误信息:RuntimeError: Given groups=1, weight of size [32, 16, 3, 3], expected input[64, 32, 56, 56] to have 16 channels, but got 32 channels instead,问题出现在您的卷积层参数设置上。
    具体来说,在vgg_block函数中,您在每个卷积层的定义中,将输出通道数设置为了out_channels,但是在第二个卷积层的参数中,应该将输入通道数设置为上一个卷积层的输出通道数,而不是``` in_channels

    以下是您需要修改的代码部分:
    pythonCopy code
    

    def vgg_block(num_convs, in_channels, out_channels):
    blk = []
    for i in range(num_convs):
    if i == 0:
    blk.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
    else:

    修改此处,将输入通道数设置为上一个卷积层的输出通道数

    blk.append(nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1))
    blk.append(nn.ReLU())
    blk.append(nn.MaxPool2d(kernel_size=2, stride=2))
    return nn.Sequential(*blk)

    ```
    这样修改后,每个卷积层的输入通道数都与上一层的输出通道数保持一致,避免了通道数不匹配的错误。
    请尝试修改后再次运行您的代码,应该可以成功运行了。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 已采纳回答 3月1日
  • 创建了问题 2月29日

悬赏问题

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