
컴퓨터가 인식하는 논리 게이트인데 XOR 연산같은 경우는 학습이 불가능하다. 이를 극복하기 위해 hidden layer를 두어 비선형인 데이터 학습이 가능하도록 함. 다층 퍼셉트론 MLP을 고안하는데 hidden layer 여러개 두는 신경망을 딥러닝이라고 함.

: 전달 받은 값을 출력할 때 출력값을 변화시키는 비선형 함수임. 왜 필요하냐? 라고 생각할 수 있는데 선형적인 저차원 데이터를 고차원 비선형으로 변형하는데 기여를 하기 때문!! 선형함수는 선형끼리만 연결되므로 비선형 고차원을 표현하기 위해서는 활성화 함수가 필요함.
: 경사하강법은 학습률과 손실 함수의 순간 기울기를 이용해서 가중치를 업데이트하는 방법. 미분의 기울기를 이용해서 오차를 비교하고 최소화하는 방향으로 이동시켜야 하는데 이때 오차를 비교하는 방법이 손실함수임.






업데이트된 가중치로 loss가 최소화가 될 때까지 다시 학습 1~4번 반복
hidden layer가 많을수록 표현력이 증가. 전달되는 오차가 크게 줄은 경우 마냥 좋은 것은 아님. vanishing gradient문제가 발생하므로 이는 렐루를 이용해서 해결. overfitting을 방지하기 위해 dropout 등을 이용.

class Net(nn.Module):
def __init__(self, input_shape=(3,32,32)):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3)
self.conv2 = nn.Conv2d(32, 64, 3)
self.conv3 = nn.Conv2d(64, 128, 3)
self.pool = nn.MaxPool2d(2,2)
n_size = self._get_conv_output(input_shape)
self.fc1 = nn.Linear(n_size, 512)
self.fc2 = nn.Linear(512, 10)
# Define proportion or neurons to dropout
self.dropout = nn.Dropout(0.25) #25%의 노드를 무작위로 선택해서 사용하지 않겠다.
def forward(self, x):
x = self._forward_features(x)
x = x.view(x.size(0), -1)
x = self.dropout(x)
x = F.relu(self.fc1(x))
# Apply dropout
x = self.dropout(x)
x = self.fc2(x)
return x
등등