ํ์ด์ฌ์ผ๋ก ๋ฅ๋ฌ๋ ๋ชจ๋ธ ์ ์ํ๊ธฐ
1. ๐ Depp Learning ๋ชจ๋ธ ์์ฑ ๋ฐฉ๋ฒ ์ธ๊ฐ์ง
Tensor flow V2 ๋ฒ์ ์์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ ์์ฑ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
- Sequential
- Functional : sequential ์ ์ผ๋ฐํ๋ ๊ฐ๋
- Model Subclassing : ํด๋์ค๋ก ๊ตฌํ๋ ๊ธฐ์กด ๋ชจ๋ธ์ ์์๋ฐ์ ์๊ธฐ ๋ชจ๋ธ ๋ง๋ค๊ธฐ
์์ฐจ์ ์ผ๋ก ์ด๋ค ์ฐจ์ด๊ฐ ์๊ณ ,
์ด๋ค ์์ผ๋ก ์ ์ํ๋์ง ์์๊ฐ๋ณด์.
1. Sequential Model
import tensorflow as tf
from tensorflow import keras
model = keras.Sequential()
model.add(__๋ฃ๊ณ ์ถ์ ๋ ์ด์ด__)
model.add(__๋ฃ๊ณ ์ถ์ ๋ ์ด์ด__)
model.add(__๋ฃ๊ณ ์ถ์ ๋ ์ด์ด__)
model.fit(x, y, epochs=20, batch_size=16)
epochs : ๋ชจ๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์ตํ ํ์
batch_size : ๋ฐ์ดํฐ๋ฅผ ์๋ถํด ๋ฃ์ ์
model = keras.Sequential() ์ ํ์ฉํ๋ฉด
๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ์์ ๋๊ฐ ์ ์๋ค.
์ ๋ ฅ๋ถํฐ ์ถ๋ ฅ๊น์ง ์์ฐจ์ (์ํ์ ) ์ผ๋ก add ํ๋ฉด ๋๋ค.
but, ๋ชจ๋ธ์ ์
๋ ฅ๊ณผ ์ถ๋ ฅ์ด ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ ํฉํ์ง ์๋ค.
(๋ฐ๋์ ์
๋ ฅ 1๊ฐ ์ถ๋ ฅ 1๊ฐ์ง ์ฌ์ผ ํจ)
2. Functional API
import tensorflow as tf
from tensorflow import keras
inputs = keras.Input(shape=(__์ํ๋ ์
๋ ฅ๊ฐ ๋ชจ์__))
x = keras.layers.__๋ฃ๊ณ ์ถ์ ๋ ์ด์ด__(๊ด๋ จ ํ๋ผ๋ฏธํฐ)(input)
x = keras.layers.__๋ฃ๊ณ ์ถ์ ๋ ์ด์ด__(๊ด๋ จ ํ๋ผ๋ฏธํฐ)(x)
outputs = keras.layers.__๋ฃ๊ณ ์ถ์ ๋ ์ด์ด__(๊ด๋ จ ํ๋ผ๋ฏธํฐ)(x)
model = keras.Model(inputs=inputs, outputs=outputs)
model.fit(x,y, epochs=10, batch_size=32)
model ์ ketas.Model ์ด ๋ค์ด๊ฐ๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ danse ๋ Flatten ๊ฐ์ ์ง์ฌ์ ธ ์๋ ์ ๊ฒฝ๋ง์ ์ฐ๋ ๊ฒ ์๋๋ผ
์ง์ input ๊ณผ output ์ ๊ตฌ์ฑํ๋ค.
๋๋ฌธ์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ๊ฐ์ด ์์ ๋กญ๋ค
๋ฅ ๋ฌ๋ ๋ชจ๋ธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ด์ด์ DAG Directed Acyclic graph ์ด๋ค.
๋ ์ด์ด์ ๊ทธ๋ํ๋ฅผ bulid ํ๋ค๋ ๋ป์ด๋ค.
3. Subclassing
import tensorflow as tf
from tensorflow import keras
class CustomModel(keras.Model):
def __init__(self):
super(CustomModel, self).__init__()
self.__์ ์ํ๊ณ ์ ํ๋ ๋ ์ด์ด__()
self.__์ ์ํ๊ณ ์ ํ๋ ๋ ์ด์ด__()
self.__์ ์ํ๊ณ ์ ํ๋ ๋ ์ด์ด__()
def call(self, x):
x = self.__์ ์ํ๊ณ ์ ํ๋ ๋ ์ด์ด__(x)
x = self.__์ ์ํ๊ณ ์ ํ๋ ๋ ์ด์ด__(x)
x = self.__์ ์ํ๊ณ ์ ํ๋ ๋ ์ด์ด__(x)
return x
model = CustomModel()
model.fit(x,y, epochs=10, batch_size=32)
์ ์ผ ์์ ๋ก์ด ๋ชจ๋ธ๋ง์ด ๊ฐ๋ฅํ subclassing
์ด๋ฅผ ๋ฐํ์ผ๋ก ์ง์ ๊ตฌํํด๋ณด์
import tensorflow as tf
from tensorflow import keras
import numpy as np
# ๋ฐ์ดํฐ ๊ตฌ์ฑ๋ถ๋ถ
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train=x_train[...,np.newaxis]
x_test=x_test[...,np.newaxis]
print(len(x_train), len(x_test))
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step
11501568/11490434 [==============================] - 0s 0us/step
60000 10000
2. ์ค์ ๊ตฌํ
1. Sequential model
# Sequential Model์ ๊ตฌ์ฑํด์ฃผ์ธ์.
"""
Spec:
1. 32๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
2. 64๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
3. Flatten ๋ ์ด์ด
4. 128๊ฐ์ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด relu์ธ Fully-Connected Layer(Dense)
5. ๋ฐ์ดํฐ์
์ ํด๋์ค ๊ฐ์์ ๋ง๋ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด softmax์ธ Fully-Connected Layer(Dense)
"""
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32,3,activation='relu'),
tf.keras.layers.Conv2D(32,3,activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10,activation='softmax')
])
"""
model.add.Conv2D(32, 3, activation="relu")
model.add.Conv2D(64, 3, activation="relu")
model.add.Flatten()
model.add.Dense(128, activation='relu')
model.add.Dense(10, activation='softmax')
"""
'\nmodel.add.Conv2D(32, 3, activation="relu")\nmodel.add.Conv2D(64, 3, activation="relu")\nmodel.add.Flatten()\nmodel.add.Dense(128, activation=\'relu\')\nmodel.add.Dense(10, activation=\'softmax\')\n'
# ๋ชจ๋ธ ํ์ต ์ค์
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Epoch 1/5
1875/1875 [==============================] - 31s 3ms/step - loss: 0.1118 - accuracy: 0.9654
Epoch 2/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0368 - accuracy: 0.9882
Epoch 3/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0211 - accuracy: 0.9933
Epoch 4/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0131 - accuracy: 0.9956
Epoch 5/5
1875/1875 [==============================] - 5s 3ms/step - loss: 0.0100 - accuracy: 0.9968
313/313 - 1s - loss: 0.0516 - accuracy: 0.9878
[0.051644984632730484, 0.9878000020980835]
2. Functional API
mnist = keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
x_train=x_train[...,np.newaxis]
x_test=x_test[...,np.newaxis]
print(len(x_train), len(x_test))
60000 10000
"""
Spec:
0. (28X28X1) ์ฐจ์์ผ๋ก ์ ์๋ Input
1. 32๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
2. 64๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
3. Flatten ๋ ์ด์ด
4. 128๊ฐ์ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด relu์ธ Fully-Connected Layer(Dense)
5. ๋ฐ์ดํฐ์
์ ํด๋์ค ๊ฐ์์ ๋ง๋ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด softmax์ธ Fully-Connected Layer(Dense)
"""
inputs = keras.Input(shape=(28,28,1))
x = keras.layers.Conv2D(32,3,activation='relu')(inputs)
x = keras.layers.Conv2D(64,3,activation='relu')(x)
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(128, activation='relu')(x)
outputs = keras.layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Epoch 1/5
1875/1875 [==============================] - 7s 3ms/step - loss: 0.1039 - accuracy: 0.9679
Epoch 2/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0339 - accuracy: 0.9895
Epoch 3/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0204 - accuracy: 0.9931
Epoch 4/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0130 - accuracy: 0.9959
Epoch 5/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0093 - accuracy: 0.9972
313/313 - 1s - loss: 0.0522 - accuracy: 0.9868
[0.05223735421895981, 0.9868000149726868]
3. Subclassing API
keras.models ๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ
- init ๋ฉ์๋์ ๋ ์ด์ด ์ ์ธ
- call() ๋ฉ์๋์ forward propagation ๋ฐฉ์ ์ฒด๊ณ ๊ตฌํ
"""
Spec:
0. keras.Model ์ ์์๋ฐ์์ผ๋ฉฐ, __init__()์ call() ๋ฉ์๋๋ฅผ ๊ฐ์ง ๋ชจ๋ธ ํด๋์ค
1. 32๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
2. 64๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
3. Flatten ๋ ์ด์ด
4. 128๊ฐ์ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด relu์ธ Fully-Connected Layer(Dense)
5. ๋ฐ์ดํฐ์
์ ํด๋์ค ๊ฐ์์ ๋ง๋ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด softmax์ธ Fully-Connected Layer(Dense)
6. call์ ์
๋ ฅ๊ฐ์ด ๋ชจ๋ธ์ Input, call์ ๋ฆฌํด๊ฐ์ด ๋ชจ๋ธ์ Output
"""
class kerasModel(keras.Model):
def __init__(self):
super().__init__()
self.Conv2D32 = keras.layers.Conv2D(32, 3, activation='relu')
self.Conv2D64 = keras.layers.Conv2D(64, 3, activation='relu')
self.Flatten = keras.layers.Flatten()
self.Dense128 = keras.layers.Dense(128, activation='relu')
self.Dense = keras.layers.Dense(10, activation='softmax')
def call(self, x):
x = self.Conv2D32(x)
x = self.Conv2D64(x)
x = self.Flatten(x)
x = self.Dense128(x)
output = self.Dense(x)
return output
model = kerasModel()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Epoch 1/5
1875/1875 [==============================] - 7s 3ms/step - loss: 0.1011 - accuracy: 0.9689
Epoch 2/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0339 - accuracy: 0.9893
Epoch 3/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0184 - accuracy: 0.9938
Epoch 4/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0136 - accuracy: 0.9954
Epoch 5/5
1875/1875 [==============================] - 6s 3ms/step - loss: 0.0078 - accuracy: 0.9973
313/313 - 1s - loss: 0.0581 - accuracy: 0.9853
[0.05812956392765045, 0.9853000044822693]
์ด๊ฑด ๊ฒฐ๋ก ์ ์ผ๋ก๋ model ์ ๊ฐ๋ค ์ฐ๋๊ฑฐ๋ผ์
input ์ ๋ฐ๋ก ์ค์ ์ํ๊ณ
๊ทธ๋ฆฌ๊ณ call ๋ฉ์๋๋ fit ํ ๋ ์๋์ผ๋ก ์จ์ง๋ ๋ฏ ํ๋ค.
3. CIFAR -100 ๋ฐ์ดํฐ ์์ ์ฌ์ฉํ๊ธฐ
1. Sequential
# ๋ฐ์ดํฐ ๊ตฌ์ฑ๋ถ๋ถ
cifar100 = keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar100.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
print(len(x_train), len(x_test))
50000 10000
# Sequential Model์ ๊ตฌ์ฑํด์ฃผ์ธ์.
"""
Spec:
1. 16๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
2. pool_size๊ฐ 2์ธ MaxPool ๋ ์ด์ด
3. 32๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
4. pool_size๊ฐ 2์ธ MaxPool ๋ ์ด์ด
5. 256๊ฐ์ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด relu์ธ Fully-Connected Layer(Dense)
6. ๋ฐ์ดํฐ์
์ ํด๋์ค ๊ฐ์์ ๋ง๋ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด softmax์ธ Fully-Connected Layer(Dense)
"""
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16,3,activation='relu'),
tf.keras.layers.MaxPool2D((2,2)),
tf.keras.layers.Conv2D(32,3,activation='relu'),
tf.keras.layers.MaxPool2D((2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256,activation='relu'),
tf.keras.layers.Dense(100,activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Epoch 1/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 2/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 3/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 4/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 5/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
313/313 - 1s - loss: nan - accuracy: 0.0100
[nan, 0.009999999776482582]
2. Functional
"""
Spec:
0. (32X32X3) ์ฐจ์์ผ๋ก ์ ์๋ Input
1. 16๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
2. pool_size๊ฐ 2์ธ MaxPool ๋ ์ด์ด
3. 32๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
4. pool_size๊ฐ 2์ธ MaxPool ๋ ์ด์ด
5. 256๊ฐ์ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด relu์ธ Fully-Connected Layer(Dense)
6. ๋ฐ์ดํฐ์
์ ํด๋์ค ๊ฐ์์ ๋ง๋ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด softmax์ธ Fully-Connected Layer(Dense)
"""
inputs = tf.keras.Input(shape=(32,32,3))
x = tf.keras.layers.Conv2D(16,3,activation='relu')(inputs)
x = tf.keras.layers.MaxPool2D((2,2))(x)
x = tf.keras.layers.Conv2D(32,3,activation='relu')(x)
x = tf.keras.layers.MaxPool2D((2,2))(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(256,activation='relu')(x)
outputs = tf.keras.layers.Dense(100,activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs = 5)
model.evaluate(x_test, y_test, verbose =2)
Epoch 1/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 2/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 3/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 4/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 5/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
313/313 - 1s - loss: nan - accuracy: 0.0100
[nan, 0.009999999776482582]
3. Subclass API
"""
Spec:
0. keras.Model ์ ์์๋ฐ์์ผ๋ฉฐ, __init__()์ call() ๋ฉ์๋๋ฅผ ๊ฐ์ง ๋ชจ๋ธ ํด๋์ค
1. 16๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
2. pool_size๊ฐ 2์ธ MaxPool ๋ ์ด์ด
3. 32๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ , ์ปค๋์ ํฌ๊ธฐ๊ฐ 3, activation function์ด relu์ธ Conv2D ๋ ์ด์ด
4. pool_size๊ฐ 2์ธ MaxPool ๋ ์ด์ด
5. 256๊ฐ์ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด relu์ธ Fully-Connected Layer(Dense)
6. ๋ฐ์ดํฐ์
์ ํด๋์ค ๊ฐ์์ ๋ง๋ ์์ํ ๋
ธ๋๋ฅผ ๊ฐ์ง๊ณ , activation function์ด softmax์ธ Fully-Connected Layer(Dense)
7. call์ ์
๋ ฅ๊ฐ์ด ๋ชจ๋ธ์ Input, call์ ๋ฆฌํด๊ฐ์ด ๋ชจ๋ธ์ Output
"""
class kerasModel(keras.Model):
def __init__(self):
super().__init__()
self.Conv2D16 = keras.layers.Conv2D(16, 3, activation='relu')
self.Conv2D32 = keras.layers.Conv2D(32, 3, activation='relu')
self.Maxpool = keras.layers.MaxPool2D((2,2))
self.Flatten = keras.layers.Flatten()
self.Dense256 = keras.layers.Dense(256, activation='relu')
self.Dense = keras.layers.Dense(10, activation='softmax')
def call(self, x):
x = self.Conv2D16(x)
x = self.Maxpool(x)
x = self.Conv2D32(x)
x = self.Maxpool(x)
x = self.Flatten(x)
x = self.Dense256(x)
output = self.Dense(x)
return output
model = kerasModel()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
Epoch 1/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 2/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 3/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 4/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
Epoch 5/5
1563/1563 [==============================] - 5s 3ms/step - loss: nan - accuracy: 0.0100
313/313 - 1s - loss: nan - accuracy: 0.0100
[nan, 0.009999999776482582]
์ฐ๋ฆฌ๋ model.compile ์ ์์ด์ ๊ณ์ ๋์ผํ ๊ตฌ์ฑ์ ์ ์งํ๋ค.
์ ์ ์ธ๊ณต์ง๋ฅ ํ์ต ๊ณผ์ ์ ๋ณต๊ธฐํด๋ณด์.
- Forward Propagation
- Loss ๊ฐ ๊ณ์ฐ
- ์ค๊ฐ ๋ ์ด์ด ๊ฐ ๋ฐ loss ๋ฅผ ํ์ฉํ chain rule ๋ฐฉ์์ Back propagation
- parameter update
- repeat
์ด๋ฐ ๊ณผ์ ์ด tf v2 ์์๋ fit ์ ๋ค ๋ด๊ฒจ์๋ค.
tf.gredient tape ๋ propagation ๋์ ์งํ๋๋ ๋ชจ๋ ์ฐ์ฐ์ ์ค๊ฐ ๋ ์ด์ด ๊ฐ์
tape ์ ๊ธฐ๋กํ๋ค.
์ด๋ฅผ ์ด์ฉํด gredient ๋ฅผ ๊ณ์ฐํ๊ณ tape ๋ฅผ ํ๊ธฐํ๋ค.
์ฐ๋ฆฌ๋ ์ด tape ๊ฐ์ ์ด์ฉํด ๊ณ ๊ธ๊ธฐ๋ฒ์ ์ด์ฉํ ์ ์๋ค.
import tensorflow as tf
from tensorflow import keras
# ๋ฐ์ดํฐ ๊ตฌ์ฑ๋ถ๋ถ
cifar100 = keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar100.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
print(len(x_train), len(x_test))
# ๋ชจ๋ธ ๊ตฌ์ฑ๋ถ๋ถ
class CustomModel(keras.Model):
def __init__(self):
super().__init__()
self.conv1 = keras.layers.Conv2D(16, 3, activation='relu')
self.maxpool1 = keras.layers.MaxPool2D((2,2))
self.conv2 = keras.layers.Conv2D(32, 3, activation='relu')
self.maxpool2 = keras.layers.MaxPool2D((2,2))
self.flatten = keras.layers.Flatten()
self.fc1 = keras.layers.Dense(256, activation='relu')
self.fc2 = keras.layers.Dense(100, activation='softmax')
def call(self, x):
x = self.conv1(x)
x = self.maxpool1(x)
x = self.conv2(x)
x = self.maxpool2(x)
x = self.flatten(x)
x = self.fc1(x)
x = self.fc2(x)
return x
model = CustomModel()
50000 10000
์ง๊ธ๊น์ง๋
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
์์ ์์์ loss ๋ฅผ ํตํด ํ์ต ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํ ์ ์๊ฒ ํด์ฃผ์๋ค.
์ด๋ฒ์๋ tape.gradient() ๋ฅผ ํตํด์
๋งค ์คํ
๋ง๋ค ๋ฐ์ํ๋ gredient ๋ฅผ export,
optimizer.apply_grediens() ๋ฅผ ํตํด ๋ฐ์ํ gredient ๊ฐ
model.trainable_variables ๋ฅผ ํตํด ํ๋ผ๋ฏธํฐ๋ฅผ ์
๋ฐ์ดํฐ ํ๋๋ก ํ๋ค.
loss_func = tf.keras.losses.SparseCategoricalCrossentropy()
optimizer = tf.keras.optimizers.Adam()
# tf.GradientTape()๋ฅผ ํ์ฉํ train_step
def train_step(features, labels):
with tf.GradientTape() as tape:
predictions = model(features)
loss = loss_func(labels, predictions)
gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(gradients, model.trainable_variables))
return loss
์์ train_step ๋ฉ์๋๊ฐ ๋ฐ๋ก
fit ์ ํตํด 1๋ฒ epoch ํ๋ ๋์์ ์์์ ์ด๋ฃจ์ด์ง๋ steps ๋ค์ ์งํ๋ฐฉ์์ ๋ํ๋ธ๊ฒ.
import time
def train_model(batch_size=32):
start = time.time()
for epoch in range(5):
x_batch = []
y_batch = []
for step, (x, y) in enumerate(zip(x_train, y_train)):
x_batch.append(x)
y_batch.append(y)
if step % batch_size == batch_size-1:
loss = train_step(np.array(x_batch, dtype=np.float32), np.array(y_batch, dtype=np.float32))
x_batch = []
y_batch = []
print('Epoch %d: last batch loss = %.4f' % (epoch, float(loss)))
print("It took {} seconds".format(time.time() - start))
train_model()
Epoch 0: last batch loss = 3.2522
Epoch 1: last batch loss = 2.6932
Epoch 2: last batch loss = 2.4441
Epoch 3: last batch loss = 2.3071
Epoch 4: last batch loss = 2.2136
It took 85.202951669693 seconds
์ ๋ ํจ์์ ์ฐ๊ณ์ฌ์ฉ์ด fit ๋ฉ์๋๋ฅผ ํ์ด ์ด ๊ฒ์ด๋ค.
์ฝ๊ฒ ๋งํ๋ฉด
๋ฐ์ดํฐ๋ค์ batch_size ๋งํผ ๋์ด์
๊ทธ ๋์ ๋งํผ์ x_train(feature) ๋ฅผ ๋ฃ์ด ๋ชจ๋ธ ์ ๊ฒฝ๋ง์ ๋ฃ๊ณ ๋๋ ค
์์ธกํ y_train ๊ฐ์ ๋ฐํํ๊ณ
์ค์ y_trian(label) ๊ฐ๊ณผ ์์ธกํ y_trian ๊ฐ์ ์์คํจ์(loss) ๋ฅผ ๋๋ ค
๊ทธ ์ถ๋ ฅ ๊ฐ์ผ๋ก Back propagation ์ ํตํด ๋ชจ๋ธ ๋ด๋ถ ๊ฐ์ค์น๋ฅผ ์๋ก์ด ๊ฐ์ค์น๋ก update
์ ๊ทธ๋ผ ์์ค๊ฐ์ ํ 1epochs ์ ๋ฐฐ์น์ฌ์ด์ฆ ๋๋ฆฐ๋งํผ ๋์ค๊ฒ ์ง?
(์์ ๊ฒฝ์ฐ 32๋ฐฐ์น์ฌ์ด์ฆ ์ด๋ฏ๋ก ๋ฐ์ดํฐ๊ฐ 100๊ฐ๋ฉด ํ epochs ๋น loss ๊ฐ 3๊ฐ ๋์ค์ง)
ํ์ง๋ง ์ถ๋ ฅ๋๋ loss ๋ ๋งจ ๋ง์ง๋ง ๋ฐฐ์น์ loss ์ด๋ค.
์ด ๊ณผ์ ์ epoch ํ์ ๋งํผ ๋ฐ๋ณตํ๋ ๊ฒ์ด๋ค.
์ด๊ฒ fit ๋ฉ์๋๊ฐ ํ๋ ์ผ.
์ด๊ฑธ ๊ตณ์ด ๋์ง์ด๋ด์ ๋ณด๋ ์ด์ ๋
์ฐ๋ฆฌ๊ฐ ๊ฐํํ์ต ๋๋ GAN ์ ์ํํ ๋ ์ด ๋ด๋ถ train_step ์ ์ฌ๊ตฌ์ฑ์ ํด์ผ ํ๋ฏ๋ก!!!!!
prediction = model.predict(x_test, batch_size=x_test.shape[0], verbose=1)
temp = sum(np.squeeze(y_test) == np.argmax(prediction, axis=1))
temp/len(y_test) # Accuracy
1/1 [==============================] - 1s 822ms/step
git push -u origin my-branch-xman227
0.346
์ผ๋จ epoch ํด๋ดฃ์ผ๋ ๊ฒฐ๊ณผ๊ฐ๋ ์ด๋ ๊ฒ ๋์ถ์ด ๋๋ค.