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 ๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ

  1. init ๋ฉ”์„œ๋“œ์— ๋ ˆ์ด์–ด ์„ ์–ธ
  2. 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 ์— ์žˆ์–ด์„œ ๊ณ„์† ๋™์ผํ•œ ๊ตฌ์„ฑ์„ ์œ ์ง€ํ–ˆ๋‹ค.

์ž ์‹œ ์ธ๊ณต์ง€๋Šฅ ํ•™์Šต ๊ณผ์ •์„ ๋ณต๊ธฐํ•ด๋ณด์ž.

  1. Forward Propagation
  2. Loss ๊ฐ’ ๊ณ„์‚ฐ
  3. ์ค‘๊ฐ„ ๋ ˆ์ด์–ด ๊ฐ’ ๋ฐ loss ๋ฅผ ํ™œ์šฉํ•œ chain rule ๋ฐฉ์‹์˜ Back propagation
  4. parameter update
  5. 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 ํ•ด๋ดฃ์œผ๋‹ˆ ๊ฒฐ๊ณผ๊ฐ’๋„ ์ด๋ ‡๊ฒŒ ๋„์ถœ์ด ๋œ๋‹ค.