본문 바로가기

과목/인공지능

텐서플로우 설치, 신경망 모델, 다층 퍼셉트론, 컨볼루션 신경망 코드

텐서플로우를 윈도우 환경에서 사용하기 위해 아나콘다(Anaconda)를 설치한다.

아나콘다는 파이썬과 R을 기반으로 개발된 각종 오픈 소스 패키지들을 버전에 맞춰 자동으로 설치하고 사용할 수 있도록 하는 환경을 만들고관리하는 플랫폼이다. www.continuum.io/downloads에서 파이썬 버전 3인 아나콘다를 다운로드한다.


설치가 완료되면

Anaconda prompt를 실행시키고 다음과 같이 tensorflow라는 이름의 콘다 환경을 생성한다.

>conda create -n tensorflow python=3.5

위 명령에 의해 tensorflow라는 콘다 환경이 사용자 폴더 아래 생긴다. 파이썬 3.5버전과 pip, setuptools, wheel, vs2015_runtime 등의 패키지가 설치된다.


tensorflow 콘다 환경을 활성화하기 위해 다음 명령을 입력한다.

>activate tensorflow


활성화된 tensorflow 콘다 환경을 종료시키려면 다음과 같이 deactive 명령을 사용한다.

>deactivate tensorflow


tensorflow 콘다 환경을 활성화시킨 후 다음 명령어로 텐서플로우를 설치한다. 시간이 좀 걸린다. 양치하고 오니 끝났다.

>pip install tensorflow


파이썬 개발 환경에는 쥬피터 노트북, 파이참이 있다. 노트북은 아나콘다에 포함되어 있다. 웹 브라우저 상에서 파이썬 코드를 작성하고 실행할 수 있다. 쥬피터 노트북을 실행하려면 Anaconda prompt에서 tensorflow를 활성화시키고 아래 명령을 입력한다.

>jupyter notebook


파이참은 IDE이다. 콘솔창이 아닌 비주얼 스튜디오마냥 GUI 환경이다. www.jetbrains.com에서 pycharm community 버전을 받으면 된다.

파이참에서 텐서플로우 프로그래밍을 하기 위해 프로젝트를 생성하고 개발 환경에 대한 설정을 조정해야 한다. File-Setting에서 설정 창을 열고 Project:-Project Interpreter를 선택한다. Add Local 버튼을 누르면 창이 뜨는데 여기서 Existing environment를 선택하고 설치된 파이썬 인터프리터 파일의 경로를 찾아 지정한다. 경로명은 보통 사용자 폴더 아래 Anaconda3/envs/tensorflow/python.exe가 된다.


GPU 버전 텐서플로우 설치

텐서 플로우에서 GPU를 사용하기 위해 NVIDIA에서 제공하는 CUDA Toolkit과 cuDNN을 설치해야 한다. NVIDIA의 개발자 사이트 developer.nvidia.com/cuda-downloads에서 CUDA Toolkit 버전 8을 컴퓨터 환경에 맞게 다운해서 설치한다. developer.nvidia.com/cuDNN에서 딥러닝 신경망 라이브러리인 NVIDIA cdDNN의 버전 5.1을 컴퓨터 환경에 맞게 다운해서 설치한다. 압축 파일을 풀면 bin, include, lib 디렉토리가 있는 것을 확인할 수 있다. 이 디렉토리에 있는 파일들을 CUDA가 설치된 디렉토리(C:\Program File7NVIDIA GPU Computing Toolkit\CUDA\v8.0)의 대응되는 폴더에 복사한다.

GPU 버전의 텐서플로우를 사용하기 위해서 다음과 같은 별도의 콘다 환경 tensorflow-gpu를 생성한다.

>conda create -n tensorflow-gpu python=3.5


tensorflow-gpu 환경을 활성화한 후 tensorflow-gpu를 설치한다.

>activate tensorflow-gpu

>pip install tensorflow-gpu


(GPU 버전은 안함)


간단한 신경망 모델

입력과 가중치를 선형결합한 후 소프트맥스 층만 통과시키는 간단한 신경망으로 MNIST 데이터의 숫자를 인식하는 프로그램이다. MNIST는 필기체 숫자 데이터이다. 28x28 그레이 영상이다.


MNIST 데이터는 얀르쿤의 웹사이트(yann.lecun.com/exdb/,mnist)에서 4개의 파일로 제공된다. 4,5행에서 파일이 자동 다운되고 읽혀진다. 자동 다운이 안되면 프로젝트 폴더에 MNIST_data 폴더를 만들고 파일을 직접 다운해서 넣으면 된다.


import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)

x=tf.placeholder("float",[None,784])
W=tf.Variable(tf.zeros([784,10])) #선형결합 가중치
b=tf.Variable(tf.zeros([10])) #편차항

y=tf.nn.softmax(tf.matmul(x,W) + b) #소프트맥스
y_=tf.placeholder("float",[None,10])

cross_entropy=-tf.reduce_sum(y_*tf.log(y)) #교차 엔트로피 오차
train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x:batch_xs,y_:batch_ys})
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,"float"))
print(sess.run(accuracy,feed_dict={x:mnist.test.images,\
y_:mnist.test.labels}))


실행 결과

간단한 신경망 모델.txt


다층 퍼셉트론

다음 프로그램은 다층 퍼셉트론을 MNIST 데이터 분류에 적용한 프로그램이다. 여기서 구성한 신경망은 은닉층 한 개와 출력층으로 되어 있으며, 은닉층은 15개의 노드를 갖도록 한다. 입력 데이터의 크기가 28x28(784)이므로, 입력층에는 784개 노드를 만들어준다. 출력에서 0부터 9까지 각 숫자에 대한 확률을 출력하도록 10개의 노드를 만든다.

27행의 multilayer_perceptron 함수를 사용하여 다층 퍼셉트론을 구성하는데, 은닉층의 활성화 함수로 ReLU를 사용하도록 설정한다. 49행은 출력층의 값을 소프트맥스를 사용하도록 하고, 오차 함수로 교차엔트로피를 사용하도록 지정한다. 51행에서는 최적화 방법으로 Adam을 사용하도록 지정한다. 프로그램을 실행하면 학습 오차를 나타내는 교차엔트로피 값이 점점 감소하는 것을 확인할 수 있다.


import tensorflow as tf
import os
import matplotlib.pyplot as plt
#MNIST 데이터 적재
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

os.environ['TF_CPP_MIN_LOG_LEVEL']='2' #경고 메시지 화면출력금지

#파라미터
learning_rate = 0.001 #신경망 학습률
training_epochs = 100 #학습 횟수
batch_size = 100 #미니배치의 크기
display_step = 10 #중간결과 출력 간격

#신경망 구조 관련 파라미터
n_hidden_1 = 15 #은닉층의 노드 개수
n_input = 784 #입력층의 노드 개수 MNIST 데이터 (28x28)
n_classes = 10 #출력층의 노드 수 MNIST 부류 개수(숫자 0~9)

#텐서 그래프 입력 변수
x=tf.placeholder("float",[None,n_input]) #입력:필기체 영상
y=tf.placeholder("float",[None,n_classes]) #출력:숫자

#학습 모델 MLP 정의
def multilayer_perceptron(x,weights, biases):
#ReLU를 사용하는 은닉층
layer_1=tf.add(tf.matmul(x,weights['h1']),biases['b1'])
layer_1=tf.nn.relu(layer_1)
#출력층 (활성화 함수 미사용)
out_layer=tf.matmul(layer_1,weights['out'])+biases['out']
return out_layer

#학습할 파라미터:가중치(weights), 편차항(biases)
weights={
'h1':tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'out':tf.Variable(tf.random_normal([n_hidden_1,n_classes]))
}
biases = {
'b1':tf.Variable(tf.random_normal([n_hidden_1])),
'out':tf.Variable(tf.random_normal([n_classes]))
}
#신경망 모델 구성. 출력값 pred: 입력 x에대한 신경망의 출력
pred=multilayer_perceptron(x,weights,biases)
#비용(오차) 정의 (신경망 출력 pred, 목표 출력 y):교차엔트로피 사용
cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred,\
labels=y))
#학습 알고리즘 설정
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).\
minimize(cost)

init=tf.global_variables_initializer() #변수 초기화 지정

#데이터 플로우 그래프 실행
with tf.Session() as sess:
sess.run(init)
total_batch = int(mnist.train.num_examples/batch_size) #배치 개수

for epoch in range(training_epochs):#정해진 횟수만큼 학습
avg_cost=0.
for i in range(total_batch):
batch_x, batch_y=mnist.train.next_batch(batch_size)#적재
#역전파 알고리즘 적용
_, c=sess.run([optimizer,cost],feed_dict={x:batch_x,\
y:batch_y})
avg_cost+=c/total_batch #평균 손실(오류) 계산
if epoch%display_step==0: #현재 학습 상황 출력
print("Epoch:", '%04d' % (epoch+1), "cost=",\
"{:.9f}".format(avg_cost))

#모델 테스트 : out의 최대값 노드와 y노드가 같으면 정답
correct_prediction = tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
#correct_prediction 평균
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
print(accuracy.eval({x:mnist.test.images, y:mnist.test.labels}))

다층 퍼셉트론.txt



컨볼루션 신경망

다음 코드는 컨볼루션 신경망을 MNIST 데이터에 적용하는 프로그램이다. 컨볼루션 신경망을 구성한 다음, 학습 관련 정보를 지정하고 있다. 여기에서 구성한 신경망은 Conv-(ReLU)-MaxPool-Conv-(ReLU)-MaxPool-FC-(ReLU)-FC-(SoftMAx)의 층을 갖는다. 괄호()로 되어 있는 부분은 활성화 함수에 해당하기 때문에, 전체 6개의 층인 딥러닝 신경망이다. 45행은 드롭아웃을 첫 번째 완전 연결층 FC에 적용하는 것을 나타낸다. 51행은 교차 엔트로피를 오차 함수로 지정한다. 52행은 최적화 방법으로 AdamOptimizer를 지정한다. 56~58행, 62행, 68행은 데이터 플로우 그래프 및 성능에 관한 그래프를 출력하기 위한 부분이다.


from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data',one_hot=True)
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2' #경고 메시지 화면 출력 금지

x=tf.placeholder("float",shape=[None,784]) #입력
yp=tf.placeholder("float",shape=[None,10]) #출력
x_image=tf.reshape(x,[-1,28,28,1]) #입력을 28x28x1 영상으로 변환

def weight_variable(shape): #shape 형태로 표준편차 0.1로 정규분포 가중치 생성
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):#shape 형태의 각 원소가 0.1인 편차항 생성
initial=tf.constant(0.1, shape=shape)
return tf.Variable(initial)
def conv2d(x,W):#영(0) 패딩하여, 스트라이드 1로 하여 x를 커널 W로 컨볼루션
return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
def max_pool_2x2(x): #영 패딩, 스트라이드 2를 하면서 ,2x2 블록에서 최대값 풀링
return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

W_conv1 = weight_variable([5,5,1,32]) #32개의 5x5x1 커널
b_conv1 = bias_variable([32]) #32개의 편차항
h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1) + b_conv1) #컨볼루션 --> ReLU
h_pool1 = max_pool_2x2(h_conv1) #최대값 풀링

W_conv2 = weight_variable([5,5,32,64]) #64개의 5x5x32 커널
b_conv2 = bias_variable([64]) #64개의 편차항
h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2) #컨볼루션 --> ReLU
h_pool2 = max_pool_2x2(h_conv2) #최대값 풀링

W_fc1 = weight_variable([7*7*64,1024]) #완전 연결 가중치
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64]) #선형으로 reshape
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1) + b_fc1) #가중치 적용 --> ReLU

keep_prob = tf.placeholder("float") #드롭아웃 확률
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) #완전연결층에 드롭아웃 적용

W_fc2 = weight_variable([1024,10]) #완전연결층과 출력층 사이 가중치
b_fc2 = bias_variable([10])

y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2) + b_fc2) #소프트맥스 적용

cross_entropy = -tf.reduce_sum(yp*tf.log(y_conv)) #오차 함수
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)#최적화 기법
correct_prediction = tf.equal(tf.argmax(y_conv,1),tf.argmax(yp,1))#정답 여부
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float")) #정확도

tf.summary.histogram('cross_entropy', cross_entropy)
tf.summary.scalar('accuracy',accuracy)
merged = tf.summary.merge_all()

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
writer=tf.summary.FileWriter('./logs',sess.graph)

for i in range(201): #학습 반복횟수: 200
batch=mnist.train.next_batch(50)
if i%10==0:
train_accuracy = sess.run(accuracy,\
feed_dict={x:batch[0],yp:batch[1],keep_prob:1.0})
summary,acc=sess.run([merged,accuracy],feed_dict={x:batch[0],\
yp:batch[1],keep_prob:1.0})
writer.add_summary(summary,i)
print("step %d, training accuracy %g" %(i,train_accuracy))
sess.run(train_step,feed_dict={x:batch[0],yp:batch[1],keep_prob:0.5})
print("test accuracy %g"% sess.run(accuracy, feed_dict=\
{x:mnist.test.images,yp:mnist.test.labels, keep_prob:1.0}))

컨볼루션 신경망.txt




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

논리에 관해 유용한 사이트  (0) 2018.04.03