突然想到 PyTorch 如何在資料是 one hot 格式下做到 label smoothing loss?
label smoothing 主要是用來嘗試解決 "過擬合" 的問題
然後發現 chat gpt 給出的答案真的可行
這邊做個紀錄
假設你有一個大小為 (batch_size, num_classes) 的 one-hot 格式的標簽張量。標簽平滑的目標是將一個類別的概率降低,同時增加其他類別的概率。
以下是一個簡單的示例代碼,演示了如何在 PyTorch 中實現標簽平滑:
import torch import torch.nn as nn class LabelSmoothingLoss(nn.Module): def __init__(self, smoothing=0.0): super(LabelSmoothingLoss, self).__init__() self.smoothing = smoothing def forward(self, output, target): logprobs = torch.nn.functional.log_softmax(output, dim=-1) num_classes = output.size(-1) # 將 one-hot 格式的標簽轉換為概率分布 target_probs = (1.0 - self.smoothing) * target + self.smoothing / num_classes # 計算交叉熵損失 loss = -torch.sum(logprobs * target_probs, dim=-1).mean() return loss # 使用示例 # 假設我們有一個大小為 (batch_size, num_classes) 的輸出張量和對應的 one-hot 格式標簽張量 batch_size = 32 num_classes = 10 # 生成示例的輸出張量和 one-hot 格式的標簽張量 output = torch.randn(batch_size, num_classes) target = torch.zeros(batch_size, num_classes) target[:, 0] = 1 # 假設第一個類別是正確的類別 # 創建標簽平滑損失函數 criterion = LabelSmoothingLoss(smoothing=0.1) # 計算損失 loss = criterion(output, target) print("Loss:", loss.item())
在這個示例中,我們首先定義了一個名為 LabelSmoothingLoss 的自定義損失函數,它將輸出張量和 one-hot 格式的標簽張量作為輸入。在損失的計算過程中,我們將 one-hot 格式的標簽轉換為概率分布,並使用交叉熵損失來計算損失值。
請注意,標簽平滑的程度由參數 smoothing 控制,這個參數決定了從正確類別中減去的概率量。通常,smoothing 的值應該在 0 和 1 之間。
感謝 chat gpt 大神
發現 keras 這邊就比較方便了
https://www.tensorflow.org/api_docs/python/tf/keras/losses/CategoricalCrossentropy
tf.keras.losses.CategoricalCrossentropy( from_logits=False, label_smoothing=0.0, axis=-1, reduction=losses_utils.ReductionV2.AUTO, name='categorical_crossentropy' )
直接! 就在loss裡就有這功能了
留言板
歡迎留下建議與分享!希望一起交流!感恩!