2016-07-18 4 views
2

Tensorflow에서 3D 데이터를 처리하는 LSTM RNN을 작성하려고합니다. this 용지에서 Grid LSTM RNN은 n 차원 일 수 있습니다. 내 네트워크에 대한 아이디어는 3D 볼륨이 [depth, x, y]이고 네트워크가 [depth, x, y, n_hidden]이어야합니다. 여기서 n_hidden은 LSTM 셀 재귀 호출 수입니다. 아이디어는 각 픽셀이 LSTM 재귀 호출의 자체 "문자열"을 얻는다는 것입니다.Tensorflow Grid LSTM RNN TypeError

출력은 [depth, x, y, n_classes]이어야합니다. 그것은 RNN를 사용하는 초기화 이후에 발생 TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

: 전경과 배경을 생각하는, 그래서 클래스의 수는 현재 내가 오류를 받고 있어요 2.

# Network Parameters 
n_depth = 5 
n_input_x = 200 # MNIST data input (img shape: 28*28) 
n_input_y = 200 
n_hidden = 128 # hidden layer num of features 
n_classes = 2 

# tf Graph input 
x = tf.placeholder("float", [None, n_depth, n_input_x, n_input_y]) 
y = tf.placeholder("float", [None, n_depth, n_input_x, n_input_y, n_classes]) 

# Define weights 
weights = {} 
biases = {} 

# Initialize weights 
for i in xrange(n_depth * n_input_x * n_input_y): 
    weights[i] = tf.Variable(tf.random_normal([n_hidden, n_classes])) 
    biases[i] = tf.Variable(tf.random_normal([n_classes])) 

def RNN(x, weights, biases): 

    # Prepare data shape to match `rnn` function requirements 
    # Current data input shape: (batch_size, n_input_y, n_input_x) 
    # Permuting batch_size and n_input_y 
    x = tf.reshape(x, [-1, n_input_y, n_depth * n_input_x]) 
    x = tf.transpose(x, [1, 0, 2]) 
    # Reshaping to (n_input_y*batch_size, n_input_x) 

    x = tf.reshape(x, [-1, n_input_x * n_depth]) 

    # Split to get a list of 'n_input_y' tensors of shape (batch_size, n_hidden) 
    # This input shape is required by `rnn` function 
    x = tf.split(0, n_depth * n_input_x * n_input_y, x) 

    # Define a lstm cell with tensorflow 
    lstm_cell = grid_rnn_cell.GridRNNCell(n_hidden, input_dims=[n_depth, n_input_x, n_input_y]) 
    # lstm_cell = rnn_cell.MultiRNNCell([lstm_cell] * 12, state_is_tuple=True) 
    # lstm_cell = rnn_cell.DropoutWrapper(lstm_cell, output_keep_prob=0.8) 
    outputs, states = rnn.rnn(lstm_cell, x, dtype=tf.float32) 
    # Linear activation, using rnn inner loop last output 
    # pdb.set_trace() 

    output = [] 
    for i in xrange(n_depth * n_input_x * n_input_y): 
     #I'll need to do some sort of reshape here on outputs[i] 
     output.append(tf.matmul(outputs[i], weights[i]) + biases[i]) 

    return output 


pred = RNN(x, weights, biases) 
pred = tf.transpose(tf.pack(pred),[1,0,2]) 
pred = tf.reshape(pred, [-1, n_depth, n_input_x, n_input_y, n_classes]) 
# pdb.set_trace() 
temp_pred = tf.reshape(pred, [-1, n_classes]) 
n_input_y = tf.reshape(y, [-1, n_classes]) 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(temp_pred, n_input_y)) 

이다 - 나는 이진 분할을하고 있어요 물론 outputs, states = rnn.rnn(lstm_cell, x, dtype=tf.float32)

x 내가 여기 유형 GridRNNCell 반환, 어떤 helpe 말씀 드릴 수 없습니다

유형 float32이다? 이것은 문제 일 수 있습니다. 이것에 대한 더 많은 논쟁을 정의해야합니까? input_dims은 의미가 있지만 무엇을 output_dims으로해야합니까?

contrib 코드의 버그입니까?

GridRNNCell가있는 contrib에 위치/grid_rnn/파이썬/작전/grid_rnn_cell.py

+0

저는이 인터페이스를 살펴 보겠습니다. 귀하의 질문에 대한 답을 모르겠지만 input_dims를 크기가 아닌 차원으로 나타내야합니까? – jstaker7

+0

@ jstaker7 올바른지, input_dims가 올바르지 않습니다. 나는 옳은 것이 무엇인지 모른다. 이 param을 이해합니까? –

+0

아직 확실하지 않습니다. 원래 pull 요청에 대한 설명을 요청했습니다. https://github.com/tensorflow/tensorflow/pull/1665 – jstaker7

답변

2

어떤 Grid LSTM 셀 버전을 사용하고 있습니까?

당신이 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/rnn/python/ops/rnn_cell.py

를 사용하는 경우 당신이 'feature_size'와 'frequency_skip를'초기화를 시도 할 수 있습니다 생각합니다. 또한 다른 버그가있을 수 있습니다. 이 버전에 동적 모양을 제공하면 TypeError가 발생할 수 있습니다.

+0

"동적 인 모양을 먹이는 것"이 ​​맞을 것 같아요.하지만 지금은 다른 프로젝트에서 바쁘다 고 생각합니다. –

+0

동적 모양을 먹이면 - '없음'-이 원인이되었습니다. 문제 –

3

내가 코드의 구현 결정의 일부군요, 그래서 내 자신의 롤 결정했다. 명심해야 할 것은 이것이 셀의 구현이라는 것입니다. h와 m 벡터의 위치와 상호 작용을 처리하는 실제 기계를 만드는 것은 당신에게 달려 있으며 데이터를 전달하고 차원을 적절하게 통과 할 것으로 기대하는 것처럼 간단하지는 않습니다.

예를 들어, 2 차원에서 작업하는 경우 왼쪽 상단 블록부터 시작하여 들어오는 x 및 y 벡터를 가져 와서 함께 연결 한 다음 셀을 사용하여 출력을 계산합니다 (두 가지 모두에 대해 보내는 벡터 포함). x 및 y); 나중에 이웃 블록에 사용하기 위해 출력을 저장하는 것은 사용자의 몫입니다. 출력을 각 해당 치수에 개별적으로 전달하고 이웃하는 각 블록에서 들어오는 벡터를 다시 연결하고 각 치수에 대해 인접한 블록의 출력을 계산합니다. 이렇게하려면 두 개의 for-loop가 필요합니다 (각 차원마다 하나씩).

아마도 contrib의 버전이 여기에서 작동하지만 몇 가지 문제가 있습니다. (내가 잘못 생각할 수도 있지만 가능한 한 멀리 말할 수 있습니다.) 1) 벡터는 concat 및 slice를 사용하여 처리됩니다. 튜플보다. 이로 인해 성능이 저하 될 수 있습니다. 2) 입력 단계가 각 단계에서 예상되는 것처럼 보이는데, 이는 나와 잘 어울리지 않습니다. 이 논문에서는 네트워크 전체에 걸쳐서가 아니라 그리드 에지를 따라 들어오는 블록에 대해서만 네트워크로 투영합니다.

코드를 보면 실제로 매우 간단합니다. 아마도 종이를 읽고 필요에 따라 코드를 조정하거나 자신의 코드를 조정하는 것이 최선의 방법입니다. 그리고이 셀은 각 단계에서 재발을 수행 할 때만 유용하며 수신 및 송신 h 및 m 벡터를 관리하는 데 적합하지 않음을 기억하십시오.

2

예, 동적 모양이 원인이었습니다. 이 문제를 해결하기위한 홍보가 있습니다. https://github.com/tensorflow/tensorflow/pull/4631

@ jstaker7 : 사용해 주셔서 감사합니다. 레. 문제 1, 위의 홍보 상태와 출력에 대한 튜플을 사용하여, 잘하면 성능 문제를 해결할 수 있습니다. GridRNNCell이 얼마 전 생성되었지만 Tensorflow의 모든 LSTMCell에는 터플 대신 concat/slice가 사용되었습니다.

Re. 문제 2, GridRNNCellNone을 전달하면 입력을 투영하지 않습니다. 차원은 입력반복 될 수 있으며이 될 수 있으며 입력이 없으면 계산을 위해 순환하는 텐서를 사용합니다. GridRNNCell을 직접 인스턴스화하여 2 개의 입력 크기를 사용할 수도 있습니다.

물론 모든 경우에 대해 일반적인 클래스를 작성하면 코드가 복잡해 보이고 더 나은 문서화가 필요하다고 생각합니다.

어쨌든 당신이 개선점을 공유 할 수 있다면 좋을 것입니다. 어쨌든 오픈 소스 프로젝트의 본질입니다.

+0

듣고 기쁘게 생각합니다. :) 불행히도 대답은 답변이어야하며 주석이 아니어야한다는 엄격한 정책이 있습니다. 당신은 당신의 포스트를 바꾸려고 할 수 있습니까? 나는 그것이 유용한 정보를 포함하고 있을지도 모른다고 생각하지만 _ 나는 아직 말할 수 없다. '스타일'의 '답변'은 대개 꽤 빨리 삭제된다. – m00am

관련 문제