Как создать копию nn.Последовательный в torch?

#python #neural-network #pytorch

#python #нейронная сеть #pytorch

Вопрос:

Я пытаюсь создать копию nn.Последовательная сеть. Например, следующий самый простой способ сделать то же самое-

 net = nn.Sequential(
        nn.Conv2d(16, 32, 3, stride=2),
        nn.ReLU(),
        nn.Conv2d(32, 64, 3, stride=2),
        nn.ReLU(),
    )

net_copy = nn.Sequential(
        nn.Conv2d(16, 32, 3, stride=2),
        nn.ReLU(),
        nn.Conv2d(32, 64, 3, stride=2),
        nn.ReLU(),
    )
  

Однако не так уж здорово снова определять сеть. Я пробовал следующие способы, но это не сработало-

  1. net_copy = nn.Sequential(net) : При таком подходе кажется, что net_copy это просто общий указатель на net
  2. net_copy = nn.Sequential(*net.modules()) : При таком подходе net_copy содержит гораздо больше слоев.

Наконец, я устал deepcopy следующим образом, который работал нормально-

 net_copy = deepcopy(net)
  

Однако мне интересно, правильно ли это. Я предполагаю, что это нормально, потому что это работает.

Комментарии:

1. вы хотите сохранить веса или хотите новую модель с той же архитектурой?

2. @skinny_func: Я хочу новую модель с той же архитектурой. Я думаю, deepcopy делает то же самое.

3. deepcopy должно быть хорошо. Вы также можете создать функцию, которая копирует параметры и буферы из одной сети в другую после создания экземпляра вашей сети.

4. @SzymonMaszke: Я тоже так думаю. deepcopy работает нормально. Вероятно, это самый простой способ и к тому же чистый! Большое спасибо

Ответ №1:

Ну, я просто использую torch.load и torch.save с io.BytesIO

 import io, torch


# write to a buffer
buffer = io.BytesIO()
torch.save(model, buffer) #<--- model is some nn.module
print(buffer.tell()) #<---- no of bytes written 

del model

# read from buffer
buffer.seek(0) #<--- must see to origin every time before reading
model = torch.load(buffer)
del buffer