将简单的测试模型从Keras翻译成PyTorch后得到了非常不同的分数
我正试图从Keras过渡到PYTorch 在阅读了教程和类似的问题之后,我提出了以下简单的模型进行测试。然而,下面的两个模型给了我非常不同的分数:Keras(0.9),PyTorch(0.03) 有人能给我指点路吗 基本上,我的数据集有120个特征和多标签,其中有3个类,如下所示将简单的测试模型从Keras翻译成PyTorch后得到了非常不同的分数,keras,pytorch,Keras,Pytorch,我正试图从Keras过渡到PYTorch 在阅读了教程和类似的问题之后,我提出了以下简单的模型进行测试。然而,下面的两个模型给了我非常不同的分数:Keras(0.9),PyTorch(0.03) 有人能给我指点路吗 基本上,我的数据集有120个特征和多标签,其中有3个类,如下所示 [ [1,1,1], [0,1,1], [1,0,0], ... ] def score(true, pred): lrl = label_ranking_loss(true,
[
[1,1,1],
[0,1,1],
[1,0,0],
...
]
def score(true, pred):
lrl = label_ranking_loss(true, pred)
lrap = label_ranking_average_precision_score(true, pred)
print('LRL:', round(lrl), 'LRAP:', round(lrap))
#Keras:
model= Sequential()
model.add(Dense(60, activation="relu", input_shape=(120,)))
model.add(Dense(30, activation="relu"))
model.add(Dense(3, activation="sigmoid"))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=100)
pred = model.predict(x_test)
score(y_test, pred)
#PyTorch
model = torch.nn.Sequential(
torch.nn.Linear(120, 60),
torch.nn.ReLU(),
torch.nn.Linear(60, 30),
torch.nn.ReLU(),
torch.nn.Linear(30, 3),
torch.nn. Sigmoid())
loss_fn = torch.nn. BCELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
epochs = 100
batch_size = 32
n_batch = int(x_train.shape[0]/batch_size)
for epoch in range(epochs):
avg_cost = 0
for i in range(n_batch):
x_batch = x_train[i*batch_size:(i+1)*batch_size]
y_batch = y_train[i*batch_size:(i+1)*batch_size]
x, y = Variable(torch.from_numpy(x_batch).float()), Variable(torch.from_numpy(y_batch).float(), requires_grad=False)
pred = model(x)
loss = loss_fn(pred, y)
loss.backward()
optimizer.step()
avg_cost += loss.item()/n_batch
print(epoch, avg_cost)
x, y = Variable(torch.from_numpy(x_test).float()), Variable(torch.from_numpy(y_test).float(), requires_grad=False)
pred = model(x)
score(y_test, pred.data.numpy())
您需要在每次迭代开始时调用
optimizer.zero_grad()
,否则不同批次的梯度会不断累积。您需要在每次迭代开始时调用optimizer.zero_grad()
,否则不同批次的梯度会不断累积。谢谢。我应该把“optimizer.zero_grad()”放在哪个循环的开头?在“范围内的历元(历元)”之后或在“范围内的i(n\u批次):”之后?在范围内的i(n\u批次)之后:
基本上,在每次向后()
调用优化器之前。零梯度()。谢谢。我应该把“optimizer.zero_grad()”放在哪个循环的开头?在“范围内的历元(历元)”之后或在“范围内的i(n\u批):”之后?在范围内的i(n\u批)之后:基本上,在每次向后()之前
调用优化器。零梯度()。