CNN функции (размеры) подачи в LSTM Tensorflow - PullRequest
0 голосов
/ 03 мая 2018

Так что недавно я работаю над проектом, который должен принимать изображения в качестве входных данных для CNN, извлекать функции и передавать их в LSTM для обучения. Я использую 2 Layer CNN для извлечения объектов, и я беру объекты из полностью связанного слоя и пытаюсь передать их в LSTM. Проблема в том, что когда я хочу передать слой FC в LSTM в качестве входных данных, я получаю ошибку, касающуюся неверного измерения Мой слой FC - Тензор с (128,1024) измерением. Я попытался изменить его следующим образом: tf.reshape (fc, [- 1]), который дает мне тензор в порядке (131072,) размер и до сих пор не будет работать. Может ли кто-нибудь дать мне какие-либо идеи о том, как я должен передать ФК в LSTM? Здесь я просто пишу часть своего кода и получаю ошибку.

Сверточный слой с 32 фильтрами и размером ядра 5

conv1 = tf.layers.conv2d(x, 32, 5, activation=tf.nn.relu)
# Max Pooling (down-sampling) with strides of 2 and kernel size of 2
conv1 = tf.layers.max_pooling2d(conv1, 2, 2)

# Convolution Layer with 32 filters and a kernel size of 5
conv2 = tf.layers.conv2d(conv1, 64, 3, activation=tf.nn.relu)
# Max Pooling (down-sampling) with strides of 2 and kernel size of 2
conv2 = tf.layers.max_pooling2d(conv2, 2, 2)

# Flatten the data to a 1-D vector for the fully connected layer
fc1 = tf.contrib.layers.flatten(conv2)

# Fully connected layer (in contrib folder for now)
fc1 = tf.layers.dense(fc1, 1024)
# Apply Dropout (if is_training is False, dropout is not applied)
fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
s = tf.reshape(fc1, [1])
rnn_cell = rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)
outputs, states = rnn.static_rnn(rnn_cell, s, dtype=tf.float32)
return tf.matmul(outputs[-1], rnn_weights['out']) + rnn_biases['out']

вот ошибка: ValueError: Невозможно изменить тензор с 131072 элементами в форму [1] (1 элемент) для 'ConvNet / Reshape' (op: 'Reshape') с входными формами: [128,1024], [1] и с входными тензорами, вычисленными как частичные фигуры: input [1] = [1].

1 Ответ

0 голосов
/ 03 мая 2018

У вас есть логическая ошибка в подходе к проблеме. Свертывание данных в одномерный тензор ничего не решит (даже если вы заставите его работать правильно).

Если вы берете последовательность изображений в качестве входных данных, ваш входной тензор должен быть 5D (batch, sequence_index, x, y, channel) или что-то вроде перестановки. conv2d должен пожаловаться на дополнительное измерение, но вам, вероятно, не хватает одного из них. Вы должны сначала попытаться это исправить.

Затем используйте conv3d и max_pool3d с окном 1 для глубины (поскольку вы не хотите, чтобы на этом этапе взаимодействовали разные кадры).

Когда вы закончите, у вас все еще должен быть 5D-тензор, но размеры x и y должны быть равны 1 (вы должны проверить это и исправить операцию, если это не так).

Часть RNN ожидает 3D-тензоры (batch, sequence_index, fature_index). Вы можете использовать tf.squeeze, чтобы удалить размеры 1 размера из вашего 5D-тензора и получить этот 3D-тензор. Тебе не нужно ничего менять.

Если вы не используете пакеты, это нормально, но операции все равно будут ожидать, что измерение будет там (но для вас это будет 1). Отсутствие размера вызовет проблемы с фигурами вниз по линии.

...