#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(),
)
Однако не так уж здорово снова определять сеть. Я пробовал следующие способы, но это не сработало-
net_copy = nn.Sequential(net)
: При таком подходе кажется, чтоnet_copy
это просто общий указатель наnet
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