구글이 2011년에 개발하여 2015년에 오픈 소스로 공개한 기계학습 라이브러리로 딥러닝과 기계학습 분야를 일반인들도 사용하기 쉽도록 다양한 기능들을 제공한다.
TensorFlow2 Sequential Model 예시
import tensorflow as tf from tensorflow import keras model = keras.Sequential() model.add(__넣고싶은 레이어__) model.add(__넣고싶은 레이어__) model.add(__넣고싶은 레이어__) model.fit(x, y, epochs=10, batch_size=32)
Sequential model을 사용하면 손쉽게 딥러닝 모델을 쌓아나갈 수 있으며 입력부터 출력까지 레이어를 순차적(sequential)으로 차곡차곡 쌓아나가면 되어 초보자가 접근하기에 매우 쉽다는 장점이 있다. 하지만 입력과 출력이 여러 개인 경우에는 적합아지 않으며 반드시 1입력 1출력을 전제로 한다.
1-1. TensorFlow2 Sequential Model로 모델 작성
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] # 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 = keras.Sequential([ keras.layers.Conv2D(32, 3, activation='relu'), keras.layers.Conv2D(64, 3, activation='relu'), keras.layers.Flatten(), keras.layers.Dense(128, activation='relu'), keras.layers.Dense(10, 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)
📄Output
TensorFlow2 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)
TensorFlow2 Sequential Model과 TensorFlow2 Functional API의 차이점은 keras.Model을 사용한다는 점으로 Sequential Model을 사용하는 것 보다 더 일반적인 접근으로 훨씬 자유로운 모델링을 진행할 수 있다. TensorFlow2 Functional API는 입력과 출력을 규정함으로써 모델 전체를 규정한다는 것을 전제로 하여 입력(Input)과 출력(Output)만으로 모델을 규정한다.
TensorFlow2 Functional API로 모델 작성
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] # Functional Model 구성 """ 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.summary() # 모델 학습 설정 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)
📄Output
TensorFlow2 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)
TensorFlow2 Subclassing은 3가지의 모델중 가장 자유로운 모델링이 가능하며 keras.Model을 상속받은 모델 클래스를 만드는 것으로 __init__() 이라는 메서드 안에서 레이어를 구성하고 정의한다. 그리고 call()이라는 메서드 안에서 레이어 간 순전파(forward propagation)를 구현하므로 각 레이어에 대한 깊은 이해가 필요하고 초심자에게는 의도치 않은 버그를 유발할 수 있다.
3-1 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)) # Subclassing Model 구성 """ 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 CustomModel(keras.Model): def __init__(self): super(CustomModel, self).__init__() self.conv1 = keras.layers.Conv2D(32, 3, activation = 'relu') self.conv2 = keras.layers.Conv2D(64, 3, activation = 'relu') self.flatten = keras.layers.Flatten() self.dense1 = keras.layers.Dense(128, activation = 'relu') self.dense2 = keras.layers.Dense(10, activation = 'softmax') def call(self, x): x = self.conv1(x) x = self.conv2(x) x = self.flatten(x) x = self.dense1(x) x = self.dense2(x) return x model = CustomModel() # 모델 학습 설정 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)
📄Output
머신러닝용 이미지 분류 데이터셋으로 머신러닝과 컴퓨터 비전 알고리즘에 사용되는 32*32 크기의 6만개의 이미지로 이루어진 100개의 클래스로 분류되어 있는 데이터 셋이다.
4-1. CIFAR-100을 이용한 Sequential API
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 # 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 = keras.Sequential([ keras.layers.Conv2D(16, 3, activation='relu'), keras.layers.MaxPool2D(2,2), keras.layers.Conv2D(32, 3, activation='relu'), keras.layers.MaxPool2D(2,2), keras.layers.Flatten(), keras.layers.Dense(256, activation='relu'), 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)
📄Output
4-2. CIFAR-100을 이용한 Functional API
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
Functional API Model을 구성
"""
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 = keras.Input(shape=(32, 32, 3))
x = keras.layers.Conv2D(16, 3, activation='relu')(inputs)
x = keras.layers.MaxPool2D(2,2)(x)
x = keras.layers.Conv2D(32, 3, activation='relu')(x)
x = keras.layers.MaxPool2D(2,2)(x)
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(256, activation='relu')(x)
outputs = keras.layers.Dense(100, 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)
📄Output
4-3. CIFAR-100을 활용한 Subclassing
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 # Subclassing Model을 구성 """ 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 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() # 모델 학습 설정 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)
📄Output