我正試圖在一個預先訓練好的模型輸出的嵌入之上建立一個神經網路。具體而言:我有一個保存在磁盤上的基礎模型的日志,其中每個例子是一個 512 形狀的陣列(最初對應于一個影像),并有一個相關的標簽(0 或 1)。這就是我現在正在做的事情:
以下是我在做的事情。
以下是我的模型定義和訓練回圈。現在,它是一個簡單的線性層,只是為了確保它的作業,然而,當我運行這個腳本時,損失從0.4開始,而不是~.7,這是二進制分類的標準。誰能指出我哪里出了問題?
from transformers.modeling_outputs import SequenceClassifierOutput
class ClassNet(nn.Module)。
def __init__(self, num_labels=2) 。
super(ClassNet, self).__init__()
self.num_labels = num_labels
self.classifier = nn.Linear(512, num_labels) if num_labels > 0 else nn.identity()
def forward(self, inputs)。
logits = self.classifier(inputs)
loss_fct = nn.CrossEntropyLoss()
loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1)
return SequenceClassifierOutput(
loss=損失。
logits=logits
)
模型 = ClassNet()
optimizer = optim.Adam(model.parameters(), lr=1-4, weight_decay=5-3) # L2正則化[/span] 。
loss_fct=nn.CrossEntropyLoss()
for epoch in range(2)。 # 在資料集上回圈多次。
running_loss = 0.0: # loop over the dataset multiple times.
for i, data in enumerate(train_loader, 0)。
# get the inputs; data is a list of [inputs, labels].
#data['embeddings'] -> torch.Size([1, 512])。
#data['label'] -> torch.Size([1])
inputs, labels = data['embeddings'], data['label']
# 將引數梯度歸零。
optimizer.zero_grad()
# forward backward optimizer
output = model(inputs)
loss = loss_fct(output.logits.squeeze(1), labels.squeeze()
loss.backward()
優化器.步驟()
#列印統計資訊。
running_loss = loss.item()
if i % 2000 == 1: # print every 2000 mini-batches.
print('[%d, ]] loss: %.3f' %
(epoch 1, i 1, running_loss / 2000)
running_loss=0.0。
一個列印outputs.logits.squeeze(1)和labels.squeeze()的例子:
#outputs.logits.queeze(1)
張量([[-0.2214, 0.2187]。
[0.3838, -0.3608] 。
[0.9043, -0.9065] 。
[-0.3324, 0.4836] 。
[0.6775, -0.5908] 。
[-0.8017, 0.9044] 。
[0.6669, -0.6488] 。
[0.4253, -0.5357] 。
[-1.1670, 1.1966] 。
[-0.0630, -0.1150] 。
[0.6025, -0.4755] 。
[1.8047, -1.7424] 。
[-1.5618, 1.5331] 。
[0.0802, -0.3321] 。
[-0.2813, 0.1259] 。
[1.3357, -1.2737]], grad_fn=<SqueezeBackward1> )
#labels.squeeze()/span>
tensor([1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0] )
#loss[/span
tensor(0.4512, grad_fn=<NllLossBackward>)
uj5u.com熱心網友回復:
你只是從第二次迭代開始列印。以上將有效地列印每200k 1步,但i開始于0
if i % 2000 == 1: # print every 2000 mini-batches.
print('[%d, ]] loss: %.3f' %
(epoch 1, i 1, running_loss / 2000)
i.e.已經發生了一個梯度下降步驟。這可能足以從最初的損失值-log(1/2) = ~0.69到你觀察到的~0.45。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329660.html
標籤:
下一篇:回圈以從兩個dfR中創建假人
