vmtmxmf5 / Pytorch-

pytorch로 머신러닝~딥러닝 구현
3 stars 0 forks source link

OneHot Encoding (Cross Entropy) - Pytorch #3

Open vmtmxmf5 opened 3 years ago

vmtmxmf5 commented 3 years ago
y_oh = torch.zeros_like(y_pred)
y_oh.scatter_(1, y_train.unsqueeze(1), 1)

scatter : in-place scatter(dim, idx, 채울 숫자)

실전 코드

longTensor(64 bit) 아니면 scatter_ 안 됨

X_data = [[1, 2, 1, 1],
           [2, 1, 3, 2],
           [3, 1, 3, 4],
           [4, 1, 5, 5],
           [1, 7, 5, 5],
           [1, 2, 5, 6],
           [1, 6, 6, 6],
           [1, 7, 7, 7]]
y_data = [2, 2, 2, 1, 1, 1, 0, 0]

X_train = torch.FloatTensor(X_data)
y_train = torch.LongTensor(y_data)
y_oh = torch.zeros(y_train.shape[0], len(y_train.unique()))
y_oh.scatter_(1, y_train.unsqueeze(1), 1)
vmtmxmf5 commented 3 years ago

Cross Entropy 정리

tf torch
tf.losses.sparse_categorcial_crossentropy 직접 정의
(y_oh * -torch.log(y_hat)).sum(dim=1).mean()
tf.losses.categorical_crossentropy F.Cross_entropy(z, y_train)
softmax까지 한 번에 합친 함수

따로 prediction을 출력하는 것이면 softmax 레이어를 명시적으로 넣어 확률화 하는게 맞는데,

어차피 y_hat을 argmax로 구하는 것이면 그럴 필요가 있을까?

for epoch in range(2000):
    # OH
    y_hat = F.softmax(X_train.matmul(W) + b, dim=1)
    cost = (y_oh * -torch.log(y_hat)).sum(dim=1).mean()
    # sum(dim=1) : 원핫과 계산해서 0이 된 열들을 하나로 모아주는 작업

    # ~OH
    z = X_train.matmul(W) + b
    cost = F.cross_entropy(z, y_train)

    optm.zero_grad()
    cost.backward()
    optm.step()

    if epoch % 100 == 0:
        print(cost.item())