问题描述
我用烧瓶写了一个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 (将#修改为@)