device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
class MLP(nn.Module):
def __init__(self,input_size,hidden_size,output_size,batch,dropout,trainset):
super().__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.batch = batch
self.dropout = dropout
self.trainset = trainset
if trainset == "mnist":
if (self.batch == False) & (self.dropout == False):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("fc2",nn.Linear(hidden_size,hidden_size))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("fc3",nn.Linear(hidden_size,10))
elif (self.batch == True) & (self.dropout == False):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("batch1",nn.BatchNorm1d(hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("fc2",nn.Linear(hidden_size,hidden_size))
self.linear.add_module("batch2",nn.BatchNorm1d(hidden_size))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("fc3",nn.Linear(hidden_size,output_size))
elif (self.batch == False) & (self.dropout == True):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("dropout1",nn.Dropout(0.2))
self.linear.add_module("fc2",nn.Linear(hidden_size,hidden_size))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("dropout2",nn.Dropout(0.2))
self.linear.add_module("fc3",nn.Linear(hidden_size,output_size))
elif (self.batch == True) & (self.dropout == True):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("batch1",nn.BatchNorm1d(hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("dropout1",nn.Dropout(0.2))
self.linear.add_module("fc2",nn.Linear(hidden_size,hidden_size))
self.linear.add_module("batch2",nn.BatchNorm1d(hidden_size))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("dropout2",nn.Dropout(0.2))
self.linear.add_module("fc3",nn.Linear(hidden_size,output_size))
elif trainset == "cifar10":
if (self.batch == False) & (self.dropout == False):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("fc2",nn.Linear(hidden_size,512))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("fc3",nn.Linear(512,output_size))
elif (self.batch == True) & (self.dropout == False):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("batch1",nn.BatchNorm1d(hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("fc2",nn.Linear(hidden_size,512))
self.linear.add_module("batch2",nn.BatchNorm1d(512))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("fc3",nn.Linear(512,output_size))
elif (self.batch == False) & (self.dropout == True):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("dropout1",nn.Dropout(0.5))
self.linear.add_module("fc2",nn.Linear(hidden_size,512))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("dropout2",nn.Dropout(0.5))
self.linear.add_module("fc3",nn.Linear(512,output_size))
elif (self.batch == True) & (self.dropout == True):
self.linear = nn.Sequential()
self.linear.add_module("fc1",nn.Linear(input_size,hidden_size))
self.linear.add_module("batch1",nn.BatchNorm1d(hidden_size))
self.linear.add_module("relu1",nn.ReLU())
self.linear.add_module("dropout1",nn.Dropout(0.5))
self.linear.add_module("fc2",nn.Linear(hidden_size,512))
self.linear.add_module("batch2",nn.BatchNorm1d(512))
self.linear.add_module("relu2",nn.ReLU())
self.linear.add_module("dropout2",nn.Dropout(0.5))
self.linear.add_module("fc3",nn.Linear(512,output_size))
def forward(self,x):
out = self.linear(x)
return out
def init_weights(m):
if type(m) == nn.Linear:
torch.nn.init.kaiming_uniform(m.weight)
m.bias.data.fill_(0.01)
model = MLP(input_size=784,hidden_size=100,output_size=10,batch=False,dropout=False,trainset="mnist").to(device)
model.apply(init_weights)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(),lr=0.01)
epochs = 10
def train_fit(loader_train,epochs):
model.train()
loss = []
for epoch in range(epochs):
avg_cost= 0
total_batch = len(loader_train)
for data,targets in loader_train:
data = data.to(device)
targets = targets.to(device)
outputs = model(data)
cost = criterion(outputs,targets)
avg_cost += cost / total_batch
optimizer.zero_grad()
cost.backward()
optimizer.step()
loss.append(avg_cost)
print("Epoch {} 일때 loss 값 {} 입니다.".format(epoch+1,avg_cost))
return loss
def train(loader_train):
model.eval()
correct = 0
with torch.no_grad():
for data,targets in loader_train:
data = data.to(device)
targets = targets.to(device)
outputs = model(data)
_,predicted = torch.max(outputs.data,1)
correct += predicted.eq(targets.data.view_as(predicted)).sum()
data_num = len(loader_train.dataset)
print("\n학습 데이터에서 예측 정확도: {}/{} ({:.0f}%)\n".format(correct,data_num,100 * correct / data_num))
def test(loader_test):
model.eval()
correct = 0
with torch.no_grad():
for data,targets in loader_test:
data = data.to(device)
targets = targets.to(device)
outputs = model(data)
_,predicted = torch.max(outputs.data,1)
correct += predicted.eq(targets.data.view_as(predicted)).sum()
data_num = len(loader_test.dataset)
print("\n테스트 데이터에서 예측 정확도: {}/{} ({:.0f}%)\n".format(correct,data_num,100 * correct / data_num))