Python копирование массива приводит к перераспределению памяти - PullRequest
1 голос
/ 22 февраля 2020
def Scramble_acton(net, ort, inputs, dpinda, hocmat):

   # copies net in ort
   for lr in range(0,6):
      for bi in range(0,BATCHSIZE):
         for no in range(0,int(lrsize[lr][0])):
            if lrsize[lr][1] == 1:
               ort.nx[lr][bi][no] = net.nx[lr][bi][no]
            if lrsize[lr][1] != 1:
               for xi in range(0,int(lrsize[lr][1])):
                  for yi in range(0,int(lrsize[lr][1])):
                     ort.nx[lr][bi][no][xi][yi] = \
                     net.nx[lr][bi][no][xi][yi]

Привет, ребята, я передаю этой функции две модели нейронной сети pytorch (net и ort), затем копирую все выходные значения из одного (net) в другое (ort). При этом увеличивается выделение памяти (чего я не ожидал) и после некоторого цикла происходит сбой программы. Я пытался использовать copy.deepcopy для создания копии, но я получил сообщение «Только Tensors, созданные явно пользователем (графические листья), поддерживают протокол deepcopy». Спасибо, Алекс

Это определение модели:

class Net(nn.Module):

   def __init__(self, x):

      super(Net, self).__init__()
      self.pool =  nn.MaxPool2d (2,2)
      self.conv1 = nn.Conv2d ( 3,10,5)
      self.conv2 = nn.Conv2d (10,16,5)
      self.fc3 =   nn.Linear (16*5*5,120)
      self.fc4 =   nn.Linear (120,84)
      self.fc5 =   nn.Linear (84,10)

      lrsize[0][0] =  3;      lrsize[0][1] =32
      lrsize[1][0] = 10;      lrsize[1][1] =14
      lrsize[2][0] = 16*5*5;  lrsize[2][1] = 1
      lrsize[3][0] = 120;     lrsize[3][1] = 1
      lrsize[4][0] =  84;     lrsize[4][1] = 1
      lrsize[5][0] =  10;     lrsize[5][1] = 1

      self.nx = np.empty(6, dtype=np.object)
      self.nl = np.empty(6, dtype=np.object)
      self.nl[1] = self.conv1
      self.nl[2] = self.conv2
      self.nl[3] = self.fc3
      self.nl[4] = self.fc4
      self.nl[5] = self.fc5
      self.forward(x,0,0)

   def forward(self, x0, opt, sitnx):

      #Tanhact # torch.sigmoid
      xx = self.nx; xx[0] = x0
      if opt == 1: xx = sitnx
      self.nx[1] = self.pool(Tanhact(self.conv1(xx[0])))
      self.nx[2] = self.pool(Tanhact(self.conv2(xx[1])))
      self.nx[2] = self.nx[2].view(-1, 16*5*5)
      xt = self.fc3(xx[2]); self.nx[3] = Tanhact(SLOPETP*xt)
      xt = self.fc4(xx[3]); self.nx[4] = Tanhact(SLOPETP*xt)
      xt = self.fc5(xx[4]); self.nx[5] = Tanhact(SLOPETP*xt)

nx [] содержит значения слоя, BATCHSIZE = 25

Я пришел из C, я Я просто хотел сделать копию тензора / массива, но здесь происходит нечто странное.

call stack between 3rd and 4th for

...