2017-03-14 1 views
0

Tensorflow에서 간단한 LSTM 구현과 치수 문제가 있습니다. 그래서, 내Tensorflow RNN 모양이 일치하지 않습니다. logits_size = [5,2] labels_size = [50,2] - 일괄 처리 크기가 10입니다.

batch size = 10 
time_steps = 5 
num_classes = 2 
input_size = 4 

자리 표시자는

y = tf.placeholder('float',[None,None,num_classes])

은 내가 _x.shape = (10, 5, 4)을 설정 한 csv 파일

_, c = sess.run([optimizer, cost], feed_dict={x: _x, y: _y}) 에서 데이터를 공급함으로써 실행

x = tf.placeholder('float',[None,time_steps,input_size])

있습니다 _y.shape = (10, 5, 2) i TF의 (batch,time_steps, input_size) 요구 사항에 따라.

저는 인터넷 및 블로그 게시물에서 몇 가지 구현 (주로 MNIST 데이터 세트)을 수행했으며 어떻게 작동하는지 이해했다고 생각합니다. TF는 logits 및 labels 인수가 batch_size 행 및 num_classes 열을 사용하여 2 차원 텐서가 될 것으로 예상합니다. 이제 각 항목에 분류 레이블이 있습니다. 나는 그것들을 원 핫 포맷으로 변환했다. 데이터에서 총 50 개의 항목을 제공하면 50 개의 레이블도 제공해야합니다. 맞습니까?

y 자리 표시자를 [None,num_classes]으로 변경하면 결과적으로 오류가 발생합니다.

하지만 내 batch_size 1로 변경하는 경우, I 라인 I 오류가 발생하는

correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1)) 때까지 실행하는 코드를 얻을 수 y는 (?, ?, 2)

반면 예측 모양 (5, 2)입니다 ValueError: Dimensions must be equal, but are 5 and 2 for 'Equal' (op: 'Equal') with input shapes: [5], [?,2]. 때문에

그것이 어떻게 작동해야 하는지를 이해하는데 근본적인 실수가 있습니까?

전체 코드

Simple RNN Gist

감사

코드의

답변

1

라인 (30)이 RNN의 출력 이상한 무언가를에서 볼 수 있습니다. RNN은 슬라이싱 작업 (출력 [-1])으로 2D가되는 일반적으로 3D 텐서 (batch_size, time_steps, cell_output_dim)를 출력합니다. 분명히 손실 함수는 이런 종류의 텐서를 기대하지 않으므로 오류가 발생합니다. 다차원 텐서에 Feedforward 신경망을 적용하려면 tf.contrib.layers.fully_connected 함수를 사용하여 네트워크의 가중치를 자동으로 생성하고 입력 텐서에 올바른 연산을 적용하는 것이 좋습니다.

코드에 다른 오류가 있습니다. softmax_cross_entropy_with_logits를 3D 텐서에 적용하려고합니다. 불행하게도 그렇게 할 수 없으므로 다음을 수행해야합니다.

  1. 텐서를 크기에 맞게 재구성합니다 (batch_size * time_steps, num_classes);
  2. softmax_cross_entropy_with_logits (지금 올바르게 적용될 수 있음)를 사용하여 batch_size * time_steps 예제 각각에 대해 손실 함수를 적용하십시오.
  3. 평균 손실 값 (손실 가능성 값을 원하는대로 집계 할 수 있습니다).

귀하의 데이터가 없으므로 여기에 완전한 해결책을 제공 할 수 없으므로 코드를 정확하게 실행할 수 없습니다. 그러나 다음 간단한 스 니펫을보고하겠습니다.

import tensorflow as tf 
import numpy as np 
from tensorflow.contrib import rnn 

num_classes = 2 
batch_size = 10 
time_steps = 5 

#input has 4 features 
input_size = 4 
num_hidden = 6 

x = tf.placeholder('float',[None,time_steps,input_size]) 
y = tf.placeholder('float',[None,None,num_classes]) 

def neural_net_model(data): 
    lstmCell = rnn.BasicLSTMCell(num_hidden) 

    outputs, state = tf.nn.dynamic_rnn(lstmCell,x, dtype=tf.float32) 
    print(outputs) 

    output = tf.contrib.layers.fully_connected(
     outputs, 
     num_classes, 
     weights_initializer=tf.random_normal_initializer() 
    ) 
    return output 

def train_neural_net(x): 
    num_epochs = 2 
    num_examples = 1000 #np_df.shape[0] - reduced to 1000 for debugging 
    with tf.Session() as sess: 
     predictions = neural_net_model(x) 
     reshaped_predictions = tf.reshape(predictions, (-1, num_classes)) 
     reshaped_targets = tf.reshape(y, (-1, num_classes)) 
     cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=reshaped_predictions,labels=reshaped_targets)) 
+0

감사 : 이것은 작동하는 것 같습니다. 그래서 제가 모은 것에서,이 예제에서 3D 라벨 (제 경우에는 10x5x2) 형태로 레이블을 제공하면 비용 함수를 적용하기 전에 2D 텐서 (여기서는 50x2)로 축소해야합니다 ? 그리고 3D 매트릭스의 형태로 반환되는 예측에 대해 동일한 작업을 수행해야했습니다. –

+0

정확합니다. 사실 이것은 내가 간략하게 설명한 간단한 발췌 문장에서 내가하는 일입니다. 당신이 대답에 만족하는 경우 그것을 해결로 표시 자유롭게 :) –

+0

미심쩍어 의심 그래서 내가 여기에 스스로 물어 볼 수도 있습니다. 이 경우 CSV 파일에서 행을 가져 와서 형식을 지정하여 모델에 공급하는 경우 일부 테스트 데이터 (또는 교육 자체)의 정확도를 계산하는 방법은 무엇입니까? 간단한'sess.run (정확도, feed_dict = {x : mnist.test.images, y_ : mnist.test.labels})'은 충분하지 않습니다. 약간의 명확성을주기 위해 요점을 업데이트했습니다. 고마워요. –

관련 문제