Как игнорировать часть ввода и вывода в керасе? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь обучить модель, которая принимает n значений в качестве входных и выходных n значений. Проблема в том, что n может быть от 1 до 700. Поэтому я строю сеть с 700 в качестве входа и 700 в качестве выхода. Дополнительные входы и выходы установлены на ноль. При обучении модели мне не важно, точны ли дополнительные результаты или нет. Поэтому я попытался определить свою собственную функцию потерь следующим образом:

def mse_truncate(y_true, y_pred):
    def fn(x):
        return tf.cond(x < 0.01,lambda: 0.0,lambda: 1.0)
    #Ignore the square error if y_true[i] is near zero
    sgn = tf.map_fn(fn,y_true)
    return K.mean(sgn * K.square(y_true-y_pred),axis=-1)

Эта функция работает на консоли. Но когда я компилирую модель, я получаю сообщение об ошибке:

model.compile(optimizer='sgd',loss=mse_truncate, metrics=['accuracy'])
ValueError: Shape must be rank 0 but is rank 1 for 'loss_5/dense_2_loss/map/while/cond/Switch' (op: 'Switch') with input shapes: [?], [?].

Может кто-нибудь сказать мне, что здесь не так? Или есть более эффективные способы обработки ввода и вывода переменной длины?

Примечание: Более подробно о проблеме: входные данные представляют собой последовательность (длина <= 700), а выходные данные - это расстояние между первым элементом и каждым элементом в последовательности. </p>

1 Ответ

0 голосов
/ 01 мая 2019

Вы можете использовать tf.where и tf.gather, чтобы принимать во внимание только те значения, о которых вы заботитесь, например ::

indices = tf.where(tf.greater(y_true, 0.01)) #  or `tf.less`, `tf.equal` etc.
loss = K.mean(K.square(tf.gather(y_true, indices) - tf.gather(y_pred, indices))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...