TensorFlow-순환 신경망

순환 신경망은 순차적 접근 방식을 따르는 일종의 딥 러닝 지향 알고리즘입니다. 신경망에서 우리는 항상 각 입력과 출력이 다른 모든 계층과 독립적이라고 가정합니다. 이러한 유형의 신경망은 순차적 인 방식으로 수학적 계산을 수행하기 때문에 반복이라고합니다.

순환 신경망을 훈련하기 위해 다음 단계를 고려하십시오.

Step 1 − 데이터 세트에서 구체적인 예를 입력합니다.

Step 2 − 네트워크는 예를 들어 무작위로 초기화 된 변수를 사용하여 몇 가지 계산을 계산합니다.

Step 3 − 그런 다음 예측 결과가 계산됩니다.

Step 4 − 생성 된 실제 결과와 예상 값을 비교하면 오류가 발생합니다.

Step 5 − 오류를 추적하기 위해 변수도 조정 된 동일한 경로를 통해 전파됩니다.

Step 6 − 출력을 얻기 위해 선언 된 변수가 적절하게 정의 될 때까지 1에서 5까지의 단계가 반복됩니다.

Step 7 − 보이지 않는 새로운 입력을 얻기 위해 이러한 변수를 적용하여 체계적인 예측이 이루어집니다.

순환 신경망을 나타내는 개략적 인 접근 방식은 다음과 같습니다.

TensorFlow를 사용한 반복 신경망 구현

이 섹션에서는 TensorFlow를 사용하여 순환 신경망을 구현하는 방법을 배웁니다.

Step 1 − TensorFlow에는 반복 신경망 모듈의 특정 구현을위한 다양한 라이브러리가 포함되어 있습니다.

#Import necessary modules
from __future__ import print_function

import tensorflow as tf
from tensorflow.contrib import rnn
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot = True)

위에서 언급했듯이 라이브러리는 반복적 인 신경망 구현의 주요 부분을 형성하는 입력 데이터를 정의하는 데 도움이됩니다.

Step 2− 우리의 주된 동기는 반복 신경망을 사용하여 이미지를 분류하는 것입니다. 여기서 모든 이미지 행을 픽셀 시퀀스로 간주합니다. MNIST 이미지 모양은 특히 28 * 28 픽셀로 정의됩니다. 이제 언급 된 각 샘플에 대해 28 개 단계의 28 개 시퀀스를 처리합니다. 순차적 패턴을 완성하기 위해 입력 매개 변수를 정의합니다.

n_input = 28 # MNIST data input with img shape 28*28
n_steps = 28
n_hidden = 128
n_classes = 10

# tf Graph input
x = tf.placeholder("float", [None, n_steps, n_input])
y = tf.placeholder("float", [None, n_classes]
weights = {
   'out': tf.Variable(tf.random_normal([n_hidden, n_classes]))
}
biases = {
   'out': tf.Variable(tf.random_normal([n_classes]))
}

Step 3− 최상의 결과를 얻기 위해 RNN에서 정의 된 함수를 사용하여 결과를 계산합니다. 여기에서 각 데이터 모양을 현재 입력 모양과 비교하고 결과를 계산하여 정확도를 유지합니다.

def RNN(x, weights, biases):
   x = tf.unstack(x, n_steps, 1)

   # Define a lstm cell with tensorflow
   lstm_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)

   # Get lstm cell output
   outputs, states = rnn.static_rnn(lstm_cell, x, dtype = tf.float32)

   # Linear activation, using rnn inner loop last output
   return tf.matmul(outputs[-1], weights['out']) + biases['out']

pred = RNN(x, weights, biases)

# Define loss and optimizer
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)

# Evaluate model
correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# Initializing the variables
init = tf.global_variables_initializer()

Step 4−이 단계에서는 계산 결과를 얻기 위해 그래프를 시작합니다. 이것은 또한 테스트 결과의 정확도를 계산하는 데 도움이됩니다.

with tf.Session() as sess:
   sess.run(init)
   step = 1
   # Keep training until reach max iterations
   
   while step * batch_size < training_iters:
      batch_x, batch_y = mnist.train.next_batch(batch_size)
      batch_x = batch_x.reshape((batch_size, n_steps, n_input))
      sess.run(optimizer, feed_dict={x: batch_x, y: batch_y})
      
      if step % display_step == 0:
         # Calculate batch accuracy
         acc = sess.run(accuracy, feed_dict={x: batch_x, y: batch_y})
         
         # Calculate batch loss
         loss = sess.run(cost, feed_dict={x: batch_x, y: batch_y})
         
         print("Iter " + str(step*batch_size) + ", Minibatch Loss= " + \
            "{:.6f}".format(loss) + ", Training Accuracy= " + \
            "{:.5f}".format(acc))
      step += 1
   print("Optimization Finished!")
      test_len = 128
   test_data = mnist.test.images[:test_len].reshape((-1, n_steps, n_input))
   
   test_label = mnist.test.labels[:test_len]
   print("Testing Accuracy:", \
      sess.run(accuracy, feed_dict={x: test_data, y: test_label}))

아래 스크린 샷은 생성 된 출력을 보여줍니다.