다음은 훈련 및 테스트 용도의 레코드 개수를 출력한 결과입니다.
1383 1383 345 345
데이터 준비가 끝났으므로, 모델의 네트워크를 생성합니다.
코드 2-10 모델의 네트워크 생성
class Model(nn.Module): ------ ①
def __init__(self, embedding_size, output_size, layers, p=0.4): ------ ②
super().__init__() ------ ③
self.all_embeddings = nn.ModuleList([nn.Embedding(ni, nf) for ni, nf in embedding_size])
self.embedding_dropout = nn.Dropout(p)
all_layers = []
num_categorical_cols = sum((nf for ni, nf in embedding_size))
input_size = num_categorical_cols ------ 입력층의 크기를 찾기 위해 범주형 칼럼 개수를 input_size 변수에 저장
for i in layers: ------ ④
all_layers.append(nn.Linear(input_size, i))
all_layers.append(nn.ReLU(inplace=True))
all_layers.append(nn.BatchNorm1d(i))
all_layers.append(nn.Dropout(p))
input_size = i
all_layers.append(nn.Linear(layers[-1], output_size))
self.layers = nn.Sequential(*all_layers) ------ 신경망의 모든 계층이 순차적으로 실행되도록 모든 계층에 대한 목록(all_layers)을 nn.Sequential 클래스로 전달
def forward(self, x_categorical): ------ ⑤
embeddings = []
for i,e in enumerate(self.all_embeddings):
embeddings.append(e(x_categorical[:,i]))
x = torch.cat(embeddings, 1) ------ 넘파이의 concatenate와 같지만 대상이 텐서가 됩니다.
x = self.embedding_dropout(x)
x = self.layers(x)
return x