Python内存泄漏调试

问题描述

我用烧瓶写了一个api。 此api运行ocr引擎,该引擎接收图像,检测图像中的字符并发送结果。 但是,每次调用api时,虚拟内存使用量都会增加,并且稍后会出现错误。 我通过评论确认了范围,但我不知道出了什么问题。 请帮我。 以下代码中发生内存泄漏。

import torch.nn as nn


class BidirectionalLSTM(nn.Module):
    
    def __init__(self,nIn,nHidden,nOut):
        super(BidirectionalLSTM,self).__init__()
        self.rnn = nn.LSTM(nIn,bidirectional=True)
        self.embedding = nn.Linear(nHidden * 2,nOut)
    
    def forward(self,input):
        recurrent,_ = self.rnn(input)
        T,b,h = recurrent.size()
        t_rec = recurrent.view(T * b,h)
        output = self.embedding(t_rec)  # [T * b,nOut]
        output = output.view(T,-1)
        return output


class CRnn(nn.Module):
    
    def __init__(self,imgH,nc,nclass,nh,n_rnn=2,leakyRelu=False,lstmFlag=True):
        """
        是否加入lstm特征层
        """
        super(CRnn,self).__init__()
        assert imgH % 16 == 0,'imgH has to be a multiple of 16'
        
        ks = [3,3,2]
        ps = [1,1,0]
        ss = [1,1]
        nm = [64,128,256,512,512]
        self.lstmFlag = lstmFlag
        
        cnn = nn.Sequential()
        
        def convRelu(i,batchnormalization=False):
            nIn = nc if i == 0 else nm[i - 1]
            nOut = nm[i]
            cnn.add_module('conv{0}'.format(i),nn.Conv2d(nIn,nOut,ks[i],ss[i],ps[i]))
            if batchnormalization:
                cnn.add_module('batchnorm{0}'.format(i),nn.Batchnorm2d(nOut))
            if leakyRelu:
                cnn.add_module('relu{0}'.format(i),nn.LeakyReLU(0.2,inplace=True))
            else:
                cnn.add_module('relu{0}'.format(i),nn.ReLU(True))
        
        convRelu(0)
        cnn.add_module('pooling{0}'.format(0),nn.MaxPool2d(2,2))  # 64x16x64
        convRelu(1)
        cnn.add_module('pooling{0}'.format(1),2))  # 128x8x32
        convRelu(2,True)
        convRelu(3)
        cnn.add_module('pooling{0}'.format(2),nn.MaxPool2d((2,2),(2,1),(0,1)))  # 256x4x16
        convRelu(4,True)
        convRelu(5)
        cnn.add_module('pooling{0}'.format(3),1)))  # 512x2x16
        convRelu(6,True)  # 512x1x16
        
        self.cnn = cnn
        if self.lstmFlag:
            self.rnn = nn.Sequential(
                BidirectionalLSTM(512,nh),BidirectionalLSTM(nh,nclass))
        else:
            self.linear = nn.Linear(nh * 2,nclass)
    
    def forward(self,input):
        # conv features
        conv = self.cnn(input)
        b,c,h,w = conv.size()
        
        assert h == 1,"the height of conv must be 1"
        conv = conv.squeeze(2)
        conv = conv.permute(2,1)  # [w,c]
        if self.lstmFlag:
            # rnn features
            output = self.rnn(conv)
        else:
            T,h = conv.size()
            
            t_rec = conv.contiguous().view(T * b,h)
            
            output = self.linear(t_rec)  # [T * b,nOut]
            output = output.view(T,-1)
        
        return output

我该如何解决。 谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)