Проблема размера/ранга измерения Tensorflow в функции потерь при обучении

У меня есть пользовательская функция потерь, которая кажется допустимой (нет ошибок при выполнении этих двух строк, как показано ниже)

alpha_cost = 2 cost = tf.reduce_mean(tf.where(tf.less(Y * out, 0), tf.squeeze((alpha_cost*out)**2 - tf.sign(Y)*out + tf.abs(Y)), tf.squeeze(tf.abs(Y - out))))

Однако, когда я фактически продолжаю обучение модели (размер партии 10 000), использование этой функции потерь приводит к следующей ошибке...

InvalidArgumentError (обратную трассировку см. выше): Входные данные для операции Select_4 типа Select должны иметь одинаковый размер и форму. Ввод 0: [1,10000] != ввод 1: [10000] [[Узел: Select_4 = Select[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0" ](Меньше_7, Сжатие_6, Сжатие_7)]]

Может быть, просто нужно добавить еще один tf.squeeze, чтобы сжать размеры... но я попробовал пару, и они не полностью взаимодействуют, так что, возможно, с этим подходом есть более серьезная проблема... спасибо за вашу помощь !


person The Rhyno    schedule 30.03.2018    source источник


Ответы (1)


Используя модуль numpy,

import numpy as np

и определение

input0 = tf.where(tf.less(Y * out, 0)
input1 = tf.squeeze((alpha_cost*out)**2 - tf.sign(Y)*out + tf.abs(Y))

Попробуйте изменить input1 из массива ранга 1 в вектор-строку:

input1 = np.reshape(input1, (1, 10000)) 

Чтобы придать ему ту же форму, что и input0. Вы можете утверждать, что input1 имеет правильную форму:

assert(input1.shape == (1,10000)) 

и убедитесь, что input0 и input1 имеют одинаковые размеры:

assert(input0.shape == input1.shape) 
person Gustav Rasmussen    schedule 30.03.2018
comment
Густав Великий! Спасибо, этот подход сработал. В итоге я использовал небольшое изменение, но тот же ход мысли: Y)*out + tf.abs(Y)) input2 = tf.squeeze(tf.abs(Y - out)) стоимость = tf.reduce_mean(tf.where(input0, input1, input2)) - person The Rhyno; 31.03.2018