ํ์ดํ ์น๋ฅผ ์ฌ์ฉํด์ ๋ฉํฐ ํผ์ ํธ๋ก ๊ตฌํํ๊ธฐ !
iris ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ๋ถ๊ฝ์ ์ข ๋ฅ๋ฅผ ๋ถ๋ฅํด๋ณด์ ~
PyTorch
PyTorch๋ Python์ ์ํ ์คํ์์ค ๋จธ์ ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ !
GPU์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์๋๊ฐ ์๋นํ ๋น ๋ฅด๋ค
ํ์ดํ ์น๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋
1. ํ์ด์ฌ๊ณผ ์ ์ฌํด์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๋ค
2. ์ค์ ๊ณผ ์คํ์ด ๋งค์ฐ ์ฝ๋ค
3. ๋ฅ๋ฌ๋์ ๋ฐฐ์ฐ๊ธฐ ์ฝ๋ค
4. ์ฐ๊ตฌ์๋ ๋ง์ด ์ฌ์ฉ๋๋ค
๋ฑ ~
IRIS ๋ฐ์ดํฐ์
๋ถ๊ฝ์ ๋ํ ๋ฐ์ดํฐ !
๊ฝ๋ฐ์นจ์ ๊ธธ์ด, ๋๋น์ ๊ฝ์์ ๊ธธ์ด, ๋๋น์ ๋ํ 4์ฐจ์ ๋ฐ์ดํฐ์ด๋ค
1. PyTorch ์ค์น
์ผ๋จ ๋ด ๊ฐ๋ฐํ๊ฒฝ์ ๋งฅ์ด๊ธฐ ๋๋ฌธ์ mac ๊ธฐ์ค์ผ๋ก ์งํ
์๋์ฝ๋ค ์ค์น๋ฅผ ํด์ค๋๋ค
๋งฅ์ anaconda power shell์ด ๋ฐ๋ก ์๊ณ cmd์ฐฝ์ด (base)๊ฐ ๋ถ์ผ๋ฉด ํ์ฑํ๋ ๊ฒ !
๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ๊ณผ ์๋์ฝ๋ค์ ๋ฒ์ ์ ํ์ธํด์ค๋๋ค
๋ค์์ผ๋ก๋ conda๋ก ํ์ดํ ์น๋ฅผ ์ค์น !
conda install pytorch torchvision torchaudio -c pytorch
์ํจ๋๋ก.. ๋ช ๋ น ์คํ !
์ ๋๋ก ์ค์น๋๋์ง ํ์ธ์ ํด๋ณด๋ฉด..!
์ํ PyTorch ์ฝ๋๋ฅผ ์คํํด์ ์์๋ก ์ด๊ธฐํ๋ ํ ์๋ฅผ ๊ตฌ์ฑ ~
2. ๋ชจ๋ธ์ ๋ํ ๋ฐ์ดํฐ ์ค์
๋ฐ์ดํฐ์ ๋ค์ด
Fisher์ ๋ถ๊ฝ ๋ฐ์ดํฐ ์ธํธ์์ ๋ชจ๋ธ์ ํ์ต !
์ด ๋ฐ์ดํฐ์ ์๋ ๋ถ์ฑ๋ถ๊ฝ(Iris setosa), ๋ฒ์์ปฌ๋ฌ ๋ถ๊ฝ(Iris versicolor) ๋ฐ ๋ฒ์ง๋์นด ๋ถ๊ฝ(Iris virginica)์ ์ธ ๊ฐ์ง ๋ถ๊ฝ ์ข ๊ฐ๊ฐ์ ๋ํ 50๊ฐ์ ๋ ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋ค๊ณ ํจ
์ฐ์ IRIS ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ผ๋ก ์ ์ฅ
๋ถ๊ฝ์ ๋ค ๊ฐ์ง ํน์ง๊ณผ ์ข ๋ฅ๊ฐ ์์ !
ํจํค์ง ์์ธ์ค
import torch
import pandas as pd
import torch.nn as nn
from torch.utils.data import random_split, DataLoader, TensorDataset
import torch.nn.functional as F
import numpy as np
import torch.optim as optim
from torch.optim import Adam
ํ์ด์ฌ ๋ฐ์ดํฐ ๋ถ์์ ์ฌ์ฉ๋๋ pandas ํจํค์ง๋ ์ด์ฉํด torch.nn ํจํค์ง(๋ฐ์ดํฐ ๋ฐ ์ ๊ฒฝ๋ง ๊ตฌ์ถ์ ์ํ ๋ชจ๋๊ณผ ํ์ฅ ๊ฐ๋ฅํ ํด๋์ค๊ฐ ํฌํจ) ๋ก๋
๋ฐ์ดํฐ์ ๋ก๋
๋ฐ์ดํฐ ๋ก๋ -> ํด๋์ค ์ ํ์ธ
# Loading the Data
df = pd.read_excel(r'C:…\Iris_dataset.xlsx')
print('Take a look at sample from the dataset:')
print(df.head())
# Let's verify if our data is balanced and what types of species we have
print('\nOur dataset is balanced and has the following values to predict:')
print(df['Iris_Type'].value_counts())
์ฌ๊ธฐ์ ๋๋ Iris_dataset.xlsx ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ด ํ๊ฒฝ์ ๋ง๊ฒ ์์ ํด์ฃผ์๋ค
์จ์ ~
๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ๊ณ ๋ชจ๋ธ์ ํ์ตํ๊ธฐ ์ํด ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ์ ์ ์ํด์ค๋ค
์ ๋ ฅ์๋ 150๊ฐ์ ํน์ง์ด ํฌํจ๋์ด ์๊ณ , ์ถ๋ ฅ์ ๋ถ๊ฝ ์ข ๋ฅ ์ด์ด๋ค
์ฌ์ฉํ ์ ๊ฒฝ๋ง์๋ ์ซ์ ๋ณ์๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅ ๋ณ์๋ฅผ ์ซ์ ํ์์ผ๋ก ๋ณํํ๋ค
์ซ์ ํ์์ผ๋ก ์ถ๋ ฅ ํ์ & ๋ฐ์ดํฐ์ ์ ์ ์ด ์ถ๊ฐ
# Convert Iris species into numeric types: Iris-setosa=0, Iris-versicolor=1, Iris-virginica=2.
labels = {'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2}
df['IrisType_num'] = df['Iris_Type'] # Create a new column "IrisType_num"
df.IrisType_num = [labels[item] for item in df.IrisType_num] # Convert the values to numeric ones
# Define input and output datasets
input = df.iloc[:, 1:-2] # We drop the first column and the two last ones.
print('\nInput values are:')
print(input.head())
output = df.loc[:, 'IrisType_num'] # Output Y is the last column
print('\nThe output value is:')
print(output.head())
์ฌ๊ธฐ์ ๋ชจ๋ธ์ ํ์ตํ๊ธฐ ์ํด์ ๋ชจ๋ธ ์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ํ์์ผ๋ก ํ ์๋ก ๋ณํํด์ค๋ค
ํ ์๋ก ๋ณํ
# Convert Input and Output data to Tensors and create a TensorDataset
input = torch.Tensor(input.to_numpy()) # Create tensor of type torch.float32
print('\nInput format: ', input.shape, input.dtype) # Input format: torch.Size([150, 4]) torch.float32
output = torch.tensor(output.to_numpy()) # Create tensor type torch.int64
print('Output format: ', output.shape, output.dtype) # Output format: torch.Size([150]) torch.int64
data = TensorDataset(input, output) # Create a torch.utils.data.TensorDataset object for further data manipulation
์ ๋ ฅ ๊ฐ์ 150๊ฐ์ด๊ณ , ์ด ์ค 60%๋ ๋ชจ๋ธ ํ์ต ๋ฐ์ดํฐ, ์ ํจ์ฑ ๊ฒ์ฌ(val) 20%, ํ ์คํธ(test) 30%๋ก ๋๋ ์ค๋ค
๋ฐ์ดํฐ ๋ถํ
# Split to Train, Validate and Test sets using random_split
train_batch_size = 10
number_rows = len(input) # The size of our dataset or the number of rows in excel table.
test_split = int(number_rows*0.3)
validate_split = int(number_rows*0.2)
train_split = number_rows - test_split - validate_split
train_set, validate_set, test_set = random_split(
data, [train_split, validate_split, test_split])
# Create Dataloader to read the data within batch sizes and put into memory.
train_loader = DataLoader(train_set, batch_size = train_batch_size, shuffle = True)
validate_loader = DataLoader(validate_set, batch_size = 1)
test_loader = DataLoader(test_set, batch_size = 1)
3. PyTorch ๋ชจ๋ธ ํ์ต
์ ๊ฒฝ๋ง ์ ์
์ฌ๊ธฐ์๋ ์ธ ๊ฐ์ ์ ํ ๊ณ์ธต์ ์ฌ์ฉํด ๊ธฐ๋ณธ ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ๋น๋ !
Linear -> ReLU -> Linear -> ReLU -> Linear
Linear : ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ์ ํ ๋ณํ ์ ์ฉ, ํด๋์ค ์์ ํด๋นํ๋ ์ ๋ ฅ, ์ถ๋ ฅ ์๋ฅผ ์ง์ ํด์ผ ํจ
ReLU : ๋ค์ด์ค๋ ๋ชจ๋ ๊ธฐ๋ฅ์ 0 ์ด์์ผ๋ก ์ ์ํ๋ ํ์ฑํ ํจ์, 0๋ณด๋ค ์์ ์ซ์๋ 0์ผ๋ก ๋ณ๊ฒฝ๋๊ณ ๋๋จธ์ง๋ ์ ์ง
-> ๋ ๊ฐ์ ๊ณ์ธต์ ํ์ฑํ ๊ณ์ธต์ ์ ์ฉํ๊ณ ๋ง์ง๋ง ์ ํ ๊ณ์ธต์์๋ ํ์ฑํ๋ฅผ ์ ์ฉํ์ง ์์
๋ชจ๋ธ์ ๋งค๊ฐ ๋ณ์ + ์ ๊ฒฝ๋ง ์ ์
๋ชจ๋ธ์ ๋งค๊ฐ ๋ณ์๋ ๋ชฉํ์ ํ์ต ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค
์ ๋ ฅ ํฌ๊ธฐ๋ ๋ชจ๋ธ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง (iris ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ 4)
iris ๋ฐ์ดํฐ์ ์ถ๋ ฅ ํฌ๊ธฐ๋ 3 (์ธ ๊ฐ์ง ์ข ๋ฅ์ ๋ถ๊ฝ)
3๊ฐ์ ์ ํ ๊ณ์ธต((4,24) -> (24,24) -> (24,3))์ด ์๋ ๋คํธ์ํฌ์๋ 744๊ฐ์ ๊ฐ์ค์น(96+576+72)๊ฐ ์์
lr(ํ์ต ์๋)์ ์์ค ๊ทธ๋ ์ด๋์ธํธ์ ๊ด๋ จํ์ฌ ๋คํธ์ํฌ์ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ๋ ์ ๋์ ๋ํ ์ ์ด๋ฅผ ์ค์
์ด ๊ฐ์ด ๋ฎ์์๋ก ํ์ต ์๋๊ฐ ๋๋ ค์ง -> ์ฌ๊ธฐ์๋ 0.01๋ก ์ค์
ํ์ต ์ค ๋ชจ๋ ๊ณ์ธต์ ํตํด ์ ๋ ฅ ์ฒ๋ฆฌ -> ์์ค ๊ณ์ฐ -> ์์ธก ๋ ์ด๋ธ๊ณผ ์ฌ๋ฐ๋ฅธ ๋ ์ด๋ธ์ ๋ค๋ฅธ ์ ๋ณด ํ์ -> ๊ทธ๋ ์ด๋์ธํธ๋ฅผ ๋คํธ์ํฌ์ ์ฌ์ ํ -> ๊ณ์ธต ๊ฐ์ค์น ์ ๋ฐ์ดํธ => ๋ฐฉ๋ํ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ ๋ฐ๋ณตํด ๊ฐ์ค์น ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ํ์ต
์ ๋ฐฉํฅ ํจ์๋ ์์ค ํจ์์ ๊ฐ์ ๊ณ์ฐ + ์ญ๋ฐฉํฅ ํจ์๋ ํ์ต ๊ฐ๋ฅํ ๋งค๊ฐ ๋ณ์์ ๊ทธ๋ ์ด๋์ธํธ ๊ณ์ฐ
pytorch๋ฅผ ์ฌ์ฉํด ์ ๊ฒฝ๋ง์ ๋ง๋๋ ๊ฒฝ์ฐ ์ ๋ฐฉํฅ ํจ์๋ง ์ ์ (์ญ๋ฐฉํฅ ํจ์๋ ์๋์ผ๋ก ์ ์๋จ)
๋ชจ๋ธ์ ๋งค๊ฐ ๋ณ์์ ์ ๊ฒฝ๋ง์ ์ ์ํด์ค๋๋ค
# Define model parameters
input_size = list(input.shape)[1] # = 4. The input depends on how many features we initially feed the model. In our case, there are 4 features for every predict value
learning_rate = 0.01
output_size = len(labels) # The output is prediction results for three types of Irises.
# Define neural network
class Network(nn.Module):
def __init__(self, input_size, output_size):
super(Network, self).__init__()
self.layer1 = nn.Linear(input_size, 24)
self.layer2 = nn.Linear(24, 24)
self.layer3 = nn.Linear(24, output_size)
def forward(self, x):
x1 = F.relu(self.layer1(x))
x2 = F.relu(self.layer2(x1))
x3 = self.layer3(x2)
return x3
# Instantiate the model
model = Network(input_size, output_size)
์คํ ๋๋ฐ์ด์ค ์ ์
PC์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์คํ ๋๋ฐ์ด์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ ๋๋ฐ์ด์ค๋ฅผ ์ ์
๋๋ฐ์ด์ค๋ Nvidia GPU๊ฐ ์ปดํจํฐ์ ์์ผ๋ฉด Nvidia GPU๊ฐ ๋๊ณ , ์์ผ๋ฉด CPU๋ก ์ค์ ๋จ
# Define your execution device
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("The model will be running on", device, "device\n")
model.to(device) # Convert model parameters and buffers to CPU or Cuda
๋ชจ๋ธ ์ ์ฅ
# Function to save the model
def saveModel():
path = "./NetModel.pth"
torch.save(model.state_dict(), path)
์์ค ํจ์ ์ ์
์์ค ํจ์๋ ์ถ๋ ฅ์ด ๋์๊ณผ ๋ค๋ฅธ ์ ๋๋ฅผ ์์ธกํ๋ ๊ฐ์ ๊ณ์ฐ
์ฃผ์ ๋ชฉํ๋ ์ ๊ฒฝ๋ง์ ์ญ๋ฐฉํฅ ์ ํ๋ฅผ ํตํด ๊ฐ์ค์น ๋ฒกํฐ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ ์์ค ํจ์์ ๊ฐ์ ์ค์ด๋ ๊ฒ !
์์ค ๊ฐ์ ๋ชจ๋ธ ์ ํ๋์ ๋ค๋ฆ! ์์ค ํจ์๋ ํ์ต ์ธํธ์์ ์ต์ ํ๋ฅผ ๋ฐ๋ณตํ ๋๋ง๋ค ๋ชจ๋ธ์ด ์ผ๋ง๋ ์ ์๋ํ๋์ง ๋ํ๋
(๋ชจ๋ธ์ ์ ํ๋๋ ํ ์คํธ ๋ฐ์ดํฐ์์ ๊ณ์ฐ๋๋ฉฐ ์ ํํ ์์ธก์ ๋ฐฑ๋ถ์จ)
์ฌ๊ธฐ์๋ ๋ถ๋ฅ์ ์ต์ ํ๋ ๊ธฐ์กด ํจ์๋ฅผ ์ฌ์ฉ, Classification Cross-Entropy ์์ค ํจ์์ Adam ์ต์ ํ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ
์ต์ ํ ํ๋ก๊ทธ๋จ์์ lr(ํ์ต ์๋)์ ์์ค ๊ทธ๋ ์ด๋์ธํธ์ ๊ด๋ จํ์ฌ ๋คํธ์ํฌ์ ๊ฐ์ค์น๋ฅผ ์กฐ์ ํ๋ ์ ๋์ ๋ํ ์ ์ด๋ฅผ ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ 0.001๋ก ์ค์
# Define the loss function with Classification Cross-Entropy loss and an optimizer with Adam optimizer
loss_fn = nn.CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=0.001, weight_decay=0.0001)
๋ชจ๋ธ ํ์ต
ํ์ต ์ธํธ์ ๊ฑธ์น ๋ชจ๋ Epoch ๋๋ ๋ชจ๋ ์ ์ฒด ๋ฐ๋ณต์ ๋ํด ํ์ต ์์ค, ์ ํจ์ฑ ๊ฒ์ฌ ์์ค ๋ฐ ๋ชจ๋ธ์ ์ ํ๋๋ฅผ ํ์
๊ฐ์ฅ ๋์ ์ ํ๋๋ก ๋ชจ๋ธ์ ์ ์ฅํ๊ณ 10๋ฒ์ Epoch ํ์ ํ๋ก๊ทธ๋จ์ด ์ต์ข ์ ํ๋๋ฅผ ํ์
# Training Function
def train(num_epochs):
best_accuracy = 0.0
print("Begin training...")
for epoch in range(1, num_epochs+1):
running_train_loss = 0.0
running_accuracy = 0.0
running_vall_loss = 0.0
total = 0
# Training Loop
for data in train_loader:
#for data in enumerate(train_loader, 0):
inputs, outputs = data # get the input and real species as outputs; data is a list of [inputs, outputs]
optimizer.zero_grad() # zero the parameter gradients
predicted_outputs = model(inputs) # predict output from the model
train_loss = loss_fn(predicted_outputs, outputs) # calculate loss for the predicted output
train_loss.backward() # backpropagate the loss
optimizer.step() # adjust parameters based on the calculated gradients
running_train_loss +=train_loss.item() # track the loss value
# Calculate training loss value
train_loss_value = running_train_loss/len(train_loader)
# Validation Loop
with torch.no_grad():
model.eval()
for data in validate_loader:
inputs, outputs = data
predicted_outputs = model(inputs)
val_loss = loss_fn(predicted_outputs, outputs)
# The label with the highest value will be our prediction
_, predicted = torch.max(predicted_outputs, 1)
running_vall_loss += val_loss.item()
total += outputs.size(0)
running_accuracy += (predicted == outputs).sum().item()
# Calculate validation loss value
val_loss_value = running_vall_loss/len(validate_loader)
# Calculate accuracy as the number of correct predictions in the validation batch divided by the total number of predictions done.
accuracy = (100 * running_accuracy / total)
# Save the model if the accuracy is the best
if accuracy > best_accuracy:
saveModel()
best_accuracy = accuracy
# Print the statistics of the epoch
print('Completed training batch', epoch, 'Training Loss is: %.4f' %train_loss_value, 'Validation Loss is: %.4f' %val_loss_value, 'Accuracy is %d %%' % (accuracy))
ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ชจ๋ธ ํ ์คํธ
๋ ๊ฐ์ ํ ์คํธ ํจ์๋ฅผ ์ถ๊ฐ
์ฒซ ๋ฒ์งธ๋ ์ด์ ํํธ์์ ์ ์ฅํ ๋ชจ๋ธ์ ํ ์คํธ
45๊ฐ ํญ๋ชฉ์ ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ๋ก ๋ชจ๋ธ์ ํ ์คํธํ๊ณ ๋ชจ๋ธ์ ์ ํ๋๋ฅผ ์ถ๋ ฅ
๋ ๋ฒ์งธ๋ ์ธ ๊ฐ์ง ๋ถ๊ฝ ์ข ์ค์์ ๊ฐ ์ข ์ ์ฑ๊ณต์ ์ผ๋ก ๋ถ๋ฅํ๋ ํ๋ฅ ์ ์์ธกํ๋ ๋ชจ๋ธ์ ์ ๋ขฐ๋๋ฅผ ํ ์คํธํ๋ ์ ํ์ ํจ์
# Function to test the model
def test():
# Load the model that we saved at the end of the training loop
model = Network(input_size, output_size)
path = "NetModel.pth"
model.load_state_dict(torch.load(path))
running_accuracy = 0
total = 0
with torch.no_grad():
for data in test_loader:
inputs, outputs = data
outputs = outputs.to(torch.float32)
predicted_outputs = model(inputs)
_, predicted = torch.max(predicted_outputs, 1)
total += outputs.size(0)
running_accuracy += (predicted == outputs).sum().item()
print('Accuracy of the model based on the test set of', test_split ,'inputs is: %d %%' % (100 * running_accuracy / total))
# Optional: Function to test which species were easier to predict
def test_species():
# Load the model that we saved at the end of the training loop
model = Network(input_size, output_size)
path = "NetModel.pth"
model.load_state_dict(torch.load(path))
labels_length = len(labels) # how many labels of Irises we have. = 3 in our database.
labels_correct = list(0. for i in range(labels_length)) # list to calculate correct labels [how many correct setosa, how many correct versicolor, how many correct virginica]
labels_total = list(0. for i in range(labels_length)) # list to keep the total # of labels per type [total setosa, total versicolor, total virginica]
with torch.no_grad():
for data in test_loader:
inputs, outputs = data
predicted_outputs = model(inputs)
_, predicted = torch.max(predicted_outputs, 1)
label_correct_running = (predicted == outputs).squeeze()
label = outputs[0]
if label_correct_running.item():
labels_correct[label] += 1
labels_total[label] += 1
label_list = list(labels.keys())
for i in range(output_size):
print('Accuracy to predict %5s : %2d %%' % (label_list[i], 100 * labels_correct[i] / labels_total[i]))
๋ง์ง๋ง์ผ๋ก, ์ฃผ ์ฝ๋๋ฅผ ์ถ๊ฐ
๋ชจ๋ธ ํ์ต์ด ์์, ๋ชจ๋ธ ์ ์ฅ, ๊ฒฐ๊ณผ๊ฐ ํ๋ฉด์ ํ์
ํ์ต ์ธํธ์ ๋ํด ๋ ๋ฒ์ ๋ฐ๋ณต([num_epochs = 25])๋ง ์คํ -> ํ์ต ํ๋ก์ธ์ค๊ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ์ง ์์
if __name__ == "__main__":
num_epochs = 10
train(num_epochs)
print('Finished Training\n')
test()
test_species()
๊ฒฐ๊ณผ..!
์.. ์ ๋ ์ ์ด๋์....................
์ง์ณค๋๋ค....
์.. ๋ด๊ฐ ์ฐธ๊ณ ํ ๊ธ์์๋ ์์ ํ์ผ์์ #๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ผ์๊ธธ๋ ์ ๋ ฌํ๊ณ ๋ค์ ๋๋ ธ๋๋..
๊ทผ๋ฐ ์ฌ๋ฌ ๋ฒ ๋๋ฆฌ๋ฉด ์น์น ๋ณํด ์์ฃผ..
์ด์ฐจํผ ์ ํํ๋๋ฐ ์ด๊ฒ ๋ฌด์จ ์์ฉ์ด๋
์๋๋ ๋ด๊ฐ ์ฐธ๊ณ ํ ๊ธ
๊ฐ์ฌํฉ๋๋ค... ๋๋ถ์ ์๋ฉ์ด ๋ถ์ด๊ณ ๊ธ ์ฝ๊ณ ๋ฐ๋ผํ๊ธฐ๋ง ํ๋๋ฐ ์์ด๋ฆฌ์ค ๋ถ๋ฅ ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ๋ ํ์ด์..
๋ ๋ฒ์งธ ์ข ๋ฅ ์ ํ๋๋ 0%์ด์ง๋ง...
์๋ ๊ธ์ ๋ญ๊ฐ ๋์์ด ๋ ๊ฒ ๊ฐ์์ ๊ฐ์ ธ์๋ดค๋ค ๋์ค์ ์ด๊ฑธ๋ก ํด๋ด์ผ์ง
์ฌ์ค ๋๋ฒ์งธ ๊ธ๋ ๋ฐ๋ผ์ ํด๋ดค๋๋ฐ (์ ๋๋ก ๊ณต๋ถํ์ง ์์๋๋ค)
's t u d y . . ๐ง > AI ์ค ML ์ค DL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ML ์ด๋ก ] ๊ธฐ๊ณํ์ต์ด๋ (0) | 2023.05.01 |
---|---|
[NLP | BERT & SBERT] Cross-Encoder์ Bi-Encoder (0) | 2023.04.27 |
[Transfer Learning] ์ ์ดํ์ต ๊ฐ๋ (1) | 2022.10.08 |
[YOLOv5] ํ์ต๋ ๋ชจ๋ธ๋ก ์ด๋ฏธ์ง test ํ ํ ํ์ผ์ ์ ์ฅํ๊ธฐ (0) | 2022.10.08 |
[YOLOv5] YOLOv5 ์ฌ์ฉ๋ฒ (1) | 2022.10.07 |