본문 바로가기
인공지능

5. 딥러닝

by 카리3 2019. 12. 1.

TensorFlow를 이용한 딥러닝

5.1 딥러닝 개요

여러 층을 가진 신경망을 사용해 머신러닝을 수행하는 것을 의미합니다

기존 방법에서는 사람이 이미지 내부에 있는 특징을 추출한다는 점이 다릅니다. 

신경망 : 인간의 신경망을 본따 만든 네트워크 구조를 의미합니다. 이러한 신경망을 3개 이상 중첩하면 이를 딥러닝이라고 합니다.

퍼셉트론 

퍼세트론은 다수의 신호(Input)을 받아서 하나의 신호(Output)를 출력합니다. 이 때문에 그 동작은 뉴런과 굉장히 유사하며, 그 과정은 다음과 같습니다. 다수의 입력을 받았을 때, 퍼셉트론은 각 입력 신호의 세기에 따라 다른 가중치를 부여합니다. 그 결과를 고유한 방식으로 처리한 후, 입력 신호의 합이 일정 값을 초과한다면 그 결과를 다른 뉴런으로 전달합니다.

5.2 Tensor Flow 설치하기

 TensorFlow

텐서플로우는 대규모 숫자 계산을 해주는 라이브러리입니다. 머신러닝과 딥러닝에 많이 사용하고 있어서 그러한 것을 목적으로 하는 도구라고 생각하는 경우가 많은데, 실제로는 다양한 숫자 계산을 할 수 있는 범용적인 라이브러리입니다.

텐서는 다차원 행렬 계산을 의미합니다. 따라서 다차원 행렬 계산을 흐르게 한다는 의미입니다.

https://blog.naver.com/kangsho15/221718939645 : API 설명

https://hobbang143.blog.me/221463489187 : 텐서플로우 간단 설명

https://blog.naver.com/dltnwjddldi/221711339912 : 텐서플로우 : 파이토치 : 케라스 

 

[텐서플로우] 텐서란?

#텐서플로우 #tensorflow #딥러닝 #머신러닝 #인공지능 #빅데이터 #AI #케라스 #주피터노트북 #파이썬 #...

blog.naver.com

TensorFlow 설치

1. conda create -n tensorflow python=3.7.4

Keras 설치

pip install keras

nano Editor 설치

apt-get install nano

mkdir ~/.keras

nano ~/.keras/keras.json

{

  "image_dim_ordering": "tf",

  "epsilon": 1e-07,

 "floatx": "float32",

  "backend": "tensorflow"

}

pip install tensorflow

====================================실패===============================

텐서플로우 설치가 잘되었는지 확인

그냥 실행하면 오류가 난다.. ㅠㅠ

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

이것을 넣어서 해결

 

5.3 Jupyter Notebook

넘어간다

5.4 TensorFlow 기본

TensorFlow의 변수를 표현하는 방법

1) 상수 정의 하기

a = tf.constant(120, name="a")

2) 변수 정의하기

v = tf.Variable(0, name="v")

 

TensorFlow의 플레이스홀더 (텐서플로우 버전이 맞지 않아 예제 실습이 안됨)

============================실패========================

플레이스홀더 정의하기

a = tf.placeholder(tf.int32, [3]) # 정수 자료형 3개를 가진 배열

 

머신러닝 해보기

[텐서플로우 실행안됨 ㅠㅠ...   계속시도해보기]

conda install python=3.5

docker 컨테이너 삭제

docker rm 'ps -a -q'

[도커재설치]

docker pull continuumio/anaconda3

docker run -i -t continuumio/anaconda3 /bin/bash

python3 -c "print(3*5)"

폴더 마운트 (예제 샘플)

1) docker ps -a   : 컨테이너 확인

2) docker commit bb3e29dec994 tf:01 컨테이너 id로  alias 설정

3) docker run -i -t -v /d/Dev/AI/sample:/sample tf:01   : 폴더 마운트하여 alias  실행

4-1) conda install python=3.6  #3.6 install 실패

4-2) conda create -n py35 python=3.5 anaconda

conda activate py35  #파이썬 3.5 버전으로 활성화, 이걸 해야 3.5로 version이 변경된다.

#conda deactive py35

conda install python=3.5.5

pip install --upgrade pip

conda create -n tf35 python=3.5 anaconda

conda activate tf35

pip install tensorflow

[학습요점]

1. 데이터 정규화

# 데이터 정규화 --- (※2)
csv["height"] = csv["height"] / 200
csv["weight"] = csv["weight"] / 100
# 레이블을 배열로 변환하기 --- (※3)
# - thin=(1,0,0) / normal=(0,1,0) / fat=(0,0,1)
bclass = {"thin": [1,0,0], "normal": [0,1,0], "fat": [0,0,1]}

2. 플레이스 홀더 선언하기

# 데이터 플로우 그래프 구출하기 --- (※5)
# 플레이스홀더 선언하기
x  = tf.placeholder(tf.float32, [None, 2]) # 키와 몸무게 데이터 넣기
y_ = tf.placeholder(tf.float32, [None, 3]) # 정답 레이블 넣기
# 변수 선언하기 --- (※6)
W = tf.Variable(tf.zeros([2, 3])); # 가중치
b = tf.Variable(tf.zeros([3])); # 바이어스

3. 소프트맥스 회귀 정의하기

y = tf.nn.softmax(tf.matmul(x, W) + b)

4. 모델훈련하기

# 모델 훈련하기 --- (※8)
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
optimizer = tf.train.GradientDescentOptimizer(0.01) #학습계수
train = optimizer.minimize(cross_entropy)  #경사하강법
# 정답률 구하기
predict = tf.equal(tf.argmax(y, 1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(predict, tf.float32))
# 세션 시작하기
sess = tf.Session()
sess.run(tf.tf.global_variables_initializer()) # 변수 초기화하기

5. 학습시키기

for step in range(3500):
    i = (step * 100) % 14000
    rows = csv[1 + i : 1 + i + 100]
    x_pat = rows[["weight","height"]]
    y_ans = list(rows["label_pat"])
    fd = {x: x_pat, y_: y_ans}
    sess.run(train, feed_dict=fd)
    if step % 500 == 0:
        cre = sess.run(cross_entropy, feed_dict=fd)
        acc = sess.run(accuracy, feed_dict={x: test_pat, y_: test_ans})
        print("step=", step, "cre=", cre, "acc=", acc)

6. 정답률구하기

acc = sess.run(accuracy, feed_dict={x: test_pat, y_: test_ans})
print("정답률 =", acc)

 

5.5 TensorBoard로 시각화하기

5.6 TensorBoard로 딥러닝하기

# 합성곱 계층을 만드는 함수 --- (※4)
def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding='SAME')
# 최대 풀링층을 만드는 함수 --- (※5)
def max_pool(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1],
        strides=[1,2,2,1], padding='SAME')
# 합성곱층1 --- (※6)
with tf.name_scope('conv1') as scope:
    W_conv1 = weight_variable('conv1', [5, 5, 1, 32])
    b_conv1 = bias_variable('conv1', 32)
    x_image = tf.reshape(x, [-1, 28, 28, 1])
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
# 풀링층1 ---- (※7)
with tf.name_scope('pool1') as scope:
    h_pool1 = max_pool(h_conv1)
# 합성곱층2 --- (※8)
with tf.name_scope('conv2') as scope:
    W_conv2 = weight_variable('conv2', [5, 5, 32, 64])
    b_conv2 = bias_variable('conv2', 64)
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
# 풀링층2 --- (※9)
with tf.name_scope('pool2') as scope:
    h_pool2 = max_pool(h_conv2)
# 전결합층 --- (※10)
with tf.name_scope('fully_connected') as scope:
    n = 7 * 7 * 64
    W_fc = weight_variable('fc', [n, 1024])
    b_fc = bias_variable('fc', 1024)
    h_pool2_flat = tf.reshape(h_pool2, [-1, n])
    h_fc = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc) + b_fc)        
# 드롭아웃(과잉 적합) 막기 --- (※11)
with tf.name_scope('dropout') as scope:
    keep_prob = tf.placeholder(tf.float32)
    h_fc_drop = tf.nn.dropout(h_fc, keep_prob)
# 출력층 --- (※12)
with tf.name_scope('readout') as scope:
    W_fc2 = weight_variable('fc2', [1024, 10])
    b_fc2 = bias_variable('fc2', 10)
    y_conv = tf.nn.softmax(tf.matmul(h_fc_drop, W_fc2) + b_fc2)

================================실패==================================

5.7 Keras로 다양한 딥러닝 해보기

Keras는 머신러닝 라이브러리 Theano와 TensorFlow를 래핑한 라이브러리입니다.

텐서플로우에 비해 복잡한 모델 구조를 간단하게 만들 수 있습니다.

Keras로 MNIST 테스트해보기

[학습요점]

1. 데이터 정규화하기

1) X_train = X_train.reshape(60000, 784).astype('float32')

데이터를 784개의(28*28) 차원으로 재구성하고

변수의 형식을 float32형식(4바이트 부동소수점)으로 바꿉니다

2) X_train /= 255

해당값이 픽셀의 밝기를 0~255로 표현한 데이터라 

0~1의 값을 가질 수 있도록 255로 나눠줍니다

 

2. 모델 구조 정의하기

1)  model.add(Dense(512, input_shape=(784,)))

#input:784, result: 512 

2)  model.add(Activation('relu'))

 #ReLu는 입력값이 0보다 작으면 0이고 0보다 크면 입력값 그대로를 내보낸다. 

3) model.add(Dropout(0.2))

 훈련 데이터 내에서의 복잡한 서로간의 상호성을 막아준다. 모델을 평균화 하는 매우 효과적인 방법이라고 한다. dropout이라는 용어는 유닛을 드랍 즉, 없애 버린다는 의미를 가진다. 

https://blog.naver.com/sw4r/221343575208

4) Activation('softmax')

결과 값이 0~1의 값

output의 모든 값을 합한 값이 1

5) Activation('sigmoid')

결과 값이 0~1의 값

각각 독립적인 cost와 값을 가진다

3. 모델 구축하기

model.compile(
    loss='categorical_crossentropy',
    optimizer=Adam(),
    metrics=['accuracy'])

 

[결과]

Keras로 비만도 판정해보기

batch_size : 얼마만에 한 번씩 라벨과 비교할지

epoch : 데이터 반복 학습 횟수

 

5.8. Pandas/NumPy 다루기

 

'인공지능' 카테고리의 다른 글

4장 머신러닝  (0) 2019.11.25
2장. 고급스크레이핑  (0) 2019.11.24
1장. 크롤링과 스크레이핑  (0) 2019.11.24
파이썬 문법 간단정리  (1) 2019.11.24
머신러닝/딥러닝 개발을 위한 환경설정  (1) 2019.11.24