728x90

1. download the clone.bundle 

https://gerrit.googlesource.com/git-repo/clone.bundle

 

2. repo file 수정(나는 ~/bin/repo 에 두었다)

REPO_URL = os.environ.get('REPO_URL', None)
if not REPO_URL:
  #REPO_URL = 'https://gerrit.googlesource.com/git-repo'
  REPO_URL = '/home/bluelimn/work/clone.bundle'
REPO_REV = os.environ.get('REPO_REV')

이제 준비가 되었으면 repo init이나 sync 사용 가능

 

728x90
728x90

* 심층신경망

 - 2개 이상의 층을 포함한 신경망(다층 인공 신경망, 딥러닝)

* 렐루함수

 - 이미지 분류 모델의 은닉층에서 많이 사용하는 활성화 함수. 시그모이드 함수는 층이 많을수록 활성화 함수의 양쪽 끝에서 변화가 작기 때문에 학습이 어려워진다. 렐루함수는 이런 문제가 없으며 계산도 간단.

* 옵티마이저

 - 신망의 가중치와 절편을 학습하기 위한 알고리즘 또는 방법. 케라스에는 다양한 경사 하강법 알고리즘이 구현되어 있음. (SGD, 네스테로프 모멘텀, RMSprop, Adam)

 

package and method

* TensorFlow

 - add() : keras.layers 아래 있음. 호출하여 전달 한 순서대로 층이 차례대로 늘어남

 - summary() : 추가된 층의 종류/순서/parameter 개수를 출력. 층을 만들 때 name을 변수로 지정하면 구분이 쉽다

 - SGD : 기본 경사 하강법 옵티마이저 클래스

   : learning_rate : 학습률 지정 (default 0.01)

   : momentum : 0 이상의 값을 지정하면 모멘텀 최적화 수행

   : nesterov : True로 설정하면 네스테로프 모멘텀 최적화 수행

 - Adagrad

   : learning_rate : default 0.001

   : initial_accumulator_value : 그레이디언트 제곱을 누적하여 학습률을 나눔. 누적 추깃값을 지정할 수 있으며 default 0.1

 - RMSprop

   : learning_rate : default 0.001

   : rho : default 0.9 : Adagrad처럼 그레이디언트 제곱으로 학습률 나눔. 최근의 그레이디언트를 사용하기 위해 지수 감소를 사용

 - Adam

   : learning_rate : default 0.001

   : beta_1 : default 0.9 : 모멘텀 최적화에 있는 크레이디언트의 지수 감소 평균을 조절

   : beta_2 : default 0.999 : RMSprop에 있는 크레이디언트의 지수 감소 평균을 조절

 

심층 신경망

 

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
train_scaled = train_scaled.reshape(-1, 28*28)

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

dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz 32768/29515 [=================================] - 0s 0us/step 40960/29515 [=========================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz 26427392/26421880 [==============================] - 0s 0us/step 26435584/26421880 [==============================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz 16384/5148 [===============================================================================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz 4423680/4422102 [==============================] - 0s 0us/step 4431872/4422102 [==============================] - 0s 0us/step

 

픽셀값은 0~255 => 0~1로 변환

28*28의 2차원 배열을 784 크기의 1차원 배열로 변환

 

 

image array에서 784개의 특징이 10개로 줄어드는 과정에서 이번에는 은닉층이 추가되었다. 

출력층 활성화 함수

 - 이진 분류 : 시그모이드 함수를 많이 사용

 - 다중 분류 : 소프트맥스 함수 사용

은닉층 활성화 함수

 - 출력층보다 자유로움(시그모이드함수, 렐루 함수 등)

심층 신경망 만들기

model = keras.Sequential([dense1, dense2])
model.summary()

Model: "sequential_1" _________________________________________________________________

Layer (type) Output Shape Param # =================================================================

dense (Dense) (None, 100) 78500 dense_1 (Dense) (None, 10) 1010 =================================================================

Total params: 79,510 Trainable params: 79,510 Non-trainable params: 0 _________________________________________________________________

층을 추가하는 다른 방법

model = keras.Sequential([
    keras.layers.Dense(100, activation='sigmoid', input_shape=(784,), name='hidden'),
    keras.layers.Dense(10, activation='softmax', name='output')
], name='패션 MNIST 모델')

model.summary()

Model: "패션 MNIST 모델" _________________________________________________________________

Layer (type) Output Shape Param # =================================================================

hidden (Dense) (None, 100) 78500 output (Dense) (None, 10) 1010 =================================================================

Total params: 79,510 Trainable params: 79,510 Non-trainable params: 0 _________________________________________________________________

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

model.summary()

Model: "sequential_2" _________________________________________________________________

Layer (type) Output Shape Param # =================================================================

dense_2 (Dense) (None, 100) 78500 dense_3 (Dense) (None, 10) 1010 =================================================================

Total params: 79,510 Trainable params: 79,510 Non-trainable params: 0 _________________________________________________________________

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

model.fit(train_scaled, train_target, epochs=5)
Epoch 1/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.5681 - accuracy: 0.8076
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4077 - accuracy: 0.8526
Epoch 3/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3726 - accuracy: 0.8658
Epoch 4/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3504 - accuracy: 0.8728
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3341 - accuracy: 0.8788
에포크5번 동안 훈련을 진행했다.
추가된 층이 성능을 향상시키는 것을 볼 수 있다.

렐루 활성화 함수

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.summary()

Model: "sequential_3"

_________________________________________________________________

Layer (type)               Output  Shape                Param # =================================================================

flatten (Flatten)            (None, 784)                   0

dense_4 (Dense)          (None, 100)                   78500

dense_5 (Dense)          (None, 10)                    1010 =================================================================

Total params: 79,510

Trainable params: 79,510

Non-trainable params: 0

_________________________________________________________________

렐루함수는 0보다 작으면 0으로 만들고 양수면 그대로 출력

 

(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)
Epoch 1/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.5310 - accuracy: 0.8126
Epoch 2/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3963 - accuracy: 0.8570
Epoch 3/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3581 - accuracy: 0.8714
Epoch 4/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3353 - accuracy: 0.8801
Epoch 5/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3207 - accuracy: 0.8856
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 2ms/step - loss: 0.3550 - accuracy: 0.8782
[0.3549554944038391, 0.878166675567627]

옵티마이저

케라스는 다양한 경사 하강법 알고리즘을 제공한다.(optimizer)

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

sgd = keras.optimizers.SGD(learning_rate=0.1)

sgd = keras.optimizers.SGD(momentum=0.9, nesterov=True)

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

rmsprop = keras.optimizers.RMSprop()
model.compile(optimizer=rmsprop, loss='sparse_categorical_crossentropy', metrics='accuracy')

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)
Epoch 1/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.5223 - accuracy: 0.8193
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3921 - accuracy: 0.8601
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3499 - accuracy: 0.8733
Epoch 4/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3241 - accuracy: 0.8809
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3033 - accuracy: 0.8883
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 1ms/step - loss: 0.3512 - accuracy: 0.8756
[0.351207435131073, 0.8755833506584167]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
728x90

인공 신경망

 

패션 MNIST

딥러닝에서 MNIST가 유명함 -> 손으로 쓴 0~9까지 숫자 자료. 패션 MNIST는 숫자 대신 패션 아이템으로 이루어짐

from tensorflow import keras

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

60,000개의 28*28 이미지로 되어 있음

print(train_input.shape, train_target.shape)
print(test_input.shape, test_target.shape)

(60000, 28, 28) (60000,)

(10000, 28, 28) (10000,)

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 10, figsize=(10,10))
for i in range(10):
    axs[i].imshow(train_input[i], cmap='gray_r')
    axs[i].axis('off')
plt.show()

print([train_target[i] for i in range(10)])

[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]

패션 아이템의 종류를 나타내고 있다. 종류는 아래와 같다

label item
0 티셔츠
1 바지
2 스웨터
3 드레스
4 코트
5 샌들
6 셔츠
7 스니커즈
8 가방 
9 앵클부츠
import numpy as np

print(np.unique(train_target, return_counts=True))

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000]))

label별로 item이 몇개씩 있는지 확인했고, 각 60000개씩 있는 것을 볼 수 있다.

 

로지스틱 회귀로 패션 아이템 분류하기

훈련 샘플이 6만개라 전체를 한꺼번에 하기보다는 하나씩 꺼내서 모델을 훈련하는 것이 좋다.

이럴 때 사용하는 것이 확률적 경사 하강법(SGDClassifier)

train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
print(train_scaled.shape)

(60000, 784)

train_scaled = train_input / 255.0 
이 부분이 중요한데, 각 pixel이 0~255의 정수값을 가지는 값이다. 머신러닝에서 효율적으로 사용하기 위해 이 값을 0~1사이의 실수로 변경하여 정규화 시켜준다. 이를 위해 최대값으로 나누는 작업을 한다.
 
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier

sc = SGDClassifier(loss='log', max_iter=5, random_state=42)

scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score']))

0.8195666666666668

max_iter=5는 SGDClassifier 반복 횟수

 

인공신경망

텐서플로와 케라스

import tensorflow as tf
from tensorflow import keras

인공신경망으로 모델 만들기

from sklearn.model_selection import train_test_split

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

print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)

(48000, 784) (48000,)

(12000, 784) (12000,)

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
model = keras.Sequential(dense)

인공신경망으로 패션 아이템 분류하기

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
print(train_target[:10])

[7 3 5 8 6 9 3 3 9 9]

model.fit(train_scaled, train_target, epochs=5)
Epoch 1/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.6097 - accuracy: 0.7913
Epoch 2/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.4785 - accuracy: 0.8396
Epoch 3/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.4557 - accuracy: 0.8479
Epoch 4/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.4438 - accuracy: 0.8519
Epoch 5/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.4362 - accuracy: 0.8547
<keras.callbacks.History at 0x7f253d669550>

결과가 할 때마다 다르게 나온다. 그러나 충분히 안정적으로 된다면 차이가 크지 않다.

model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 1ms/step - loss: 0.4475 - accuracy: 0.8494
[0.44751664996147156, 0.8494166731834412]
728x90
728x90

* 인공 신경망

 - 뉴런에서 영감을 받아 만든 머신 러닝 알고리즘. 딥러닝으로 불리기도 함

* 텐서플로

 - google library. CPU/GPU를 사용해 훈련. 케라스 사용

* 밀집층

 - 가장 간단한 신경망의 층. 뉴런들이 모두 연결되어 있기 때문에 완전 연결층이라고도 부름

 - 특별히 출력층에 밀집층을 사용할 때는 분류하려는 클래스와 동일한 개수의 뉴런을 사용

* 원-핫 인코딩

 - 정숫값을 배열에서 해당 정수 위치의 원소만 1이고 나머지는 모두 0으로 변환

 - 필요한 이유 => 다중 분류에서 출력층에서 만든 확률과 크로스 엔트로피 손실을 계산하기 위함

 - 텐서플로에서 'sparse_categorical_entropy' 손실을 지정하면 이런 변환이 필요 없음

 

TensorFlow

 * Dense

 - 밀집층을 만드는 class

 - activation : 활성화 함수 지정(sigmoid, softmax), 지정하지 않을 수도 있음

 * Sequential 

 - 케라스에서 신경망 모델을 만드는 클래스

 - 추가할 층이 1개 이상일 경우 파이썬 리스트로 전달

 * compile()

 - 모델 객체를 만든 후 훈련하기 전에 사용할 손실 함수와 측정 지표 등을 지정

 - loss : 손실함수 지정(binary_crossentropy : 이진 분류, categorical_crossentropy : 다중 분류, sparse_categorical_crossentropy : 클레스 레이블이 정수, mean_square_error : 회귀 모델)

 * fit() : 훈련

 * evaluate() : 평가

 

728x90

+ Recent posts