В моей реализации RNN LSTM я использовал следующую строку кода:
self.batch_size = tf.shape(x)[0]
Где x был тензор, полученный из API набора данных.Печать x дала следующий вывод:
Tensor("IteratorGetNext:0", shape=(?, 2, 1024), dtype=float32)
Остальная часть моего кода дана как
targets = tf.one_hot(y,num_classes)
cell = tf.contrib.rnn.BasicLSTMCell
cells = [cell(num_units=n) for n in num_units]
stacked_rnn_cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)
initial_state = stacked_rnn_cell.zero_state(self.batch_size, tf.float32)
...
output, state = tf.nn.dynamic_rnn(
stacked_rnn_cell, prev_output, initial_state = initial_state, dtype = tf.float32,
sequence_length = [1024]*self.batch_size)
logits = tf.contrib.layers.fully_connected(output[-1],24)
xent = tf.nn.softmax_cross_entropy_with_logits_v2(labels = targets, logits = logits)
self.loss = tf.reduce_mean(xent)
self.opt = tf.train.GradientDescentOptimizer(0.01).\
minimize(self.loss,global_step=global_step)
self.metric_loss,self.update_loss = tf.metrics.mean(self.loss)
self.summary = tf.summary.scalar('Loss',self.update_loss)
Я столкнулся с ошибкой:
InvalidArgumentError (see above for traceback): ConcatOp : Dimensions of inputs should match: shape[0] = [1024,2] vs. shape[1] = [1,128]
1024 - это размер пакета, 2 - размер ввода, 128 - размер состояния.
Если я изменю первую строку на
self.batch_size = 1024
или любое другое постоянное число, оно будет обучено.Я бы предпочел не обрабатывать это с помощью заполнителей, а просто вывести значение из образца данных, чтобы я мог сохранить его в общих чертах.Есть идеи?