File size: 1,634 Bytes
9e55601 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | import torch
import torch.nn as nn
import torch.nn.functional as F
class DeepGBM(nn.Module):
def __init__(self, num_features, cat_features, num_classes, d_main=128, d_hidden=64, n_blocks=4, dropout=0.2):
super(DeepGBM, self).__init__()
self.num_classes = num_classes
# ์ฐ์ํ ๋ณ์ ์ฒ๋ฆฌ (Linear)
self.num_linear = nn.Linear(num_features, d_main)
# ๋ฒ์ฃผํ ๋ณ์ ์ฒ๋ฆฌ (Embedding)
self.cat_embedding = nn.ModuleList([
nn.Embedding(cat_size, d_main) for cat_size in cat_features
])
# ResNet-like ๋ธ๋ก
self.blocks = nn.ModuleList([
nn.Sequential(
nn.Linear(d_main, d_hidden),
nn.ReLU(),
nn.Dropout(dropout),
nn.Linear(d_hidden, d_main),
nn.ReLU()
) for _ in range(n_blocks)
])
if num_classes == 2:
self.output_layer = nn.Linear(d_main, 1) # Binary classification
elif num_classes > 2:
self.output_layer = nn.Linear(d_main, num_classes) # Multi classification
def forward(self, x_num, x_cat): # ๋ ๊ฐ์ ์
๋ ฅ์ ๋ฐ์
x_num = self.num_linear(x_num)
# ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์๋ฒ ๋ฉ ํ ํฉ์ฐ
x_cat = [embed(x_cat[:, i]) for i, embed in enumerate(self.cat_embedding)]
x_cat = torch.stack(x_cat, dim=1).sum(dim=1)
x = x_num + x_cat # ์ฐ์ํ + ๋ฒ์ฃผํ ๊ฒฐํฉ
for block in self.blocks:
x = x + block(x) # Residual connection
x = self.output_layer(x)
return x
|