Tensorflow Grid LSTM RNN TypeError

python machine-learning tensorflow neural-network lstm

1808 просмотра

3 ответа

978 Репутация автора

Я пытаюсь создать LSTM RNN, который обрабатывает трехмерные данные в Tensorflow. Из этой статьи сетка LSTM RNN может быть n-мерной. Идея для моей сети состоит в том, чтобы иметь трехмерный том, [depth, x, y]и сеть должна быть [depth, x, y, n_hidden]там, где n_hiddenнаходится число рекурсивных вызовов соты LSTM. Идея состоит в том, что каждый пиксель получает свою собственную «строку» рекурсивных вызовов LSTM.

Выход должен быть [depth, x, y, n_classes]. Я делаю бинарную сегментацию - думаю, передний план и фон, так что количество классов просто 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))

В настоящее время я получаю сообщение об ошибке: TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

Это происходит после инициализации RNN: outputs, states = rnn.rnn(lstm_cell, x, dtype=tf.float32)

x конечно типа float32

Я не могу сказать, какой тип GridRNNCellвозвращает, любая помощь здесь? Это может быть проблемой. Должен ли я определить больше аргументов для этого? input_dimsимеет смысл, но что должно output_dimsбыть?

Это ошибка в contribкоде?

GridRNNCell находится в contrib / grid_rnn / python / ops / grid_rnn_cell.py

Автор: Kendall Weihe Источник Размещён: 18.07.2016 04:44

Ответы (3)


3 плюса

631 Репутация автора

Я не был уверен в некоторых решениях по реализации кода, поэтому решил свернуть свои собственные. Следует иметь в виду, что это реализация только ячейки. Вы должны создать реальный механизм, который обрабатывает местоположения и взаимодействия векторов h и m и не так прост, как передача ваших данных и ожидание того, что они должным образом пройдут измерения.

Так, например, если вы работаете в двух измерениях, начните с верхнего левого блока, возьмите входящие векторы x и y, объедините их вместе, а затем используйте вашу ячейку для вычисления результата (который включает в себя исходящие векторы как для x, так и для y) ; и это зависит от вас, чтобы сохранить выходные данные для последующего использования в соседних блоках. Передайте эти выходные данные по отдельности в каждое соответствующее измерение и в каждом из этих соседних блоков объедините входящие векторы (опять же, для каждого измерения) и вычислите выходные данные для соседних блоков. Для этого вам понадобятся два цикла for, по одному для каждого измерения.

Возможно, версия в contrib будет работать для этого, но у меня есть пара проблем (я могу ошибаться, но насколько я могу судить): 1) Векторы обрабатываются с использованием concat и slice, а не с кортежами. Это может привести к снижению производительности. 2) Похоже, что входные данные проецируются на каждом шаге, что мне не подходит. В статье они только проецируют в сеть входящие блоки по краю сетки, а не по всей.

Если вы посмотрите на код, он на самом деле очень прост. Возможно, чтение газеты и внесение корректировок в код по мере необходимости или прокрутка собственного - ваш лучший выбор. И помните, что ячейка хороша только для выполнения повторения на каждом шаге, а не для управления входящими и исходящими векторами h и m.

Автор: jstaker7 Размещён: 25.07.2016 11:55

2 плюса

36 Репутация автора

Решение

какую версию ячеек Grid LSTM вы используете?

Если вы используете https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/rnn/python/ops/rnn_cell.py

Я думаю, вы можете попытаться инициализировать «feature_size» и «interval_skip». Кроме того, я думаю, что может существовать еще одна ошибка. Подача динамической фигуры в эту версию может вызвать ошибку TypeError

Автор: automan Размещён: 27.07.2016 03:44

2 плюса

106 Репутация автора

Да, динамическая форма была причиной. Существует PR, чтобы исправить это: https://github.com/tensorflow/tensorflow/pull/4631

@ jstaker7: Спасибо, что попробовали. Число рейнольдса проблема 1, вышеупомянутый PR использует кортежи для состояний и выходов, мы надеемся, что это может решить проблему производительности. GridRNNCellбыл создан некоторое время назад, тогда все участники LSTMCellTensorflow использовали concat / slice вместо tuple.

Число рейнольдса проблема 2, GridRNNCellне будет проецировать ввод, если вы передадите None. Измерение может быть как входным, так и рекуррентным , и когда нет input ( inputs = None), оно будет использовать рекурсивные тензоры для вычисления. Мы также можем использовать 2 входных измерения, создавая экземпляр GridRNNCellнепосредственно.

Конечно, написание универсального класса для всех случаев делает код немного запутанным, и я думаю, что ему нужна лучшая документация.

В любом случае, было бы замечательно, если бы вы могли поделиться своими улучшениями или любой идеей, которая может вам понадобиться, чтобы сделать ее более понятной / более полезной. В любом случае это природа проекта с открытым исходным кодом.

Автор: vu.pham Размещён: 28.09.2016 09:06
Вопросы из категории :
32x32