当前位置: 首页 > 知识库问答 >
问题:

Pytorch GRU错误运行时错误:大小不匹配,m1:[1600 x 3],m2:[50 x 20]

蓬新
2023-03-14

目前,我正在尝试为LSTM和GRU建立培训模型。LSTM工作得很好,但一旦我切换到GRU训练,就会出现错误,例如大小不匹配错误。

这是我的密码

    path = "new_z_axis"
    device = "cuda:0"
    in_size = 3
    h_size = 50
    n_layers = 3
    fc = 20
    out = 1
    batch_size = 16
    seq = 100
    epoch = 100
    learning_rate = 1e-3
    ratio = 0.8
    checkpoint = os.path.join("checkpoints","model_"+path+"_"+str(in_size)+".pth")
    
    class GRUNet(nn.Module):
        def __init__(self,in_size,h_size,n_layers,fc_out,out_size,dropout=0.5):
            super(GRUNet, self).__init__()   
            self.gru = nn.GRU(input_size=in_size,hidden_size=h_size,num_layers=n_layers,dropout=dropout,bias=False)
            self.fc = nn.Linear(in_features=h_size,out_features=fc_out,bias=False)
            self.relu = nn.ReLU(inplace=True)
            self.out = nn.Linear(in_features=fc_out,out_features=out_size,bias=False)
            self.tanh = nn.Tanh()        
        def forward(self, x, hidden):
            out, hidden = self.gru(x, hidden)
            x = self.fc(x)
            x = self.relu(x)
            x = self.out(x)
            x = self.tanh(x)
            return x, hidden
    
    class MyLstm(nn.Module):
        def __init__(self,in_size,h_size,n_layers,fc_out,out_size,dropout=0.5):
            super(MyLstm, self).__init__()
            self.lstm = nn.LSTM(input_size=in_size,hidden_size=h_size,num_layers=n_layers,dropout=dropout,bias=False)
            self.fc = nn.Linear(in_features=h_size,out_features=fc_out,bias=False)
            self.relu = nn.ReLU(inplace=True)
            self.out = nn.Linear(in_features=fc_out,out_features=out_size,bias=False)
            self.tanh = nn.Tanh()
        def forward(self,x,hidden):
            x, hidden = self.lstm(x,hidden)
    #         x = x[-1:]
            x = self.fc(x)
            x = self.relu(x)
            x = self.out(x)
            x = self.tanh(x)
            return x, hidden
    
    def train(model,train_list,val_list,path,seq,epoch,batch_size,criterion,optimizer,model_type):
        for e in range(epoch):
            train_data = load_data(train_list,batch_size)
            a_loss = 0
            a_size = 0
            model.train()
            for x,y in train_data:
                x,y = x.to(device),y.to(device)
                bs = x.size()[1]
                
    #             hidden = (hidden[0].detach(),hidden[1].detach())
    #             print(x.size(),hidden[0].size())
                if model_type == "GRU":
                    h1 = torch.zeros((n_layers,bs,h_size)).to("cuda:0")
                    hidden = h1
                    hidden = hidden.data
                else:
                    h1 = torch.zeros((n_layers,bs,h_size)).to("cuda:0")
                    h2 = torch.zeros((n_layers,bs,h_size)).to("cuda:0")
                    hidden = (h1,h2)
                    hidden = tuple([e.data for e in hidden])
                    
                model.zero_grad()
                print (len(hidden))
                pred,hidden = model(x,hidden)
                loss = criterion(pred,y)
                loss.backward()
                nn.utils.clip_grad_norm_(model.parameters(),5)
                optimizer.step()
                a_loss += loss.detach()
                a_size += bs
    #         print(e,a_loss/a_size*1e+6)
            model.eval()
            with torch.no_grad():
                val_data = load_data(val_list,batch_size)
                b_loss = 0
                b_size = 0
                for x,y in val_data:
                    x,y = x.to(device),y.to(device)
                    bs = x.size()[1]
                    if model_type == "GRU":
                        h1 = torch.zeros((n_layers,bs,h_size)).to("cuda:0")
                        hidden = h1
                        hidden = hidden.data
                    else:
                        h1 = torch.zeros((n_layers,bs,h_size)).to("cuda:0")
                        h2 = torch.zeros((n_layers,bs,h_size)).to("cuda:0")
                        hidden = (h1,h2)
                        hidden = tuple([e.data for e in hidden])
                    pred,hidden = model(x,hidden)
                    loss = criterion(pred,y)
                    b_loss += loss.detach()
                    b_size += bs
            print("epoch: {} - train_loss: {} - val_loss: {}".format(e+1,float(a_loss.item()/a_size*1e+6),b_loss.item()/b_size*1e+6))

train(modelGRU,train_list,val_list,path,seq,epoch,batch_size,criterionGRU,optimizerGRU,model_type="GRU")

这就是我犯的错误

------------------------------------------------------------------------------中的运行时错误回溯(最近一次调用上次)----

火车(模型,train_list,val_list,路径,序列,纪元,batch_size,准则,优化器,model_type)61模型。zero_grad()62打印(len(隐藏 ) ) ---

~\Anaconda3\lib\site packages\torch\nn\modules\module。调用中的py(self,*输入,**kwargs)539结果=self_慢速前进(*输入,**kwargs)540其他:--

前进档(自身,x,隐藏)11 def前进档(自身,x,隐藏):12前进档,隐藏=自身。gru(x,隐藏)---

~\Anaconda3\lib\site packages\torch\nn\modules\module。调用中的py(self,*输入,**kwargs)539结果=self_慢速前进(*输入,**kwargs)540其他:--

~\anaconda3\lib\site-包\torch\nn\模块\linear.py在前进(自我,输入)85
86 def前进(自我,输入 ): ---

~\Anaconda3\lib\site packages\torch\nn\functional。py线性(输入、重量、偏差)1370 ret=火炬。addmm(偏差、输入、权重.t())1371其他:-

运行时错误:大小不匹配,m1:[1600 x 3],m2:[50 x 20]位于C:/w/1/s/tmp_conda_3.7_104508/conda/conda bld/pytorch_1572950778684/work/aten/src\THC/generic/THCTensorMathBlas。铜:290

有什么建议吗?谢谢你们

共有1个答案

万知
2023-03-14

这可能与您没有传递nn的输出有关。GRUGRUNet转发功能中的第一个线性层:

    def forward(self, x, hidden):
        out, hidden = self.gru(x, hidden)
        x = self.fc(out)

 类似资料:
  • 当我运行codeception测试用例时,我的日志文件中出现了这个错误。如何解决这个问题? 代码: 命令: ./vendor/bin/codecept run tests/functional/AdminPhoneTestCest.php:testUpdatePhone 日志文件中的错误: [2015-06-06 05:34:02]本地的。错误:异常'照明\会话\令牌错配异常'在 /var/www

  • 问题出在行collections.sort(acoesProcessar);我得到的信息是: 绑定不匹配:类型集合的泛型方法不适用于参数()。推断的类型不是有界参数

  • 我让我的应用程序工作正常,然后处理了这个xml文件中的颜色,现在出现了这个错误,我将发布带有错误信息的xml文件代码。我该如何解决这个问题? 这是错误 E/EGL_emulation:tid 2805:eglSurfaceAttrib(1146):错误0x3009(EGL_BAD_MATCH)W/OpenGLRenler:未能在表面上设置EGL_SWAP_BEHAVIOR0x942c4ba0,错误

  • 问题内容: 我是mysql和jdbc的新手,但出现此标题错误。我整天都在搜索,找不到适合我的解决方案。 我尝试过的操作:卸载/重新安装mysql,将mysql-connector- java-5.1.25-bin.jar和ojdbc7.jar复制粘贴到与我要运行的.class文件相同的位置,然后将该程序重建在其他目录中,可能还有其他几件事。 我正在使用notepad ++进行编码,并使用Windo

  • 我正在尝试仅使用本地依赖项编译和运行java grpc客户端,但出现以下错误: 这是我的gradle文件: 程序将编译,但不运行。我已经从protos生成了我的java文件,并验证了我是否使用了正确的protoc和protoc gen grpc java与我正在使用的jar库相对应。非常感谢您的帮助。

  • 我收到一个奇怪的错误。在我初始化总数的线上。如果你有空闲时间帮我,我不明白; 第10行:Char 24:运行时错误:-inf超出了“int”(solution.cpp)类型的可表示值的范围摘要:UndefinedBehaviorSanitizer:undefined behavior prog_joined。cpp:19:24