일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 딥러닝
- 합성곱 신경망
- 유니티 stt
- 해커톤 후기
- 졸업프로젝트
- speech to text
- redux
- javascript
- 프로그래머스
- JSX
- Watson Speech to Text
- NLU
- 리액트를 다루는 기술
- 딥러닝의정석
- 카카오 블라인드 채용
- 코딩테스트
- 리액트
- 백준
- upper_bound
- 생활코딩
- TIL
- Unity
- Watson IBM
- nlp
- lower_bound
- 프로젝트 회고
- git lfs
- AR
- react
- 유니티 음성인식
- Today
- Total
ISFP의 느리게 굴러가는 개발 블로그
[딥러닝의 정석] 3강 텐서플로로 신경망 구현하기 본문
완전 이론만 배우다가 갑작스럽게 텐서플로우를 쓰게 되며 당황했던 기억이 있다... 이 장을 공부하면서 책에 나와있는 예제들을 돌려봤는데 자꾸 에러가 떠서 엄청난 스트레스를 받았던..ㅎㅎ
3.1 텐서플로란?
텐서플로는 개발자가 딥러닝 모델을 설계하고 만들고 학습시키는 것을 더 쉽게 하도록 구글이 공개한 오픈소스 소프트웨어 라이브러리이다.
텐서플로에서 ‘텐서(Tensor)’은 딥러닝에서 데이터를 표현하는 방식이다. 즉, 행렬로 표현할 수 있는 2차원 형태의 배열을 높은 차원으로 확장한 다차원 배열이다.
이 사진에서 grayscale은 이미지를 2차원 배열로 나타내지만 RGB 이미지는 각각의 3개의 채널마다 2차원 배열로 표현하는데, 이는 tensor(3차원 배열)로 표현할 수 있다.
3.4 텐서플로 변수 만들기와 조작하기
텐서플로 변수는 텐서가 포함된 메모리에 존재하는 버퍼다. 이 변수들은 다수의 그래프 실행후에도 살아남기 때문에 다음과 같은 특징을 갖는다.
- 변수는 그래프가 사용되기 전에 초기화되어야 한다.
- 반복할 때마다 변수를 수정하기 위한 경사법을 사용할 수 있다.
- 추후 사용을 위해 변수에 저장된 값을 디스크에 저장하고 다시불러올 수 있다.
weights=tf.Variable(tf.random_normal([300,200], stddev=0.5), name=”weights”) |
여기서 두개의 인자(tf.random_normal과 name 두 인자를 tf.Variable로 넘긴다. tf.random_normal은 표준편차를 0.5로 갖는 정규분포로 초기화된 tensor을 생성한다. 각 300, 200개의 뉴런이 있는 층을 연결한 300*200 크기의 tensor을 지정하고, tf.Variable 호출로 이름을 전달했다. 이름은 고유한 식별자인데 이것은 가중치가 학습될 수 있음을 의미한다. 만약 수정 불가능하다면 뒤에 trainable=False라는 플래그를 전달한다.
3.5 텐서플로 연산
범주 |
예 |
수학적 연산 |
Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal… |
배열 연산 |
Concat, Slice, Spplit, Constant, Rank, Shape, Shuffle.. |
행열 연산 |
MatMul, MatrixInverse, MatrixDeterminant,… |
상태 저장 연산 |
Variable, Assign, AssignAdd… |
신경망 구성 요소 |
SoftMax, Sigmoid, ReLU, Convlolution2D, MaxPool.. |
체크포인트 관련 연산 |
Save, Restore |
큐와 동기화 연산 |
Enqueue, Dequeue, MutexAcquire, MutexRelease |
흐름 제어 연산 |
Merge, Switch, Enter, Leave, NextIteration |
3.6 placeholder 텐서
Placeholder(
Dtype: 데이터 타입
Shape: 입력 데이터 형태
Name: placeholder의 이름
)
Ex) x=tf.placeholder(tf.float32, name=”x”, shape=[None, 784])
x는 float32에 저장된 데이터의 미니배치이며 784개의 열을 가지고, 정의되지 않은 행의 수도 갖는다.
3.7 텐서플로우 세션
텐서플로에서 텐서는 데이터, 플로는 흐름을 뜻하는데, 연산 수행을 할 때 이러한 흐름이 이루어지도록 만들어야 한다. 이를 Session이 수행한다. Session은 초반 그래프 생성을 담당하며, 모든 변수를 초기화하고 계산 그래프를 실행하는 데 사용할 수 있다.
하지만 tensorflow 2.0부터는 session이 사라진다. (여기서 당황하기 시작.. 랩실에서 텐서플로 2.0을 쓰게 될 거라고 하셨는데 스터디한 책은 모두 텐서플로 1.x버전이었고.. 나중에 가서 여쭤봤더니 변환하는 방법이 있다고 하셨다!)
텐서플로 설치 후 간단한 예제 코드 실행
3.10 텐서플로에서 로지스틱 회귀 모델 지정하기
이 챕터에서 진행할 것은 28*28 흑백 이미지에서 손으로 쓴 숫자를 알아보는 것이다. 첫 번째 신경망은 로지스틱 회귀라는 단순한 머신러닝 알고리즘으로 구현한다. 로지스틱 회귀는 입력이 대상 분류의 하나에 속할 확률을 계산하는 방법이다. 즉, 이미지가 0,1,…,9일 확률을 계산하는 것이다.
로지스틱 회귀 모델을 만드는 단계
1. 추론: 주어진 미니배치로 하나의 확률 분포를 만든다.
2. 손실: 오차 함수의 값을 계산한다.
3. 학습: 모델 파라미터들의 경사 계산과 모델 갱신을 담당한다.
4. 평가: 모델의 효용성을 결정한다.
책에 있는 코드로 학습 예를 실행해보려고 했지만, 너무 많은 오류가 생겨서 구글링해서 찾아본 로지스틱 회귀 모델 학습 예제로 실행해보았다. 주의할 점은 tensorflow 2.0과 1.0의 문법이 달라서 1.0의 예제를 실행하기 위해서는 import tensorflow as tf문을 inmport tensorflow.compat.v1 as tf를 하고 tf.disable_v2_behavior()을 해줘야 한다.
'''
A logistic regression learning algorithm example using TensorFlow library.
This example is using the MNIST database of handwritten digits
(http://yann.lecun.com/exdb/mnist/)
Author: Aymeric Damien
Project: https://github.com/aymericdamien/TensorFlow-Examples/
'''
from __future__ import print_function
import tensorflow as tf
# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
# Parameters
learning_rate = 0.01
training_epochs = 25
batch_size = 100
display_step = 1
# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784]) # mnist data image of shape 28*28=784
y = tf.placeholder(tf.float32, [None, 10]) # 0-9 digits recognition => 10 classes
# Set model weights
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# Construct model
pred = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax
# Minimize error using cross entropy
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()
# Start training
with tf.Session() as sess:
# Run the initializer
sess.run(init)
# Training cycle
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(mnist.train.num_examples/batch_size)
# Loop over all batches
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# Run optimization op (backprop) and cost op (to get loss value)
_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
y: batch_ys})
# Compute average loss
avg_cost += c / total_batch
# Display logs per epoch step
if (epoch+1) % display_step == 0:
print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost))
print("Optimization Finished!")
# Test model
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
# Calculate accuracy
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))
Epoch를 늘릴수록 accuracy가 높아지고 cost가 작아지는 것을 확인할 수 있었다. (epoch가 1000일 때 accuracy는 0.926이 나왔다.)
'학교 공부 > 여름방학 랩인턴' 카테고리의 다른 글
[딥러닝의 정석] 5강 합성곱 신경망 (0) | 2021.01.15 |
---|---|
[딥러닝의 정석] 2강 전방향 신경망 학습 (0) | 2020.11.15 |
[딥러닝의 정석] 1강 신경망 (0) | 2020.11.15 |