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

我正在尝试训练一个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     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函数,它每次都会生成一个新的模型,这会导致你每次都得到相同的结果吗?不过这只是猜测而已。