pytorch:在每个时代获得相同的结果
我正在尝试训练一个rbf网络。。。我使用了MNIST数据库。和pytorch框架。。。 每个时代的结果都是一样的 结果pytorch:在每个时代获得相同的结果,pytorch,training-data,Pytorch,Training Data,我正在尝试训练一个rbf网络。。。我使用了MNIST数据库。和pytorch框架。。。 每个时代的结果都是一样的 结果 Epoch: 1 Accuracy: 0.785 Loss: 2.435 Recall: 0.386 Precision: 0.258 Epoch: 2 Accuracy: 0.785 Loss: 2.435 Recall: 0.386 Precision: 0.258 Epoch: 3 Accuracy: 0.785
Epoch: 1
Accuracy: 0.785 Loss: 2.435 Recall: 0.386 Precision: 0.258
Epoch: 2
Accuracy: 0.785 Loss: 2.435 Recall: 0.386 Precision: 0.258
Epoch: 3
Accuracy: 0.785 Loss: 2.435 Recall: 0.386 Precision: 0.258
Epoch: 4
Accuracy: 0.785 Loss: 2.435 Recall: 0.386 Precision: 0.258
我的代码。。。我认为问题在线性层的某个地方。模型经过训练后没有任何改进,可能是线性层。似乎重量没有变化。。。!但我不知道为什么
class RBF(nn.Module):
def __init__(self, in_layers, centers, sigmas):
super(RBF, self).__init__()
self.in_layers = in_layers
self.centers = nn.Parameter(centers)
self.sigmas = nn.Parameter(torch.Tensor(self.centers.size(0)))
torch.nn.init.constant_(self.sigmas, sigmas)
def forward(self, x):
x = x.view(-1, self.in_layers)
size = [self.centers.size(0), x.size(0)]
sigma = self.sigmas.view(-1).to(device)**2
dists = torch.empty(size).to(device)
for i,c in enumerate(self.centers):
c = c.reshape(-1,c.size(0))
temp = (x-c).pow(2).sum(-1).pow(0.5)
dists[i] = temp
dists = dists.permute(1,0)
phi = torch.exp(-1*(dists/(2*sigma))) #gaussian
return phi
class Net(nn.Module):
def __init__(self, in_layers, centers, sigmas):
super(Net, self).__init__()
self.rbf_layers = nn.ModuleList()
self.linear_layers = nn.ModuleList()
for i in range(len(in_layers) - 1):
self.rbf_layers.append(RBF(in_layers[i], centers, sigmas))
self.linear_layers.append(nn.Linear(centers.size(0), in_layers[i+1], bias = True))
def forward(self, x):
out = x
for i in range(len(self.rbf_layers)):
out = self.rbf_layers[i](out)
out = F.sigmoid( self.linear_layers[i](out.float()) )
return out
def training(engine, batch, device, model, criterion, optimizer):
inputs, labels = batch[0].to(device), batch[1].to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
return outputs, labels
当然,代码是连续的,但我认为这些已经足够解决问题了(如果你想要更多的‘我在这里’)。。。。你有什么想法吗
代码的训练部分
def training(engine, batch, device, model, criterion, optimizer):
inputs, labels = batch[0].to(device), batch[1].to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
return outputs, labels
def nn_run1(batch, classes, dim, learning_rate, epochs, clusters):
# ---Load Model's Parameters---
train_loader, test_loader = data_loading(batch, shuffle=False)
kmeans_input = train_loader.dataset.train_data
kmeans_input = torch.reshape(kmeans_input.double(), (kmeans_input.size(0), -1))
_, centers = Kmeans(kmeans_input, clusters)
centers = centers.to(device)
sigma = Sigmas(centers)
layers = in_layers(dim, len(classes), layers = 1)
# ---Model Setup---
model = Net(layers, centers, sigma)
model.cuda()
criterion = nn.CrossEntropyLoss()
print(model.parameters)
optimizer = torch.optim.SGD(model.parameters(), learning_rate)
可能是乙状结肠脱离了for循环?有乙状结肠还是没有乙状结肠是一样的。。。我试着在两个层中添加sigmoid,或者不添加,或者一个接一个地添加。。。。但是结果还是一样的。。。每过一个时代都不会进步!你能给我们看一下你调用训练循环的代码以及变量的初始化吗?@cmxu我添加了上面的代码。。。如果你需要额外的信息,告诉我你用什么来循环历史?如果你在for循环中调用nn_run1函数,它每次都会生成一个新的模型,这会导致你每次都得到相同的结果吗?这只是个猜测。乙状结肠可能不在for循环中?有乙状结肠还是没有乙状结肠是一样的。。。我试着在两个层中添加sigmoid,或者不添加,或者一个接一个地添加。。。。但是结果还是一样的。。。每过一个时代都不会进步!你能给我们看一下你调用训练循环的代码以及变量的初始化吗?@cmxu我添加了上面的代码。。。如果你需要额外的信息,告诉我你用什么来循环历史?如果你在for循环中调用nn_run1函数,它每次都会生成一个新的模型,这会导致你每次都得到相同的结果吗?不过这只是猜测而已。