ResNet code
import osos.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"os.environ["CUDA_VISIBLE_DEVICES"]="6"import torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils.data import DataLoaderfrom torchvision import datasets, transforms, modelsimport matplotlib.pyplot as pltfrom tqdm import tqdmimport numpy as npfrom sklearn.utils.class_weight import compute_class_weight# Set devicedevice = torch...
2024.07.17
Inception code
Inception V3import osos.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"os.environ["CUDA_VISIBLE_DEVICES"]="3" import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, models, transformsfrom torch.utils.data import DataLoaderimport matplotlib.pyplot as pltimport numpy as npimport timeimport copyfrom tqdm import tqdmfrom sklearn.utils.class_weight import compute_cl..
2024.07.17
no image
ResNET50이 뭘까
ResNet-50은 이미지 분류에 뛰어난 합성곱 신경망(CNN)입니다. 마치 사진을 분석하고, 그 안의 사물과 장면을 식별하고, 그에 따라 분류할 수 있는 고도로 훈련된 이미지 분석가와 같습니다. ResNet 아키텍처는 ResNet-18, ResNet-32 등 다양한 깊이로 제공되며 ResNet-50은 중간 크기의 변형입니다 ResNet이 해결한 주요 문제는 딥 신경망의 저하 문제였습니다. 네트워크가 깊어짐에 따라 정확도가 포화되고 급격히 저하됩니다. 이러한 저하가 과적합으로 인해 발생하는 것이 아니라 학습 과정을 최적화하는 데 어려움이 있기 때문입니다. ResNet은 스킵 연결을 통해 정보가 직접 흐를 수 있도록 하는 잔여 블록을 사용하여 이 문제를 해결하고, 사라지는 그래디언트 문제를 완화했습니다. ..
2024.07.11

ResNet code

파이썬정복
|2024. 7. 17. 04:59
import os

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="6"

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms, models
import matplotlib.pyplot as plt
from tqdm import tqdm
import numpy as np
from sklearn.utils.class_weight import compute_class_weight


# Set device
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# Define transformations for training, validation, and testing
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),  # Example augmentation
    transforms.RandomRotation(10),  # Example augmentation
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# Load datasets
train_dataset = datasets.ImageFolder(root='../datasets/train/', transform=transform)
val_dataset = datasets.ImageFolder(root='../datasets/val/', transform=transform)
test_dataset = datasets.ImageFolder(root='../datasets/test/', transform=transform)

# Create data loaders
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

# Compute class weights
targets = [sample[1] for sample in train_dataset.samples]
class_weights = compute_class_weight('balanced', classes=np.unique(targets), y=targets)
class_weights = torch.tensor(class_weights, dtype=torch.float).to(device)

# Load ResNet model (not pretrained) and modify the final layer
model = models.resnet18(weights=None)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 5)  # 5 classes
model = model.to(device)

# Define loss function and optimizer
criterion = nn.CrossEntropyLoss(weight=class_weights)
optimizer = optim.Adam(model.parameters(), lr=1e-8)

# Training function
def train_model(model, train_loader, val_loader, criterion, optimizer, num_epochs=100):
    train_losses = []
    val_losses = []
    train_accuracies = []
    val_accuracies = []
    
    for epoch in range(num_epochs):
        model.train()
        running_loss = 0.0
        correct = 0
        total = 0
        
        print(f'Epoch {epoch+1}/{num_epochs}')
        for inputs, labels in tqdm(train_loader, desc="Training"):
            inputs, labels = inputs.to(device), labels.to(device)
            
            optimizer.zero_grad()
            
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            
            running_loss += loss.item() * inputs.size(0)
            _, predicted = torch.max(outputs, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
        
        epoch_loss = running_loss / len(train_loader.dataset)
        epoch_acc = correct / total
        train_losses.append(epoch_loss)
        train_accuracies.append(epoch_acc)
        
        print(f'Loss: {epoch_loss:.4f}, Accuracy: {epoch_acc:.4f}')
        
        # Validate the model
        model.eval()
        val_loss = 0.0
        val_correct = 0
        val_total = 0
        
        with torch.no_grad():
            for inputs, labels in tqdm(val_loader, desc="Validation"):
                inputs, labels = inputs.to(device), labels.to(device)
                
                outputs = model(inputs)
                loss = criterion(outputs, labels)
                
                val_loss += loss.item() * inputs.size(0)
                _, predicted = torch.max(outputs, 1)
                val_total += labels.size(0)
                val_correct += (predicted == labels).sum().item()
        
        val_loss /= len(val_loader.dataset)
        val_acc = val_correct / val_total
        val_losses.append(val_loss)
        val_accuracies.append(val_acc)
        
        print(f'Validation Loss: {val_loss:.4f}, Validation Accuracy: {val_acc:.4f}')

    return model, train_losses, val_losses, train_accuracies, val_accuracies

# Train the model
model, train_losses, val_losses, train_accuracies, val_accuracies = train_model(model, train_loader, val_loader, criterion, optimizer, num_epochs=200)

# Define additional information for the legend
model_name = 'ResNet18'
num_epochs = 200
learning_rate = 1e-8

# Plot the loss graph
plt.figure(figsize=(10, 5))
plt.plot(train_losses, label='Training Loss', color='green')
plt.plot(val_losses, label='Validation Loss', color='red')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.title(f'{model_name} Training and Validation Loss\nEpochs: {num_epochs}, LR: {learning_rate}')
plt.savefig('training_validation_loss_re_e8.png')  # Save the plot
plt.clf()  # Clear the plot


# Plot the accuracy graph
plt.figure(figsize=(10, 5))
plt.plot(train_accuracies, label='Training Accuracy', color='blue')
plt.plot(val_accuracies, label='Validation Accuracy', color='orange')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.title(f'{model_name} Training and Validation Accuracy\nEpochs: {num_epochs}, LR: {learning_rate}')
plt.savefig('training_validation_accuracy_re_e8.png')    # Save the plot
plt.clf()  # Clear the plot

# Test the model
model.eval()
test_loss = 0.0
test_correct = 0
test_total = 0

with torch.no_grad():
    for inputs, labels in tqdm(test_loader, desc="Testing"):
        inputs, labels = inputs.to(device), labels.to(device)
        
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        
        test_loss += loss.item() * inputs.size(0)
        _, predicted = torch.max(outputs, 1)
        test_total += labels.size(0)
        test_correct += (predicted == labels).sum().item()

test_loss /= len(test_loader.dataset)
test_acc = test_correct / test_total

print(f'Test Loss: {test_loss:.4f}, Test Accuracy: {test_acc:.4f}')

'해외경험 > UNLV' 카테고리의 다른 글

Inception code  (0) 2024.07.17
ResNET50이 뭘까  (0) 2024.07.11
3주차  (0) 2024.07.11
3주차 수요일  (0) 2024.07.11
2주차  (0) 2024.07.06

Inception code

파이썬정복
|2024. 7. 17. 04:58
Inception V3

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="3"   
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, models, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np
import time
import copy
from tqdm import tqdm
from sklearn.utils.class_weight import compute_class_weight

# Define the model and hyperparameters
BATCH_SIZE = 32
LEARNING_RATE = 1e-6
MOMENTUM = 0.9
NUM_EPOCHS = 50

# Data transformations
data_transforms = {
    'train': transforms.Compose([
        transforms.Resize((299, 299)),
        transforms.ToTensor()
    ]),
    'val': transforms.Compose([
        transforms.Resize((299, 299)),
        transforms.ToTensor()
    ]),
    'test': transforms.Compose([
        transforms.Resize((299, 299)),
        transforms.ToTensor()
    ]),
}

# Datasets
train_dataset = datasets.ImageFolder("~/datasets/train", transform=data_transforms['train'])
test_dataset = datasets.ImageFolder("~/datasets/test", transform=data_transforms['test'])
val_dataset = datasets.ImageFolder("~/datasets/val", transform=data_transforms['val'])

# Dataloaders
train_dataloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=4, drop_last=True)
test_dataloader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=4, drop_last=True)
val_dataloader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=4, drop_last=True)

# Device configuration
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# Calculate class weights
classes = train_dataset.classes
class_counts = np.bincount([label for _, label in train_dataset.samples])
class_weights = compute_class_weight(class_weight='balanced', classes=np.arange(len(classes)), y=[label for _, label in train_dataset.samples])
class_weights = torch.tensor(class_weights, dtype=torch.float).to(device)

# Load pretrained Inception V3 model
model = models.inception_v3(pretrained=True)
model.aux_logits = False

# Modify the final layer to match the number of classes
model.fc = nn.Linear(model.fc.in_features, 5)
model = model.to(device)

# Criterion and optimizer
criterion = nn.CrossEntropyLoss(weight=class_weights)
optimizer = optim.SGD(model.parameters(), lr=LEARNING_RATE, momentum=MOMENTUM)

# Training function with tqdm
def train_model(model, criterion, optimizer, num_epochs=25):
    since = time.time()
    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0

    train_losses, val_losses = [], []
    train_accuracies, val_accuracies = [], []

    for epoch in range(num_epochs):
        print(f'Epoch {epoch}/{num_epochs - 1}')
        print('-' * 10)

        # Training phase
        model.train()
        running_loss = 0.0
        running_corrects = 0

        for inputs, labels in tqdm(train_dataloader, desc='Training', leave=False):
            inputs = inputs.to(device)
            labels = labels.to(device)

            optimizer.zero_grad()

            outputs = model(inputs)
            _, preds = torch.max(outputs, 1)
            loss = criterion(outputs, labels)

            loss.backward()
            optimizer.step()

            running_loss += loss.item() * inputs.size(0)
            running_corrects += torch.sum(preds == labels.data)

        epoch_loss = running_loss / len(train_dataset)
        epoch_acc = running_corrects.double() / len(train_dataset)

        train_losses.append(epoch_loss)
        train_accuracies.append(epoch_acc.cpu().numpy())

        print(f'Train Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')

        # Validation phase
        model.eval()
        running_loss = 0.0
        running_corrects = 0

        with torch.no_grad():
            for inputs, labels in tqdm(val_dataloader, desc='Validation', leave=False):
                inputs = inputs.to(device)
                labels = labels.to(device)

                outputs = model(inputs)
                _, preds = torch.max(outputs, 1)
                loss = criterion(outputs, labels)

                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)

        epoch_loss = running_loss / len(val_dataset)
        epoch_acc = running_corrects.double() / len(val_dataset)

        val_losses.append(epoch_loss)
        val_accuracies.append(epoch_acc.cpu().numpy())

        print(f'Val Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')

        # Deep copy the model
        if epoch_acc > best_acc:
            best_acc = epoch_acc
            best_model_wts = copy.deepcopy(model.state_dict())

        print()

    time_elapsed = time.time() - since
    print(f'Training complete in {time_elapsed // 60:.0f}m {time_elapsed % 60:.0f}s')
    print(f'Best val Acc: {best_acc:.4f}')

    # Load best model weights
    model.load_state_dict(best_model_wts)
    
    model_name = "Inception_V3"

    # Plot the loss graph
    plt.figure(figsize=(10, 5))
    plt.plot(train_losses, label='Training Loss', color='green')
    plt.plot(val_losses, label='Validation Loss', color='red')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    plt.title(f'{model_name} Training and Validation Loss\nEpochs: {NUM_EPOCHS}, LR: {LEARNING_RATE}')
    plt.savefig('training_validation_loss_e6.png')  # Save the plot
    plt.clf()  # Clear the plot


    # Plot the accuracy graph
    plt.figure(figsize=(10, 5))
    plt.plot(train_accuracies, label='Training Accuracy', color='blue')
    plt.plot(val_accuracies, label='Validation Accuracy', color='orange')
    plt.xlabel('Epochs')
    plt.ylabel('Accuracy')
    plt.legend()
    plt.title(f'{model_name} Training and Validation Accuracy\nEpochs: {NUM_EPOCHS}, LR: {LEARNING_RATE}')
    plt.savefig('training_validation_accuracy_e6.png')  # Save the plot
    plt.clf()  # Clear the plot

    
    return model

# Train the model
model = train_model(model, criterion, optimizer, NUM_EPOCHS)

# Test the model
model.eval()
running_corrects = 0

with torch.no_grad():
    for inputs, labels in tqdm(test_dataloader, desc='Testing', leave=False):
        inputs = inputs.to(device)
        labels = labels.to(device)

        outputs = model(inputs)
        _, preds = torch.max(outputs, 1)
        running_corrects += torch.sum(preds == labels.data)

test_acc = running_corrects.double() / len(test_dataset)
print(f'Test Acc: {test_acc:.4f}')

'해외경험 > UNLV' 카테고리의 다른 글

ResNet code  (0) 2024.07.17
ResNET50이 뭘까  (0) 2024.07.11
3주차  (0) 2024.07.11
3주차 수요일  (0) 2024.07.11
2주차  (0) 2024.07.06

ResNET50이 뭘까

파이썬정복
|2024. 7. 11. 03:20

CIFAR-10

ResNet-50은 이미지 분류에 뛰어난 합성곱 신경망(CNN)입니다. 마치 사진을 분석하고, 그 안의 사물과 장면을 식별하고, 그에 따라 분류할 수 있는 고도로 훈련된 이미지 분석가와 같습니다.

 

ResNet 아키텍처는 ResNet-18, ResNet-32 등 다양한 깊이로 제공되며 ResNet-50은 중간 크기의 변형입니다

 

ResNet이 해결한 주요 문제는 딥 신경망의 저하 문제였습니다. 네트워크가 깊어짐에 따라 정확도가 포화되고 급격히 저하됩니다. 이러한 저하가 과적합으로 인해 발생하는 것이 아니라 학습 과정을 최적화하는 데 어려움이 있기 때문입니다.

 

ResNet은 스킵 연결을 통해 정보가 직접 흐를 수 있도록 하는 잔여 블록을 사용하여 이 문제를 해결하고, 사라지는 그래디언트 문제를 완화했습니다. ResNet-50에서 사용되는 잔여 블록은 Bottleneck Residual Block이라고 합니다. 

ReLU Activation: The ReLU (Rectified Linear Unit) activation function is applied after each convolutional layer and the batch normalization layers. ReLU는 양수 값만 통과시키며, 네트워크에 비선형성을 도입하여 데이터의 복잡한 패턴을 학습할 수 있게 합니다.

the block consists of three convolutional layers with batch normalization and ReLU activation 

  • 첫 번째 합성곱 계층은 1x1 필터 크기를 사용하고 입력 데이터의 채널 수를 줄일 가능성이 높습니다. 이 차원 감소는 너무 많은 정보를 희생하지 않고도 데이터를 압축하고 계산 효율성을 개선하는 데 도움이 됩니다.
  • 두 번째 합성곱 계층은 3x3 필터 크기를 사용하여 데이터에서 공간적 특징을 추출할 수 있습니다.
  • 세 번째 합성곱 계층은 출력이 바로가기 연결에 추가되기 전에 원래 채널 수를 복원하기 위해 다시 1x1의 필터 크기를 사용합니다.

차원과 채널의 차이?

컬러 이미지는 채널이 보통 3개 RGB

 

차원(demension)

  • 데이터나 텐서의 구조를 나타내는 더 일반적인 용어입니다.
  • 이미지 처리에서는 주로 높이, 너비, 채널을 포함한 3차원을 다룹니다.
  • 예: 224x224x3 이미지는 채널이 3개이다
  • 텐서는 matrix여러개 - 고차원의 데이터를 담을 수 있는 유형

 


vanishing gradient

가중치를 새로 만들때 

갱신이 안돼 -> 깊어지면 깊어질수록 0.5애서 시작 점점 학습할 수록 0.5*0.0001 점점 사라짐

 

파라미터 개수는 많아지지만 기울기 감소 -> 의미없어지는 모델 

 

어떻게 기울기 감소를 없앨까?

x를 통과 후 결과 에서 X를 빼면 

흐릿한 이미지와 뚜렷한 이미지가 있을텐데

resicual 잔차가 남아

뚜렷한 이미지가 너무 파라미터가 많아

대신 잔차로 해서 계산을 줄인다. -> vanishing gradient문제가 사라진다

https://daeun-computer-uneasy.tistory.com/28

 

[CV] ResNet - Residual Connection(잔차연결)

📊📈논문 참조 0. 등장 배경 VGG16, 19 : 3*3 filter를 이용해 레이어의 깊이를 늘려 우수한 성능을 보였다. 특히 CNN 계열에서 레이어가 깊어지면 특징이 더 풍부해지기 때문에, CV 분야에서의 네트워

daeun-computer-uneasy.tistory.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'해외경험 > UNLV' 카테고리의 다른 글

ResNet code  (0) 2024.07.17
Inception code  (0) 2024.07.17
3주차  (0) 2024.07.11
3주차 수요일  (0) 2024.07.11
2주차  (0) 2024.07.06