본문 바로가기
책&강의 학습/올인원 패키지 :딥러닝&인공지능

[패스트캠퍼스 수강 후기] 인공지능강의 100% 환급 챌린지 29회차 미션

by 소한보 2020. 7. 27.

Part4-18. 쉽게 배우는 경사하강 학습법 - 06. (STEP 3) 경사하강법을 이용한 얕은 신경망 학습 - 1

import

import tensorflow as tf
import numpy as np

하이퍼 파라미터 설정

EPOCHS = 1000

네트워크 구조 정의

# 입력 계층 : 2, 은닉 계층 : 128 (Sigmoid activation), 출력 계층 : 10 (Softmax activation)
# 케라스 모델 상속해와서 진행
# class의 경우 처음 인자는 self로 받아줘야함 
class MyModel(tf.keras.Model): 
    def __init__(self):
        super(MyModel, self).__init__()
        self.d1 = tf.keras.layers.Dense(128, input_dim=2, activation='sigmoid')
        self.d2 = tf.keras.layers.Dense(10, activation='softmax')
    # 입력에서 출력으로 연결되는 부분을 정의

    def call(self, x, training=None, mask=None):
        x = self.d1(x)         #은닉계층
        return self.d2(x)    #출력계층

학습루프 정의

 #@tf.function 데코레이터 이용 최적화 진행
@tf.function
def train_step(model, inputs, labels, loss_object, optimizer, train_loss, train_metric):
    # GradientTape안에서 gradient 계산
    with tf.GradientTape() as tape:
        predictions = model(inputs)
        loss = loss_object(labels, predictions)
     #스칼라를 벡터로 미분하기때문에 gradients도 벡터 
    gradients = tape.gradient(loss, model.trainable_variables) # 스칼라(loss)를 모든 trainable_variables로 미분 df(x)/dx

    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    train_loss(loss)
    train_metric(labels, predictions) #평가지료로 계산 

Part4-19. 쉽게 배우는 경사하강 학습법 - 07. (STEP 3) 경사하강법을 이용한 얕은 신경망 학습 - 2

데이터셋 생성 전처리

데이터셋 직접 만들어 사용

np.random.seed(0) #시드값 고정

pts = list() #입력값
labels = list() #출력값
# 10개 포인트 생성(가우시안 형태로) 
center_pts = np.random.uniform(-8.0, 8.0, (10, 2))
for label, center_pt in enumerate(center_pts):
    for _ in range(100):
        pts.append(center_pt + np.random.randn(*center_pt.shape)) #중심점을 기준으로 둥글게 퍼지는 형태로 생성됨
        labels.append(label)

pts = np.stack(pts, axis=0).astype(np.float32) #list-> numpy object로 변형/GPU로 연산할경우 float32로 연산해야 진행됨
labels = np.stack(labels, axis=0)

# from_tensor_slices - data_set형태로 만들어줌 
train_ds = tf.data.Dataset.from_tensor_slices((pts, labels)).shuffle(1000).batch(32) #학습안되면 배치사이즈 줄일것

모델 생성

model = MyModel()

손실 함수 및 최적화 알고리즘 설정

loss_object = tf.keras.losses.SparseCategoricalCrossentropy() #Sparse one-hot과 반대되는 개념
optimizer = tf.keras.optimizers.Adam()

평가지표 설정

train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')

학습루프

for epoch in range(EPOCHS):
    for x, label in train_ds:
        train_step(model, x, label, loss_object, optimizer, train_loss, train_accuracy)
    # 학습과정 출력 
    template = 'Epoch {}, Loss: {}, Accuracy: {}'
    print(template.format(epoch + 1,
                          train_loss.result(),
                          train_accuracy.result() * 100))
    train_loss.reset_states()
    train_accuracy.reset_states()

데이터셋 및 학습 파라미터 저장

# savez_compressed 압축해서 저장 
np.savez_compressed('ch2_dataset.npz', inputs=pts, labels=labels)

# weight, bias 저장 
W_h, b_h = model.d1.get_weights()
W_o, b_o = model.d2.get_weights()

# 컨벤션이 다소 달라서 transpose해서 저장
W_h = np.transpose(W_h)
W_o = np.transpose(W_o)
np.savez_compressed('ch2_parameters.npz',
                    W_h=W_h,
                    b_h=b_h,
                    W_o=W_o,
                    b_o=b_o)

딥러닝/인공지능 올인원 패키지 Online

댓글