์ ๋ชฉ | ์ํ | ๋น๊ณ |
---|---|---|
๊ฐ์ ๋ฐ์ ๋ณด | ์ ์ถ ์๋ฃ | ๊นํ๋ธ |
from PIL import Image
import os, glob
print("PIL ๋ผ์ด๋ธ๋ฌ๋ฆฌ import ์๋ฃ!")
####################################
def resize_images(img_path):
images=glob.glob(img_path + "/*.jpg")
print(len(images), " images to be resized.")
# ํ์ผ๋ง๋ค ๋ชจ๋ 28x28 ์ฌ์ด์ฆ๋ก ๋ฐ๊พธ์ด ์ ์ฅํฉ๋๋ค.
target_size=(28,28)
for img in images:
old_img=Image.open(img)
new_img=old_img.resize(target_size,Image.ANTIALIAS)
new_img.save(img, "JPEG")
print(len(images), " images resized.")
# ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ ๋๋ ํ ๋ฆฌ ์๋์ ๋ชจ๋ jpg ํ์ผ์ ์ฝ์ด๋ค์ฌ์
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/scissor"
resize_images(image_dir_path)
print("๊ฐ์ ์ด๋ฏธ์ง resize ์๋ฃ!")
####################################
def resize_images(img_path):
images=glob.glob(img_path + "/*.jpg")
print(len(images), " images to be resized.")
# ํ์ผ๋ง๋ค ๋ชจ๋ 28x28 ์ฌ์ด์ฆ๋ก ๋ฐ๊พธ์ด ์ ์ฅํฉ๋๋ค.
target_size=(28,28)
for img in images:
old_img=Image.open(img)
new_img=old_img.resize(target_size,Image.ANTIALIAS)
new_img.save(img, "JPEG")
print(len(images), " images resized.")
# ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ ๋๋ ํ ๋ฆฌ ์๋์ ๋ชจ๋ jpg ํ์ผ์ ์ฝ์ด๋ค์ฌ์
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/rock"
resize_images(image_dir_path)
print("๋ฐ์ ์ด๋ฏธ์ง resize ์๋ฃ!")
#######################################
def resize_images(img_path):
images=glob.glob(img_path + "/*.jpg")
print(len(images), " images to be resized.")
# ํ์ผ๋ง๋ค ๋ชจ๋ 28x28 ์ฌ์ด์ฆ๋ก ๋ฐ๊พธ์ด ์ ์ฅํฉ๋๋ค.
target_size=(28,28)
for img in images:
old_img=Image.open(img)
new_img=old_img.resize(target_size,Image.ANTIALIAS)
new_img.save(img, "JPEG")
print(len(images), " images resized.")
# ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ ๋๋ ํ ๋ฆฌ ์๋์ ๋ชจ๋ jpg ํ์ผ์ ์ฝ์ด๋ค์ฌ์
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/paper"
resize_images(image_dir_path)
print("๋ณด ์ด๋ฏธ์ง resize ์๋ฃ!")
#########################################
import numpy as np
def load_data(img_path, number_of_data=1500): # ๊ฐ์๋ฐ์๋ณด ์ด๋ฏธ์ง ๊ฐ์ ์ดํฉ์ ์ฃผ์ํ์ธ์.
# ๊ฐ์ : 0, ๋ฐ์ : 1, ๋ณด : 2
img_size=28 # ์ด๋ฏธ์ง ์ฌ์ด์ฆ 28
color=3
#์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๋ผ๋ฒจ(๊ฐ์ : 0, ๋ฐ์ : 1, ๋ณด : 2) ๋ฐ์ดํฐ๋ฅผ ๋ด์ ํ๋ ฌ(matrix) ์์ญ์ ์์ฑํฉ๋๋ค.
imgs=np.zeros(number_of_data*img_size*img_size*color,dtype=np.int32).reshape(number_of_data,img_size,img_size,color)
labels=np.zeros(number_of_data,dtype=np.int32)
idx=0
for file in glob.iglob(img_path+'/scissor/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # ๋ฐ์ดํฐ ์์ญ์ ์ด๋ฏธ์ง ํ๋ ฌ์ ๋ณต์ฌ
labels[idx]=0 # ๊ฐ์ : 0
idx=idx+1
for file in glob.iglob(img_path+'/rock/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # ๋ฐ์ดํฐ ์์ญ์ ์ด๋ฏธ์ง ํ๋ ฌ์ ๋ณต์ฌ
labels[idx]=1 # ๋ฐ์ : 1
idx=idx+1
for file in glob.iglob(img_path+'/paper/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # ๋ฐ์ดํฐ ์์ญ์ ์ด๋ฏธ์ง ํ๋ ฌ์ ๋ณต์ฌ
labels[idx]=2 # ๋ณด : 2
idx=idx+1
print("ํ์ต๋ฐ์ดํฐ(x_train)์ ์ด๋ฏธ์ง ๊ฐ์๋", idx,"์
๋๋ค.")
return imgs, labels
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper"
(x_train, y_train)=load_data(image_dir_path)
x_train_norm = x_train/255.0 # ์
๋ ฅ์ 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ ๊ทํ
print("x_train shape: {}".format(x_train.shape))
print("y_train shape: {}".format(y_train.shape))
PIL ๋ผ์ด๋ธ๋ฌ๋ฆฌ import ์๋ฃ!
500 images to be resized.
500 images resized.
๊ฐ์ ์ด๋ฏธ์ง resize ์๋ฃ!
500 images to be resized.
500 images resized.
๋ฐ์ ์ด๋ฏธ์ง resize ์๋ฃ!
500 images to be resized.
500 images resized.
๋ณด ์ด๋ฏธ์ง resize ์๋ฃ!
ํ์ต๋ฐ์ดํฐ(x_train)์ ์ด๋ฏธ์ง ๊ฐ์๋ 1500 ์
๋๋ค.
x_train shape: (1500, 28, 28, 3)
y_train shape: (1500,)
import tensorflow as tf
from tensorflow import keras
import numpy as np
# ํ์ผ๋ง๋ค ๋ชจ๋ 28x28 ์ฌ์ด์ฆ๋ก ๋ฐ๊พธ์ด ์ ์ฅํฉ๋๋ค.
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(16, (3, 3), activation = 'relu', input_shape = (28, 28, 3)))
model.add(keras.layers.MaxPool2D(2, 2))
model.add(keras.layers.Conv2D(32, (3, 3), activation = 'relu'))
model.add(keras.layers.MaxPool2D(2, 2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(32, activation = 'relu'))
model.add(keras.layers.Dense(3, activation = 'softmax'))
# model.summary()
####################################################
model.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics = ['accuracy'])
model.fit(x_train_norm, y_train, epochs=17)
Epoch 1/17
47/47 [==============================] - 0s 3ms/step - loss: 0.9557 - accuracy: 0.6020
Epoch 2/17
47/47 [==============================] - 0s 3ms/step - loss: 0.5563 - accuracy: 0.8300
Epoch 3/17
47/47 [==============================] - 0s 3ms/step - loss: 0.2634 - accuracy: 0.9360
Epoch 4/17
47/47 [==============================] - 0s 3ms/step - loss: 0.1432 - accuracy: 0.9573
Epoch 5/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0790 - accuracy: 0.9800
Epoch 6/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0499 - accuracy: 0.9920
Epoch 7/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0440 - accuracy: 0.9873
Epoch 8/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0242 - accuracy: 0.9980
Epoch 9/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0137 - accuracy: 0.9993
Epoch 10/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0113 - accuracy: 1.0000
Epoch 11/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0077 - accuracy: 1.0000
Epoch 12/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0068 - accuracy: 1.0000
Epoch 13/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0048 - accuracy: 1.0000
Epoch 14/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0039 - accuracy: 1.0000
Epoch 15/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0041 - accuracy: 1.0000
Epoch 16/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0039 - accuracy: 0.9993
Epoch 17/17
47/47 [==============================] - 0s 3ms/step - loss: 0.0022 - accuracy: 1.0000
<keras.callbacks.History at 0x7febce5bb040>
def resize_images(img_path):
images=glob.glob(img_path + "/*.jpg")
# print(len(images), " images to be resized.")
# ํ์ผ๋ง๋ค ๋ชจ๋ 28x28 ์ฌ์ด์ฆ๋ก ๋ฐ๊พธ์ด ์ ์ฅํฉ๋๋ค.
target_size=(28,28)
for img in images:
old_img=Image.open(img)
new_img=old_img.resize(target_size,Image.ANTIALIAS)
new_img.save(img, "JPEG")
#. print(len(images), " images resized.")
# ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋ ๋๋ ํ ๋ฆฌ ์๋์ ๋ชจ๋ jpg ํ์ผ์ ์ฝ์ด๋ค์ฌ์
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/test/scissor"
resize_images(image_dir_path)
# print("๊ฐ์ ์ด๋ฏธ์ง resize ์๋ฃ!")
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/test/rock"
resize_images(image_dir_path)
# print("๋ฐ์ ์ด๋ฏธ์ง resize ์๋ฃ!")
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/test/paper"
resize_images(image_dir_path)
# print("๋ณด ์ด๋ฏธ์ง resize ์๋ฃ!")
def load_data(img_path, number_of_data=300): # ๊ฐ์๋ฐ์๋ณด ์ด๋ฏธ์ง ๊ฐ์ ์ดํฉ์ ์ฃผ์ํ์ธ์.
# ๊ฐ์ : 0, ๋ฐ์ : 1, ๋ณด : 2
img_size=28 # ์ด๋ฏธ์ง ์ฌ์ด์ฆ 28
color=3
#์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๋ผ๋ฒจ(๊ฐ์ : 0, ๋ฐ์ : 1, ๋ณด : 2) ๋ฐ์ดํฐ๋ฅผ ๋ด์ ํ๋ ฌ(matrix) ์์ญ์ ์์ฑํฉ๋๋ค.
imgs=np.zeros(number_of_data*img_size*img_size*color,dtype=np.int32).reshape(number_of_data,img_size,img_size,color)
labels=np.zeros(number_of_data,dtype=np.int32)
idx=0
for file in glob.iglob(img_path+'/scissor/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # ๋ฐ์ดํฐ ์์ญ์ ์ด๋ฏธ์ง ํ๋ ฌ์ ๋ณต์ฌ
labels[idx]=0 # ๊ฐ์ : 0
idx=idx+1
for file in glob.iglob(img_path+'/rock/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # ๋ฐ์ดํฐ ์์ญ์ ์ด๋ฏธ์ง ํ๋ ฌ์ ๋ณต์ฌ
labels[idx]=1 # ๋ฐ์ : 1
idx=idx+1
for file in glob.iglob(img_path+'/paper/*.jpg'):
img = np.array(Image.open(file),dtype=np.int32)
imgs[idx,:,:,:]=img # ๋ฐ์ดํฐ ์์ญ์ ์ด๋ฏธ์ง ํ๋ ฌ์ ๋ณต์ฌ
labels[idx]=2 # ๋ณด : 2
idx=idx+1
# print("์ํ๋ฐ์ดํฐ(x_test)์ ์ด๋ฏธ์ง ๊ฐ์๋", idx,"์
๋๋ค.")
return imgs, labels
image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/test"
(x_test, y_test)=load_data(image_dir_path)
x_test_norm = x_test/255.0 # ์
๋ ฅ์ 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ ๊ทํ
# print("x_test shape: {}".format(x_test.shape))
# print("y_test shape: {}".format(y_test.shape))
################################################
test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=1)
print("test_loss: {} ".format(test_loss))
print("test_accuracy: {}".format(test_accuracy))
10/10 [==============================] - 0s 2ms/step - loss: 997.1900 - accuracy: 0.6500
test_loss: 997.1900024414062
test_accuracy: 0.6499999761581421
Exploration 01 ํ๊ฐ
๊ฒฐ๊ณผ์ ๋ฆฌ
์ ํ๋ ๋ถ๋ถ
Dense, Epoch, Conv2D ๋ฑ ํ์ดํผํ๋ผ๋ฏธํฐ์ ๊ฐ ๋ณ๊ฒฝํ์์ผ๋ ์๋ฌด๋ฆฌ ๋๊ฒ ๋์๋ 40%๋ฅผ ๋์ง ๋ชปํ๋ ๊ฒ์ผ๋ก ๋์๋ค.
๋จผ์ ์ฝ๋ณผ๋ฃจ์
๋ ์ด์ด์ ๊ฐ์ 32 64๋ก ์กฐ์ ํ์์ผ๋ ์ ํ๋๊ฐ ์คํ๋ ค ๋จ์ด์ง๋ ํ์์ด ๋ํ๋ฌ๋ค.
๊ฐ์ 16, 32๋ก ๋ค์ ์์ ํ๊ณ Epoch๊ฐ์ ๋ณ๊ฒฝํ์์ ๋ ์ ํ๋์ ๋ณํ๊ฐ ์๊ฒผ๋ค.
์ต๋ 40ํ๊น์ง ๋ณ๊ฒฝํ์์ผ๋ 20์ ๋์์ ๊ฐ์ฅ ๋์ ๊ฐ์ด ๋์์ผ๋ 40%๋ฅผ ๋์ง ๋ชปํ๊ณ Epoch ๊ฐ์ ๋ ์ฌ๋ฆด์๋ก ์คํ๋ ค ๋จ์ด์ง๋ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฌ๋ค.
์ด๋ฐํ ๊ฒฐ๊ณผ๋ฅผ ํตํด ์ง๋์น ํ์ต๋๊ณผ ์ด๊ธฐ ๊ฐ์ ๋ง์ด ์ฃผ์์๋ ์คํผํผํ ์ด ๋ํ๋๋ค๋ ๊ฒ์ ์์ ์์๋ค.
์ฝ๋ณผ๋ฃจ์
๋ ์ด์ด ์์น๋ฅผ ๋ฎ๊ฒ ํจ์ผ๋ก ์ค๋ฒํผํ
์ ์ค์ผ ์ ์์์ผ๋ฉฐ. Epoch ์ญ์ ์ง๋์น๊ฒ ์ค์ํ๋ฉด ์ค๋ฒํผํ
์ด ๋ํ๋๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ์ด์์ ์ํฉ์ผ๋ก ์ ํ๋๋ฅผ ๋์ด๊ธฐ ์ํด ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ 28์์ 150์ผ๋ก ๋์์ ๋ ์ ํ๋๊ฐ ํฌ๊ฒ ์์นํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์๋ค.
28 ์ฌ์ด์ฆ ์ผ๋ ํ์ต์ฉ ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด๋ณด๋ฉด ์ฌ๋์ธ ๋ด๊ฐ ๋ด๋ ์์๋ณด๊ธฐ ์ด๋ ค์ธ ์ ๋๋ก ์ด๋ฏธ์ง๊ฐ ๋ญ๊ฐ์ง๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.
๋ํ ๋ฐฐ๊ฒฝ์ ์์๊ณผ ๊ตฌ๋ถ์ด ์ด๋ ค์ ์ผ๋ฉฐ ์ด๊ฒ์ด ์ ํ๋๋ฅผ ๋จ์ด๋จ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ง ์์๋ ์ถ์ธก๋๋ค.
์ด๋ฌํ ์๊ฐ์ ๋ฐ๋ผ ์ด๋ฏธ์ง์ ํด์๋๋ฅผ ๋์ด๋ ๊ฒฐ์ ์ ํ์์ผ๋ฉฐ ๊ฒฐ๊ณผ๋ ๋ง์กฑํ ๋งํ ์์ค์ ์๋์์ผ๋ ์ ํ๋์ ํฅ์์ด ์์๋ค.
์ด๋ฌํ ๊ฒฐ๊ณผ๋ก ๋ณผ๋ ๋ฐ์ดํฐ์ ํ์ง์ด ํ์ต์ ํฐ ์ํฅ์ ๋ผ์น๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ฑฐ๋ ์์ฑํ ๋ ๋ฐฐ๊ฒฝ์ ๋จ์์ผ๋ก ์กฐ์ ํ๊ณ ๋์์ฒด์ ์ปจํธ๋ผ์คํธ๋ฅผ ๋์ด๋ฉด ๋ง์กฑํ ๋งํ ์ ํ๋๊ฐ ๋์ค์ง ์์๊น ์ถ์ธก๋๋ค.
์ง๋ํ์ต์ ๊ฒฝ์ฐ ํนํ ํ๋ จ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ์ ํ์ง์ ์ ๊ฒฝ์ธ ํ์๊ฐ ์์ ๊ฒ ๊ฐ๋ค.
์ฝ๋ฉ๋ถ๋ถ
ํด๋์ค์ ๋ํ ํ์ต์ด ๋ถ์กฑํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฐ๋ณต๋ ํจ์์ ์ฌ์ฉ์ด ๋ง์ ๋ฐ ์ด๋ฌํ ๋ถ์ค์ ํด๋์ค๋ฅผ ํ์ฉํ์ฌ ์ฝ๋์ ์์ ์ค์ผ ์ ์์ ๊ฑฐ๋ผ ์๊ฐํ์์ผ๋ ํด๋์ค๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํ ๋๋ง๋ค ๋ชจ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ์ฌ๋ฌ๊ฐ์ง ์ด๋ ค์์ ๊ฒช์๋ค.
์ฝ๋๊ฐ ๊ต์ฅํ ๊ธดํธ์ธ๋ฐ ํด๋์ค๋ง ์ ๋๋ก ํ์ฉํ ์ ์๋ค๋ฉด ์ฝ๋์ ๊ธธ์ด๋ฅผ ๋ฐ ์ดํ๋ก ์ค์ผ ์ ์์ง ์์ ๊น ์๊ฐ๋๋ค.
์ฝ๋๊ฐ ๊ธธ๊ฒ ๋์จ ์ด์ ์ค ํ๋๋ก ์ค๊ฐ ์ค๊ฐ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์๊น ์๊ฐ๋์ด ์ค๊ฐ ๊ฒฐ๊ณผ๊ฐ์ ํ๋ฆฐํธํด์ฃผ๊ณ ํ์ธํ๋ฉด์ ์งํํ ๊ฒ ๋๋ฌธ๋ ์๋ค.
ํด๋์ค ๊ธฐ๋ฅ๊ณผ ํด๋์ค ์์ for๋ฌธ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ธธ์ด๋ฅผ ์ค์ผ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
์์ผ๋ก ์งํํ๋ฉด์ ์ด ๋ถ๋ถ์ ๋ณด์ํด์ผ ํ ๊ฒ์ด๋ค.
๊ถ๊ธํ ์
์ด๋ฏธ์ง ํด์๋๋ฅผ 150์ผ๋ก ๋์ฌ ์ ํ๋๊ฐ ์ฌ๋ผ๊ฐ๋๋ฐ
์ฝ๋๋ฅผ ์ฌ์คํํ ์๋ก ์ ํ๋๊ฐ ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์๋์๋ค.
1. ์ฒ์ ์ ํ๋๋ 61%์ ๋ ๋์๋๋ฐ ์ฝ๋๋ฅผ ํ์ธํ๊ธฐ ์ํด
์ฌ์คํํ๋ ๊ณผ์ ์์ Accuracy๊ฐ ๋จ์ด์ง๋ ํ์์ด ๋ํ๋๊ณ 40%๋์ ์๋ ดํจ.
โ ์ด๊ฑด ๋๋์ฒด ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์.
2.์ฃผํผํฐ ๋
ธํธ๋ถ ๋ด์์ ์ฌ์คํํ๋ ๊ฒ์ด ์ธ๊ณต์ง๋ฅ ํ์ต์ ์ํฅ์ ์ฃผ๋ ์ง.
3.์ฝ๋ ๊ธธ์ด๋ฅผ ์ค์ด๊ธฐ ์ํด ํด๋์ค๋ฅผ ์ฌํธ์ถํ๋ ๊ณผ์ ์์ ์์์๋ ์๋ฌ๊ฐ ๋ํ๋๋ ํ์.
์ถ๊ฐ ์ค์ ๋ณ๊ฒฝ
1. Train ๋ฐ์ดํฐ๋ฅผ 1500์ฅ์ผ๋ก ๋๋ฆฌ๊ณ ํด์๋๋ฅผ ๋ฎ์ถ๋ ๊ฒ์ผ๋ก ๋ ๋์ ์ ํ๋๋ฅผ ์ป๊ฒ ๋์๋ค.
์์ง???
์ด๋ฏธ์ง ํด์๋ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ๋๋ฐ
์ด๋ฏธ์ง ํด์๋๋ฅผ ๋ฎ์ถ์์ ๋ ์คํ๋ ค ์ ํ๋๊ฐ ์ฌ๋ผ๊ฐ๋ ์ํฉ์ด ๋ ๊ฒ์...
์ด๋ฏธ์ง ํด์๋๋ฅผ ๋ฎ์ถค์ผ๋ก ์คํ๋ ค ์ค๋ฒํผํ ์ ๋ง๋ ํจ๊ณผ๊ฐ ๋์๋ค๊ณ ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
๋จ์ํ๊ฒ ํด์๋๋ฅผ ๋์ธ๋ค๊ณ ํด์ ๋์์ง๋ ๊ฒ์ ์๋๊ณ
๋ค๋ฅธ ๊ฐ์ ์กฐ์ ํ๋ ๊ฒ๋ณด๋ค Epoch๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ํ๋๋ฅผ ๋์ด๋ ๋ฐ ๋ ๋์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.