Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模型权重没有更新,但损失正在减少_Python_Machine Learning_Neural Network_Pytorch - Fatal编程技术网

Python 模型权重没有更新,但损失正在减少

Python 模型权重没有更新,但损失正在减少,python,machine-learning,neural-network,pytorch,Python,Machine Learning,Neural Network,Pytorch,下面的代码是在使用loss | | | output-input | | ^2时,使用大小为64*64的图像训练MLP 由于某些原因,我的每个历元的权重没有如最后所示进行更新 class MLP(nn.Module): def __init__(self, size_list): super(MLP, self).__init__() layers = [] self.size_list = size_list for i

下面的代码是在使用loss | | | output-input | | ^2时,使用大小为64*64的图像训练MLP

由于某些原因,我的每个历元的权重没有如最后所示进行更新

class MLP(nn.Module):
    def __init__(self, size_list):
        super(MLP, self).__init__()
        layers = []
        self.size_list = size_list
        for i in range(len(size_list) - 2):
            layers.append(nn.Linear(size_list[i],size_list[i+1]))
            layers.append(nn.ReLU())
        layers.append(nn.Linear(size_list[-2], size_list[-1]))
        self.net = nn.Sequential(*layers)

    def forward(self, x):
        return self.net(x)

model_1 = MLP([4096, 64, 4096])
对于每个时代的训练:

def train_epoch(model, train_loader, criterion, optimizer):
    model.train()
    model.to(device)

running_loss = 0.0

    start_time = time.time()
    # train batch
    for batch_idx, (data) in enumerate(train_loader):   
        optimizer.zero_grad() 

        data = data.to(device)

        outputs = model(data)
        loss = criterion(outputs, data)
        running_loss += loss.item()

        loss.backward()
        optimizer.step()

    end_time = time.time()

    weight_ll = model.net[0].weight
    running_loss /= len(train_loader)

    print('Training Loss: ', running_loss, 'Time: ',end_time - start_time, 's')
    return running_loss, outputs, weight_ll
对于数据的培训:

n_epochs = 20
Train_loss = []
weights=[]

criterion = nn.MSELoss()

optimizer = optim.SGD(model_1.parameters(), lr = 0.1)


for i in range(n_epochs):
    train_loss, output, weights_ll = train_epoch(model_1, trainloader, criterion, optimizer)
    Train_loss.append(train_loss)
    weights.append(weights_ll)
    print('='*20)
现在,当我打印每个历元第一个完全连接层的权重时,它们不会被更新

print(weights[0][0])
print(weights[19][0])
上述输出为(显示历元0和历元19中的权重):

张量([0.0086,0.0069,-0.0048,…-0.0082,-0.0115,-0.0133],
grad_fn=)
张量([0.0086,0.0069,-0.0048,…-0.0082,-0.0115,-0.0133],
grad_fn=)

可能出了什么问题?看看我的损失,它正在以稳定的速度减少,但重量没有变化。

尝试在
train\u epoch()
函数中更改它
weight\u ll=model.net[0].weight.clone()
。你会看到重量不同


说明:
weights\u ll
如果不克隆,则始终是最后一个历元值。它将被视为图中相同的张量。这就是为什么你的
权重[0][0]
等于
权重[19][0]
,它们实际上是相同的张量

您是否在
loss.backword()
之后检查了您网络的计算梯度?@zihaozhao在打印出grad=model.net[0].weight.grad后,对于每个历元,它们似乎都没有被更新!您正在更新权重。但是打印权重的方式是不正确的。请检查我的答案。我试了你的建议,但没有任何好处。然后我试着使用复制模块中的deepcopy,我看到这里和那里的权重有0.001的差异,但没有什么其他的。这很奇怪。因为我可以复制结果。@dankpenny我发现有人和你有同样的问题。请检查这个问题
tensor([ 0.0086,  0.0069, -0.0048,  ..., -0.0082, -0.0115, -0.0133],
       grad_fn=<SelectBackward>)
tensor([ 0.0086,  0.0069, -0.0048,  ..., -0.0082, -0.0115, -0.0133],
       grad_fn=<SelectBackward>)