Я пытаюсь настроить автоматический кодер для поддержки беспроводной передачи данных. Часть кодера будет жить на стороне передатчика приемопередатчика, а декодер будет жить на стороне приемника. Как правило, передатчик и приемник могут быть разделены на мили и будут существовать на разных компьютерах.
Автоэнкодер должен быть обучен с использованием реального физического канала, поэтому необходимо будет выполнять обратное распространение на двух разных компьютерах (компьютеры передатчика и приемника). У меня вопрос: как я могу запустить процесс обратного распространения на стороне приемника и завершить его на стороне передатчика?
Чтобы немного упростить эту проблему, если вы можете помочь мне выполнить backprop на двух разныхфайлы, которые могут быть достаточно для меня, чтобы расширить его по мере необходимости. Представьте, что кодировщик определяется одним файлом, а декодер - другим. Как мне выполнить backprop для этих двух отдельных файлов?
Я готов использовать либо pytorch, либо тензор потока, в зависимости от того, что лучше подходит для решения проблемы. Pytorch будет моим первым выбором, если это возможно.
Вот код pytorch для стандартного автоэнкодера, который находится в одном файле и действует на данные CIFAR. Вы можете увидеть, как обратное распространение выполняется в одной строке loss.backward (). Это то, что не будет работать, когда автокодер разделен между машинами.
import torch
import torchvision as tv
import torchvision.transforms as transforms
import torch.nn as nn
from torch.autograd import Variable
# Loading and Transforming data
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4466), (0.247, 0.243, 0.261))])
trainTransform = tv.transforms.Compose([tv.transforms.ToTensor(), tv.transforms.Normalize((0.4914, 0.4822, 0.4466), (0.247, 0.243, 0.261))])
trainset = tv.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)
dataloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=False, num_workers=4)
testset = tv.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)
# Writing our model
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder,self).__init__()
self.encoder = nn.Sequential(
nn.Conv2d(3, 6, kernel_size=5),
nn.ReLU(True),
nn.Conv2d(6,16,kernel_size=5),
nn.ReLU(True))
self.decoder = nn.Sequential(
nn.ConvTranspose2d(16,6,kernel_size=5),
nn.ReLU(True),
nn.ConvTranspose2d(6,3,kernel_size=5),
nn.ReLU(True),
nn.Sigmoid())
def forward(self,x):
x = self.encoder(x)
x = self.decoder(x)
return x
#defining some params
num_epochs = 5 #you can go for more epochs, I am using a mac
batch_size = 128
model = Autoencoder().cpu()
distance = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(),weight_decay=1e-5)
for epoch in range(num_epochs):
for data in dataloader:
img, _ = data
img = Variable(img).cpu()
# ===================forward=====================
output = model(img)
loss = distance(output, img)
# ===================backward====================
optimizer.zero_grad()
loss.backward()
optimizer.step()
# ===================log========================
print('epoch [{}/{}], loss:{:.4f}'.format(epoch+1, num_epochs, loss.data.numpy()))