개발자를 위한 머신러닝&딥러닝 Ch1. 텐서플로 소개

Leesoft·2022년 9월 1일
0
post-thumbnail

책 읽기와 블로그의 시작

계속 'AI 공부해 보고 싶긴 한데...'라는 생각을 했지만 실천에 옮기지 못했었는데, SNS에서 광고를 보고 홀린 듯이 충동 구매를 해버렸다!

다른 책들과 달리 이 책에는 AI 안에서도 컴퓨터 비전, 자연어 처리, 합성곱 신경망 등 다양한 분야에 대해 다루고 이를 Android나 iOS, Node.js 환경에서 사용하는 방법도 다루고 있어서 아직 컴퓨터에서 어떤 분야를 공부해야 할지 정하지 못하는 나에게 폭넓은 경험을 줄 것 같다는 생각이 들었다.

지금까지는 '이런 프로그램 만들고 싶다!'라는 생각만으로 마구잡이로 개발을 시작하면 항상 막히는 부분이 있었는데, 그럴 때마다 구글링해도 코드나 원리를 전혀 모르니 이해할 수가 없어 프로젝트를 포기했던 경험이 많았던 것 같다.

이 책을 읽는 것은 앞으로 흥미가 생겨 프로젝트를 할 때 막혀 버리는 일이 없도록 하기 위한 기초 공사의 첫 단계이기도 하고, 앞으로 공부하는 내용들에 대해 블로그에 남기려는 노력의 걸음마라고도 할 수 있다! 코드나 설명은 책에 잘 설명이 되어 있는 것 같아서, 여기에는 코드를 짜며 생기는 문제점들이나 느낀 점들도 포함해서 과정 위주로 일기처럼 글을 써 보고 싶다. 블로그 쓰기도 처음이라 그냥 말이 많을 수도...

개념 이해하기

1장에서는 Tensorflow를 설치하고 PyCharm 혹은 Colab에서 사용해 보는 것을 목적으로 하는데, y=wx+by=wx+b 형태의 간단한 함수에서 wwbb를 신경망을 통해 학습시키는 것을 목표로 한다.

Tensorflow의 API인 Keras에서는 Sequential 클래스로 신경망의 층(layer)를 표현하고, model.compile() 메소드로 훈련 방법을 설정하며, model.fit() 메소드로 훈련을 시작하고 model.predict() 메소드로 예측을 실행한다.

공부한 내용을 토대로 설명을 추가한 책의 예제 코드는 아래와 같다.

import tensorflow as tf
import numpy as np

# Layer 생성
model = tf.keras.Sequential([tf.keras.layer.Dense(units=1, input_shape=[1])])
# 훈련 방법 설정(오차를 통해 뉴런의 값 보정)
model.compile(optimizer='sgd', loss='mean_squared_error')

xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

# 훈련 시작(epochs : 훈련 횟수)
model.fit(xs, ys, epochs=500)

# 예측
print(model.predict([10.0]))

실행 결과 epoch가 많아질수록 loss가 감소하고, y=2x1y=2x-1에 따라 기대한 값 19에 매우 가까운 값을 얻을 수 있었다.

위 예제 코드에서 layer를 생성하는 부분을 살펴보자.

model = tf.keras.Sequential([tf.keras.layer.Dense(units=1, input_shape=[1])])

위 코드의 Dense 는 한 층의 모든 뉴런(unit)이 다른 layer의 모든 뉴런과 연결된 상태를 표현하고 있으며, unit=1 은 하나의 뉴런을 갖는 layer의 하나로만 이루어진 신경망을 구성한 것이므로, 아래 그림을 나타낸 것으로 볼 수 있다. input_shape=[1] 은 입력값의 개수를 나타내는데, input_dim=1 로 써도 상관없다. 이렇게 만들어진 뉴런은 각각 가중치 ww와 편향 bb를 변수로 갖게 된다.

layer가 여러 개인 경우는 아직 책에 나오지 않았지만, Sequential 생성자 내에 Dense 객체를 여러 개 넣어서 만들 수 있다.

여기에서 여러 개의 layer를 갖는 신경망의 예제를 볼 수 있다.

model = Sequential()
model.add(Dense(8, input_dim=4, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

Sequential 의 생성자 내부에 Dense 객체의 배열을 만들지 않고, model.add() 메소드를 통해 layer를 추가하였다. 여기서는 units 라는 parameter 이름을 명시하지 않았고, input_shape 대신 input_dim 을 사용하였다. 마지막 줄에는 input_dim 을 생략하였는데, 이는 전 layer의 뉴런의 개수가 8임을 이미 알고 있기 때문에 생략한 것이다. 마지막으로 activation 은 활성화 함수의 종류를 나타낸 것인데, 이 책에서는 나중에 다룰 예정인 듯하다.

삽질 후기

처음에 책에 있는 코드를 그대로 적고 실행시키니 이런 오류가 나타났다.

AssertionError: Duplicate registrations for type 'optimizer'

구글에 찾아보니 Tensorflow를 재설치하라고 해서 강제 쉬는 시간...

다행히도 Tensorflow를 재설치하기만 하면 해결되는 간단한 문제였는데, Tensorflow 용량이 크다 보니 너무 오래 걸리는 것 같았다. 앞으로는 이런 식으로 오래 걸릴 때 PS나 풀까...

파이썬이나 Node.js나 React에서 큰 패키지를 설치하면 경고가 줄줄이 뜨는데, 나만 그런 건지는 모르겠지만 경고들이 너무 거슬리지만 뭔가 잘못 건드리면 안 될 것 같아 바라보기만 할 수밖에 없어 슬프다.

처음에는 '책에 있는 대로만 하면 되겠지?'라고 쉽게 생각했는데 앞으로 파이썬이나 Tensorflow가 업데이트되거나 패키지 의존성 같은 이유로 시키는 대로 했는데 안 돌아가는 문제가 자주 생길 수 있다는 생각이 들어, 생각보다 쉽지만은 않은 공부 과정이 되겠지만 삽질하면서 얻는 것도 많겠지...?

profile
🧑‍💻 이제 막 시작한 빈 집 블로그...

0개의 댓글