tensorflow, 권적 신경 네트워크와 mnist

12670 단어 tensorflow
본고는 초보자를 대상으로 한 글로 주로 코드 묘사tensorflow 실현을 바탕으로 하는 권적 신경 네트워크를 바탕으로 mnist 데이터 집합에 응용한다.
코드
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
import numpy as np

#      loss acc
def calc_acc(cnt, train_acc, train_loss):
    sum_loss = 0.0
    sum_acc = 0.0
    for i in range(test_nbatch):
        x_batch,y_batch = get_batch(test_data, test_batch_size, i)
        feed = {x:x_batch,y:y_batch,keep_prob:1.0,keep_prob2:1.0}
        calc_obj = [loss,acc_num]
        calc_ans = sess.run(calc_obj, feed_dict=feed)
        sum_loss += calc_ans[0]
        sum_acc += calc_ans[1]
    avg_loss = sum_loss / test_nbatch
    avg_acc = sum_acc / test_size
    print("{:0>2}:train-loss:{:.4f},acc:{:.4f}   test-loss:{:.4f},acc:{:.4f}".format(cnt,train_loss,train_acc,avg_loss,avg_acc))

#   k batch
def get_batch(data, batch_size, k):
    ret = []
    for i in range(2):
        ret.append(data[i][batch_size*k:batch_size*(k+1)])
    return ret

#const and data
image_size = 784
image_len = 28
class_size = 10
epochs = 10
eps = 1e-10

mnist = input_data.read_data_sets("MNIST_DATA/")

train_data = [mnist.train.images,mnist.train.labels]
test_data = [mnist.test.images,mnist.test.labels]

train_batch_size = 50
test_batch_size = 50
train_size = train_data[0].shape[0]
test_size = test_data[0].shape[0]
train_nbatch = train_size // train_batch_size
test_nbatch = test_size // test_batch_size


sess = tf.InteractiveSession()


#input
x = tf.placeholder('float', shape=[None,image_size])
y = tf.placeholder('int32', shape=[None])
x_image = tf.reshape(x, [-1,image_len,image_len,1])
y_label = tf.one_hot(y, class_size)
keep_prob = tf.placeholder('float')
keep_prob2 = tf.placeholder('float')
#conv1
w_conv1 = tf.Variable(tf.truncated_normal([5,5,1,20], stddev=0.01))
b_conv1 = tf.Variable(tf.constant(0.0, shape=[20]))
y_conv1 = tf.nn.relu(tf.nn.conv2d(x_image, w_conv1, strides=[1,1,1,1], padding='SAME') + b_conv1)
y_pool1 = tf.nn.max_pool(y_conv1, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
#conv2
w_conv2 = tf.Variable(tf.truncated_normal([5,5,20,50], stddev=0.01))
b_conv2 = tf.Variable(tf.constant(0.0, shape=[50]))
y_conv2 = tf.nn.relu(tf.nn.conv2d(y_pool1, w_conv2, strides=[1,1,1,1], padding='SAME') + b_conv2)
y_pool2 = tf.nn.max_pool(y_conv2, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')
#flat
y_flat = tf.reshape(y_pool2, [-1,7*7*50])
y_flat_drop = tf.nn.dropout(y_flat, keep_prob2)
#fc1
w_fc1 = tf.Variable(tf.truncated_normal([7*7*50,500], stddev=0.01))
b_fc1 = tf.Variable(tf.constant(0.0, shape=[500]))
y_fc1 = tf.nn.relu(tf.matmul(y_flat_drop, w_fc1) + b_fc1)
y_fc1_drop = tf.nn.dropout(y_fc1, keep_prob)
#fc2
w_fc2 = tf.Variable(tf.truncated_normal([500,10], stddev=0.01))
b_fc2 = tf.Variable(tf.constant(0.0, shape=[10]))
y_fc2 = tf.nn.softmax(tf.matmul(y_fc1_drop, w_fc2) + b_fc2) + eps
#loss
loss = -tf.reduce_mean(tf.reduce_sum(y_label*tf.log(y_fc2), reduction_indices=[1]))
grad = tf.train.AdadeltaOptimizer(4.0).minimize(loss)
#acc
corr_pred = tf.equal(tf.argmax(y_label,1), tf.argmax(y_fc2,1))
acc_num = tf.reduce_sum(tf.cast(corr_pred, 'float'))


#run
sess.run(tf.global_variables_initializer())

cnt = 0
for i in range(epochs):
    sum_acc = 0.0
    sum_loss = 0.0
    for j in range(train_nbatch):
        x_batch,y_batch = get_batch(train_data, train_batch_size, j)
        feed = {x:x_batch,y:y_batch,keep_prob:0.5,keep_prob2:0.75}
        calc_obj = [grad,loss,acc_num]
        calc_ans = sess.run(calc_obj, feed_dict=feed)
        sum_acc += calc_ans[2]
        sum_loss += calc_ans[1]
    avg_acc = sum_acc / train_size
    avg_loss = sum_loss / train_nbatch

    cnt += 1
    calc_acc(cnt, avg_acc, avg_loss)

전체 접속 계층(fc)
전체 연결층의 매개 변수는tensorflow에서 하나의 매개 변수 매트릭스 W+편향 벡터 b이다. 매트릭스의 행렬 수는 각각 상층의 노드 수와 본층의 노드 수이다. 주의해야 할 것은 매개 변수 W와 신호 X가 연산할 때 X*W로 쓴 행렬 곱셈이고 X는 앞에서 신경망의 공식에 부합된다.
볼륨 레이어(conv)
권적층의 매개 변수도 W와 b로 구성되어 있는데 다른 점은 W의 차원은 더 이상 2차원이 아니라 4차원이다. 구체적으로는 [width,height,in channel,out channel]책에서 묘사한 권적층은 여러 개의 권적핵으로 구성되고 각 권적핵은 너비와 높이가 있으며 상술한 width와 height 두 차원에 대응한다.각 권적은 그림을 스캔해서 특징도를 얻을 수 있는데, 이 몇 장의 특징도는 다음 층으로 전송될 것이다.다음 층에 대해 말하자면 권적핵은 여러 장의 그림을 마주해야 하는데 이것은 처음에 한 장의 그림과 다르다.따라서 우리는 권적층의 정의를 통일해야 한다. 우리는 in 을 설정했다.ch 및 outch 이 두 차원, inch는 이 층의 입력이 몇 장의 그림(채널)이 있는지,outch는 이 층에서 몇 장의 그림을 출력하는지 표시합니다.이로부터 우리는 inch*out_ch개 권적핵, 같은 outch의 권적핵은 inch개, 이들이 권적을 해서 얻은 특징도는 직접 특징도를 덧붙여서 이outch의 출력.흑백 사진에 대해 말하자면, 첫 번째 권적층의 한 통로 입력이다.컬러 사진의 첫 번째 권적층은 3채널 입력(RGB 모드라면)이다.
dropout 레이어
dropout은 일부 신호를 0으로 직접 변하게 하고 버리는 비율은 매개 변수keep 에 달려 있습니다prob(keep prob은 실제로 유지되는 배율임).또한 버리면 신호의 총 강도가 약해지기 때문에 한 수를 곱해서 총 강도의 기대가 변하지 않도록 유지한다.dropout은 과의합을 억제하는 작용을 하는데 특히 전체 연결층에서 뚜렷하게 나타난다.일반적으로dropout은 훈련할 때만 사용하고 테스트할 때dropout(외부입력keep prob로 제어)을 사용하지 않습니다.따라서 훈련 과정 초기에 시험집의 정확도가 훈련집보다 높다는 비정상적인 상황이 나타난다.
flatten 레이어
fc층에 입력할 수 있도록 권적층의 특징도를 1차원 벡터로 변환합니다.
활성화 함수
일반적으로relu 활성화 함수를 사용하고 마지막 층은softmax를 사용합니다.
loss
일반적으로 균형 오차가 아니라 교차 엔트로피를 채택한다.
학습기
서로 다른 학습기의 학습률은 일반적으로 다르다.일반적인 학습기 및 학습률은 다음과 같습니다.
학습기
묘사
학습률
GradientDescentOptimizer
가장 일반적인 계단 하강
1.0
AdadeltaOptimizer
ada 알고리즘이 실현한 사다리 하락
1.0
AdamOptimizer
adam 알고리즘이 실현한 사다리 하락
1e-4
상술한 학습률은 대략적인 수량급일 뿐, 가장 좋은 학습률은 끊임없이 조정해야만 얻을 수 있다.
주의 사항
1. 매개 변수의 초기화
매개 변수의 초기값이 모두 0일 수도 없고 너무 클 수도 없으며, 초기값을 잘못 설정하면 훈련할 수 없습니다.편향 파라미터는 0으로 설정할 수 있고 나머지 일반적인 파라미터는 균일치가 0으로 제어하는 것이 가장 좋고 표준 차이는 0.1을 초과하지 않는 것이 가장 좋으며 균일 분포나 끝부분의 정적 분포 등으로 생성할 수 있다.
2.test에도batch가 필요해
batch가 커지면 소모된 메모리(메모리)가 증가하기 때문에 기계는 종종 전체 테스트 집합을 직접 뛸 수 없기 때문에 테스트를 할 때도 하나하나batch를 진행해야 한다.
3. 교차 엔트로피의 계산이 잘못될 수 있습니다
신경 네트워크의 출력에 1e-10을 강제로 추가하여 뒤에 로그 연산에 로그(0)가 나타나지 않도록 한다.구체적으로 tensorflow 훈련을 참고하여nan의 토론이 나왔다
실행 결과
01:train-loss:0.2149,acc:0.9291   test-loss:0.0469,acc:0.9846
02:train-loss:0.0581,acc:0.9822   test-loss:0.0331,acc:0.9892
03:train-loss:0.0417,acc:0.9876   test-loss:0.0250,acc:0.9918
04:train-loss:0.0355,acc:0.9892   test-loss:0.0242,acc:0.9913
05:train-loss:0.0287,acc:0.9913   test-loss:0.0216,acc:0.9924
06:train-loss:0.0250,acc:0.9924   test-loss:0.0212,acc:0.9929
07:train-loss:0.0227,acc:0.9931   test-loss:0.0210,acc:0.9932
08:train-loss:0.0200,acc:0.9936   test-loss:0.0259,acc:0.9919
09:train-loss:0.0181,acc:0.9943   test-loss:0.0218,acc:0.9924
10:train-loss:0.0166,acc:0.9948   test-loss:0.0221,acc:0.9925

좋은 웹페이지 즐겨찾기