본문 바로가기
AI

Day72_Ai(8)_Pm

by roaring90s 2025. 11. 5.

CNN 

또다른 알고리즘

CNNEx1

import torch
import torch.nn as nn

inputs = torch.Tensor(1,1,28,28)
#batch, channel, height, weight
print(inputs.shape)
#padding, stride

conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1, stride=1)
print(conv1)

conv2 = nn.Conv2d(32,64,3,padding=1)
print(conv2)

pool = nn.MaxPool2d(kernel_size=2)
print(pool)
print()

output = conv1(inputs )
print(output.size())
print()

output = conv2(output)
print(output.size())
print()

output = pool(output)
print(output.size())
print()

output = output.view(output.size(0), -1)
print(output.size())

fclayer = nn.Linear(12544, 10)
output = fclayer(output)
print(output. size())

 


CNNEx2

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as dset
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

train_epochs = 10
batch_size = 100

train_data = dset.MNIST('MNIST_data/',
                        train=True,
                        download=True,
                        transform=transforms.ToTensor())    #하나만 있을때 직접연결가능

test_data = dset.MNIST('MNIST_data/',
                        train=False,
                        download=True,
                        transform=transforms.ToTensor())

data_loader = DataLoader(dataset=train_data,
                         batch_size=batch_size,
                         shuffle=True,
                         drop_last=True)

class CNNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, 32, 3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )

        self.layer2 = nn.Sequential(
            nn.Conv2d(32,64,3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )

        self.fc =nn.Linear(64 * 7 * 7, 10)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.view(out.size(0), -1)
        y = self.fc(out)
        return y

model = CNNet()
loss_func = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
total_batch = len(data_loader)

for epoch in range(train_epochs):
    avg_loss = 0
    for x_train, y_train in data_loader:
        optimizer.zero_grad()
        hypothesis = model(x_train)
        loss = loss_func(hypothesis, y_train)
        loss.backward()
        optimizer.step()
        avg_loss += loss / total_batch
    print(f'epoch: {epoch+1} avg_loss:{avg_loss:.4f}')

    with torch.no_grad():
        x_test = test_data.test_data.view(len(test_data), 1, 28, 28).float()
        y_test = test_data.test_labels
        prediction = model(x_test)
        correction_prediction = torch.argmax(prediction, dim=1) == y_test
        accuracy = correction_prediction.float().mean()
        print(f'accuracy: {accuracy.item() * 100:2.2f}')

 


CNNEx3

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as dset
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

#쿠다 사용하기==========================================================
train_epochs = 10
batch_size = 100

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('using device:', device)

train_data = dset.MNIST('MNIST_data/',
                        train=True,
                        download=True,
                        transform=transforms.ToTensor())    #하나만 있을때 직접연결가능

test_data = dset.MNIST('MNIST_data/',
                        train=False,
                        download=True,
                        transform=transforms.ToTensor())

data_loader = DataLoader(dataset=train_data,
                         batch_size=batch_size,
                         shuffle=True,
                         drop_last=True)

test_loader = DataLoader(dataset=test_data,         #3333333333333333333333
                         batch_size=batch_size,
                         shuffle=False
                         )


class CNNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, 32, 3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )

        self.layer2 = nn.Sequential(
            nn.Conv2d(32,64,3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2)
        )

        self.fc =nn.Linear(64 * 7 * 7, 10)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.view(out.size(0), -1)
        y = self.fc(out)
        return y

model = CNNet().to(device)          #11111111111
loss_func = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
total_batch = len(data_loader)

for epoch in range(train_epochs):
    avg_loss = 0
    for x_train, y_train in data_loader:
        x_train = x_train.to(device, non_blocking=True) #병렬로 사용할수 있게(동시다발)2222
        y_train = y_train.to(device, non_blocking=True) #병렬로 사용할수 있게(동시다발)2222
        optimizer.zero_grad()
        hypothesis = model(x_train)
        loss = loss_func(hypothesis, y_train)
        loss.backward()
        optimizer.step()
        avg_loss += loss / total_batch
    print(f'epoch: {epoch+1} avg_loss:{avg_loss:.4f}')

    with torch.no_grad():                   #4444444444444444
        model.eval()
        correct = 0
        total = 0
        for x_test, y_test in test_loader:
            x_test = x_test.to(device, non_blocking=True)
            y_test = y_test.to(device, non_blocking=True)
            pred = model(x_test)
            pred_labels = pred.argmax(dim=1)
            correct += (pred_labels == y_test).sum().item()
            total += y_test.size(0)
    accuracy = correct / total * 100
    print('accuracy:{:2.2f}%'.format(accuracy))

 


 

'AI' 카테고리의 다른 글

Day73_Ai(9)_Pm  (0) 2025.11.06
Day73_Ai(9)_Am  (0) 2025.11.06
Day72_Ai(8)_Am  (0) 2025.11.05
Day70_Ai(6)_Pm  (0) 2025.11.03
Day67_Ai(5)_Pm  (0) 2025.10.31