После прочтения официального кода pytorch для resnet я понимаю, что не должен давать имя всем переменным. Я не должен писать:
conv1 = self.conv1(x)
conv2 = self.conv2(conv1)
Я должен просто написать:
out = self.conv1(x)
out = self.conv2(out)
Таким образом, ничто не относится к obj, соответствующему conv1 после его использования, и python может его очистить.
, поскольку между блоками есть остаточные соединения, мне нужна еще одна переменная python для ссылки на переменную: aka
out = self.conv1(x)
residual_connect = out
out = self.conv2(out)
out = conv1 + out
Но на этапе декодирования необходим только выход. Поэтому я удалил residual_connect в начале этапа декодирования.
del residual_connect
Это похоже на взлом, и я удивлен, что это не вызвало проблем на тренировочном этапе. Использование оперативной памяти для моей модели теперь значительно уменьшено, но я считаю, что здесь должен быть более элегантный способ решения проблемы.