Можете ли вы сопоставить выходные метки с символами, чтобы было легче увидеть, что выводит NN. Может быть, компоненты NN подключены неправильно. Я не знаю вашу спецификацию архитектуры json-типа, которую вы используете. Однако важно правильно подключить компоненты, например, в моей системе HTR RNN выводит тензор формы BxTxC, в то время как CTC нуждается в TxBxC в качестве ввода. Поэтому я должен перенести тензор между RNN и CTC.

нирую модель распознавания почерка этой архитектуры:

{
"network": [
{
"layer_type": "l2_normalize"
},
{
"layer_type": "conv2d",
"num_filters": 16,
"kernel_size": 5,
"stride": 1,
"padding": "same"
},
{
"layer_type": "max_pool2d",
"pool_size": 2,
"stride": 2,
"padding": "same"
},
{
"layer_type": "l2_normalize"
},
{
"layer_type": "dropout",
"keep_prob": 0.5
},
{
"layer_type": "conv2d",
"num_filters": 32,
"kernel_size": 5,
"stride": 1,
"padding": "same"
},
{
"layer_type": "max_pool2d",
"pool_size": 2,
"stride": 2,
"padding": "same"
},
{
"layer_type": "l2_normalize"
},
{
"layer_type": "dropout",
"keep_prob": 0.5
},
{
"layer_type": "conv2d",
"num_filters": 64,
"kernel_size": 5,
"stride": 1,
"padding": "same"
},
{
"layer_type": "max_pool2d",
"pool_size": 2,
"stride": 2,
"padding": "same"
},
{
"layer_type": "l2_normalize"
},
{
"layer_type": "dropout",
"keep_prob": 0.5
},
{
"layer_type": "conv2d",
"num_filters": 128,
"kernel_size": 5,
"stride": 1,
"padding": "same"
},
{
"layer_type": "max_pool2d",
"pool_size": 2,
"stride": 2,
"padding": "same"
},
{
"layer_type": "l2_normalize"
},
{
"layer_type": "dropout",
"keep_prob": 0.5
},
{
"layer_type": "conv2d",
"num_filters": 256,
"kernel_size": 5,
"stride": 1,
"padding": "same"
},
{
"layer_type": "max_pool2d",
"pool_size": 2,
"stride": 2,
"padding": "same"
},
{
"layer_type": "l2_normalize"
},
{
"layer_type": "dropout",
"keep_prob": 0.5
},
{
"layer_type": "collapse_to_rnn_dims"
},
{
"layer_type": "birnn",
"num_hidden": 128,
"cell_type": "LSTM",
"activation": "tanh"
}
],
"output_layer": "ctc_decoder"
}

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

Я должен упомянуть, что длина последовательности каждой выборки действительно близка к длине самой длинной наземной истины (то есть с 1024, она становится 32 к тому времени, как она входит в ctc_loss, которая близка к самой длинной длине наземной истины 21).

Что касается предварительной обработки изображений, я позаботился о том, чтобы у них сохранялось соотношение сторон при изменении его размера, и подправил изображение вправосделать его квадратным так что все изображения будут иметь ширину, а рукописные слова будут слева. Я также инвертировал цвет изображений так, чтобы рукописные символы имели самое высокое значение пикселя (255) и фон, в то время как остальные имеют самое низкое значение пикселя (0).

Предсказания примерно такие. Случайный набор строкв первой части, затем группа нулей в конце (что, вероятно, ожидается из-за заполнения).

INFO:tensorflow:outputs = [[59 45 59 45 59 55 59 55 59 45 59 55 59 55 59 55 45 59  8 59 55 45 55  8
  45  8 45 59 45  8 59  8 45 59 45  8 45 19 55 45 55 45 55 59 45 59 45  8
  45  8 45 55  8 45  8 45 59 45 55 59 55 59  8 55 59  8 45  8 45  8 59  8
  59 45 59 45 59 45 59 45 59 45 59 45 19 45 55 45 22 45 55 45 55  8 45  8
  59 45 59 45 59 45 59 55  8 45 59 45 59 45 59 45 19 45 59 45 19 59 55 24
   4 52 54 55]]

Вот как мне свернуть вывод cnn в rnn dims:

def collapse_to_rnn_dims(inputs):
    batch_size, height, width, num_channels = inputs.get_shape().as_list()
    if batch_size is None:
        batch_size = -1
    time_major_inputs = tf.transpose(inputs, (2, 0, 1, 3))
    reshaped_time_major_inputs = tf.reshape(time_major_inputs,
                                            [width, batch_size, height * num_channels]
                                            )
    batch_major_inputs = tf.transpose(reshaped_time_major_inputs, (1, 0, 2))
    return batch_major_inputs

И вот как я рухну RNN на CTC DIMS:

def convert_to_ctc_dims(inputs, num_classes, num_steps, num_outputs):
    outputs = tf.reshape(inputs, [-1, num_outputs])
    logits = slim.fully_connected(outputs, num_classes,
                                  weights_initializer=slim.xavier_initializer())
    logits = slim.fully_connected(logits, num_classes,
                                  weights_initializer=slim.xavier_initializer())
    logits = tf.reshape(logits, [num_steps, -1, num_classes])
    return logits

Ответы на вопрос(0)

Ваш ответ на вопрос