Я новичок в Python, и я пытаюсь реализовать сокращение каналов в Resnet50, что в основном означает, что моя программа должна уменьшить размеры тензоров веса для каждого слоя в сети. Вход представляет собой 4-мерный тензор, а выходной должен быть тензор, размер которого уменьшается, при этом удаляются все каналы, индексы которых отсутствуют в списке «idx».
# this code is in a function that takes *blocks* and *amount* as arguments
# *blocks* is a nested dictionary containing the layers in each bottleneck in resnet50
# the output is *reduced_blocks* which is also a nested-dictionary
reduced_blocks={}
for block in blocks:
bottleneck={}
for layer in blocks[block]:
#store dimentions of the layer to be pruned in this case, its conv3 of each bottleneck in resnet50
(c_,h_,w_,d_)=blocks[block][layer].conv3.weight.shape
#store the content of the weight tensor of layer conv3
layer3 = blocks[block][layer].conv3.weight
# a new 4-dimensional tensor that has the reduced dimensions by *amount*
w = torch.zeros(c_,int(h_*(1-amount)),w_,d_)
w_plane=torch.zeros(int(h_*(1-amount)),w_,d_)
for i in range(c_):
m=0
for j in idx:
# *idx* contains only the indexes of channels that i want to keep
# this is where the problem appears to be, if I comment this line, the code runs without memory saturation
w_plane[m]=layer3[i][j]
m+=1
# I assign the pruned plane to the *w* tensor
w[i]=w_plane
dic = {'conv3':w }
bottleneck.update({layer:dic})
reduced_blocks[block] = bottleneck.copy()
bottleneck.clear()
# the function then returns *bottleneck_pruned*
Всякий раз, когда я запускаю код в лаборатории Jupyter использование памяти начинает расти, пока не осталось ничего. Машина либо зависает, либо Jupyter перезапускает ядро. Я не уверен, почему я получаю эту ошибку, может потому, что у меня слишком много вложенных циклов for? Потому что, если я применяю сокращение только к одному слою, программа работает нормально. Я попытался определить, где именно проблема, кажется. Я прокомментировал программу построчно, пока не обнаружил, что виновником было назначение в последнем l oop. Если кто-то поймет, почему у меня возникла эта проблема, ваша помощь будет принята с благодарностью.