Tensorflow реализует потерю crf

Я пытаюсь использовать условную потерю случайного поля в графе Tensorflow.

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

У меня есть последовательность элементов в качестве входных данных [A, B, C, D]. Каждый элемент может принадлежать к одному из 3 разных классов. Классы представлены способом быстрого кодирования: элемент, принадлежащий классу 0, представлен вектором [1, 0, 0].

Мои метки ввода (y) имеют размер (batch_size x sequence_length x num_classes).

Моя сеть производит логиты такой же формы.

Предположим, что все мои последовательности имеют длину 4.

Это мой код:

import tensorflow as tf

sequence_length = 4
num_classes = 3
input_y = tf.placeholder(tf.int32, shape=[None, sequence_length, num_classes])
logits = tf.placeholder(tf.float32, shape=[None, None, num_classes])
dense_y = tf.argmax(input_y, -1, output_type=tf.int32)

log_likelihood, _ = tf.contrib.crf.crf_log_likelihood(logits, dense_y, sequence_length)

Я получаю следующую ошибку:

Файл "", строка 1, в файле "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/crf/python/ops/crf.py", строка 182, в файле crf_log_likelihood transition_params) "/ usr / local / lib / python2.7 / dist-packages / tensorflow / contrib / crf / python / ops / crf.py ", строка 109, в crf_sequence_score false_fn = _multi_seq_fn) Файл" /usr/local/lib/python2.7 /dist-packages/tensorflow/python/layers/utils.py ", строка 206, в прогнозе smart_cond, true_fn = true_fn, false_fn = false_fn, name = name) Файл" /usr/local/lib/python2.7/dist- packages / tensorflow / python / framework / smart_cond.py ", строка 59, в smart_cond name = name) File" /usr/local/lib/python2.7/dist-packages/tensorflow/python/util/deprecation.py ", строка 432, в файле new_func return func (* args, ** kwargs) "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/control_flow_ops.py", строка 2063, в cond orig_res_t, res_t = context_t.BuildCondBranch (true_fn) Файл "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/control_flow_ops.py", строка 1913, в BuildCondBranch original_result = fn () File "/usr/local/lib/python2.7 /dist-packages/tensorflow/contrib/crf/python/ops/crf.py ", строка 95, в _single_seq_fn array_ops.concat ([example_inds, tag_indices], axis = 1)) Файл" / usr / local / lib / python2 .7 / dist-packages / tensorflow / python / ops / gen_array_ops.py ", строка 2975, в gather_nd" GatherNd ", params = params, indices = index, name = name) File" / usr / local / lib / python2. 7 / dist-packages / tensorflow / python / framework / op_def_library.py ", строка 787, в файле _apply_op_helper op_def = op_def)" /usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops .py ", строка 3392, в create_op op_def = op_def) Файл" /usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py ", строка 1734, в init < / strong> control_input_ops) Файл "/ usr / local / li b / python2.7 / dist-packages / tensorflow / python / framework / ops.py ", строка 1570, в _create_c_op поднять ValueError (str (e)) ValueError: indices.shape [-1] должен быть‹ = params.rank , но видел форму индексов: [?, 5] и форму параметров: [?, 3] для 'cond / GatherNd' (op: 'GatherNd') с входными формами: [?, 3], [?, 5]


person alsora    schedule 29.06.2018    source источник


Ответы (1)


Ошибка возникла из-за неправильного размера переменной длины последовательности. Это должен быть вектор, а не скаляр.

import tensorflow as tf

num_classes = 3
input_x = tf.placeholder(tf.int32, shape=[None, None], name="input_x")
input_y = tf.placeholder(tf.int32, shape=[None, sequence_length, num_classes])
sequence_length = tf.reduce_sum(tf.sign(input_x), 1)

# After some network operation you will come up with logits

logits = tf.placeholder(tf.float32, shape=[None, None, num_classes])
dense_y = tf.argmax(input_y, -1, output_type=tf.int32)
log_likelihood, _ = tf.contrib.crf.crf_log_likelihood(logits, dense_y, sequence_length
person alsora    schedule 24.08.2018
comment
Как вы можете использовать это для обучения нейронной сети для сегментации? (например, когда вы используете кросс-энтропию + регуляризацию с потерей CRF). Скажите, что сетевой вывод в вашем коде - это «логиты»; 'input_y' - это реальная маска сегментации (преобразованная в [None, sequence_length, num_classes]). Чтобы оценить стоимость, я бы вычислил: 1) density_y = tf.argmax (input_y, -1, output_type = tf.int32) 2) crf_loss, _ = tf.contrib.crf.crf_log_likelihood (logits, density_y, sequence_length) 3 ) loss = cross_entropy + crf_loss Это правильно? Я что-то пропустил? Спасибо :) - person gab; 04.11.2019