본문 바로가기
데이터 분석

DeepLearning_Depth(Tensorflow, Keras)

by JoinInNoetic 2024. 6. 30.

Input Layer ----> Hidden Layer ------> Output Layer

                     ^ 가중치    ^ sigmoid or relu       ^ softmax

 

◆ 임포트

import tensorflow as tf

tf.keras.utils.set_random_seed(42)

tf.config.experimental.enable_op_determinisim()    -> 모델의 일관성 보장

 

◆ 2개 층 설정

from tensorflow import keras

(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()    # 내장데이터 로드

from sklearn.model_selection import train_test_split

train_scaled = train_input / 255.0        # 이미지 데이터의 픽셀값을 0~1사이로 만들어 훈련을 더 효과적이게함

train_scaled = train_scaled.reshape(-1, 28*28)    # (샘플수,28,28) -> (샘플수,784) 로 변환 => 평탄화

train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)

 

● 히든 레이어 설정

딥러닝 절차

1) 층의 규칙(형태) 설정

dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))    # 784 : 28*28 

desne2 = keras.layersDense(10, activation='softmax')

 

2) 층의 규칙이 적용된 모델 생성

- 리스트 형태로 Sequential 함수에 dense 넘김

model = keras.Sequential([dense1, dense2])     # dense1 : hidden layer, dense2 : output layer

model.summary()    # 모델 개요 확인

* Param : 그림에서 선(다음 층의 노드와 연결하는 선)의 수(784*100 + 100) - 마지막 +100 : 노드에 붙는 activation function(활성함수)

 

※ 다른 방법

model = keras.Sequenctial([

    keras.layers.Dense(100, activation='sigmoid', input_shape=(784,), name='hidden'),

    keras.layers.Dense(10, activation='softmax', name='output')

], name='패션 MNIST 모델')

 

※ 만들어진 모델에 층을 추가하는 방법(가장 많이 사용됨)

model = keras.Sequential()

model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))

model.add(keras.layers.Dense(10, activation='softmax'))

 

3) 옵티마이저(컴파일러)

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

 

4) 훈련

model.fit(train_scaled, train_target, epochs=5)

◆ ReLU 활성화 함수 적용

- 은닉층의 활성화함수로 relu가 가장 많이 사용됨

model = keras.Sequential()

model.add(keras.layers.Flatten(input_shape=(28,28)))

model.add(keras.layers.Dense(100, activation='relu'))

model.add(keras.layers.Dense(10, activation='softmax'))

 

(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

train_scaled = train_input / 255.0

train_scaled, val_scaled, train_target, val_target = train_test_split(

                                                 train_scaled, train_target, test_size=0.2, random_state=42)

 

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

model.fit(train_scaled, train_target, epochs=5)

 

model.evaluate(val_scaled, val_target)

 

◆ 옵티마이저

- 층을 넘어갈 때 최적화 하는 방법

- ex: SGD, AdaGrad, Adam

- 딥러닝의 손실률 계산 알고리즘인 옵티마이저는 학습속도를 이와같이 수동으로 세팅하여야 함

model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy')

sgd = keras.optimizers.SGD(momentum=0.9, nesterov=True)    # sklearn에서 sgd와는 다름

# momentum : 관성, 가속화 되는 부분에 가중치를 줘서 더 빠르게 / nesterov : 받아들이는 것, 빠르게

# 현업에서는 SGD 느려서 잘 안씀

 

- Adagrad는 수동으로 속도를 조절할 필요가 없는 최적화 알고리즘

adagrad = keras.optimizers.Adagrad()

model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy')

 

- Adam

model = keras.Sequential()

model.add(keras.layers.Flatten(input_shape=(28,28)))

model.add(keras.layers.Dense(100, activation='relu'))

model.add(keras.layers.Dense(10, activation='softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

model.fit(train_scaled, train_target, epochs=5)

model.evaluate(val_scaled, val_target)