Tensorflow, реализующий потерю crf - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь использовать условную случайную потерю поля в графе 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 pred, 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 Имя = имя) Файл "/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 () Файл "/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, в collect_nd "GatherNd", params = params, индексы = индексы, имя = имя) Файл "/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 control_input_ops) Файл "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", строка 1570, в _create_c_op поднять ValueError (str (e)) ValueError: indices.shape [-1] должен быть <= params.rank, но должен иметь форму индексов: [?, 5] и форму params: [?, 3] для 'cond / GatherNd' (op: 'GatherNd') с формы ввода: [?, 3], [?, 5] </p>

1 Ответ

0 голосов
/ 24 августа 2018

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

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
...