Потеря MSE в тензорном потоке 2.0 ошибочно принимает y_true за ключ сокращения

Я использую очень простую нейронную сеть с последней версией tensorflow 2.0 на ноутбуке jupyter, работающем под управлением python 3.7.0. NN имеет Xip, число с плавающей запятой в качестве вывода, которое я использую в качестве параметра в моей функции MainGaussian

model = tf.keras.models.Sequential()

# Add the layers
model.add(tf.keras.layers.Dense(64, activation="relu"))
model.add(tf.keras.layers.Dense(32, activation="relu"))
model.add(tf.keras.layers.Dense(1, activation="relu"))

# The loss method
loss_object = tf.keras.losses.MeanSquaredError()
# The optimize
optimizer = tf.keras.optimizers.Adam()
# This metrics is used to track the progress of the training loss during the training
train_loss = tf.keras.metrics.Mean(name='train_loss')

def train_step(Data, img):
    MainGaussian_init(Data)
    for _ in range (5):
        with tf.GradientTape() as tape:
            Xip= model( (sizeh**-2 * np.ones((sizeh, sizeh))).reshape(-1, 49))
            MainGaussian_1_U ()
            print ("img=", img)
            loss= tf.keras.losses.MeanSquaredError(img, mk)
            print ("loss=", loss)
        gradients = tape.gradient(loss, model.trainable_variables)
        print (gradients)
        optimizer.apply_gradients(zip(gradients, model.trainable_variables))
        train_loss(loss)

train_step (TestFile, TestFile[4])
U, которая аппроксимирует изображение. Когда я пытаюсь вычислить потерю с помощью MeanSquareError между реальным изображением img и аппроксимацией mk, мне выдается ошибка, в которой функция потерь, кажется, принимает img в качестве ключа сокращения. После поисков я до сих пор понятия не имею, каким должен быть этот ключ, и не могу найти способ отладить свой код:

model = tf.keras.models.Sequential()

# Add the layers
model.add(tf.keras.layers.Dense(64, activation="relu"))
model.add(tf.keras.layers.Dense(32, activation="relu"))
model.add(tf.keras.layers.Dense(1, activation="relu"))

# The loss method
loss_object = tf.keras.losses.MeanSquaredError()
# The optimize
optimizer = tf.keras.optimizers.Adam()
# This metrics is used to track the progress of the training loss during the training
train_loss = tf.keras.metrics.Mean(name='train_loss')

def train_step(Data, img):
    MainGaussian_init(Data)
    for _ in range (5):
        with tf.GradientTape() as tape:
            Xip= model( (sizeh**-2 * np.ones((sizeh, sizeh))).reshape(-1, 49))
            MainGaussian_1_U ()
            print ("img=", img)
            loss= tf.keras.losses.MeanSquaredError(img, mk)
            print ("loss=", loss)
        gradients = tape.gradient(loss, model.trainable_variables)
        print (gradients)
        optimizer.apply_gradients(zip(gradients, model.trainable_variables))
        train_loss(loss)

train_step (TestFile, TestFile[4])

Указана ошибка:

c:\program files\python37\lib\site-packages\tensorflow_core\python\ops\losses\loss_reduction.py:67: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  if key not in cls.all():

...

ValueError: Invalid Reduction Key [[21.05224609 20.79420471 34.9659729  ... 48.09233093 68.83874512
  83.10766602]
 [20.93516541 17.0511322  39.00476074 ... 56.74258423 47.75274658
  98.57067871]
 [38.18562317 22.70791626 24.37176514 ... 64.9606781  47.65338135
  67.61506653]
 ...
 [85.76565552 79.45443726 73.64129639 ... 73.66456604 47.06422424
  49.44664001]
 [87.14616394 82.38183594 77.00856018 ... 66.21652222 71.32862854
  58.39285278]
 [36.74142456 37.27145386 34.52891541 ... 29.58699036 37.37667847
  30.25990295]].

Это мой первый вопрос здесь, в Stack Overflow: пожалуйста, дайте мне знать, если я могу сделать его более ясным!


person Octave Noisette    schedule 17.01.2020    source источник


Ответы (1)


Вы правильно создаете «объект потерь», но никогда его не используете. Вместо этого ваш код пытается создать новый «объект потери» с изображениями в качестве параметров (что не работает). Вместо этого вы хотите поместить изображения в уже созданный объект потерь. Вам просто нужно изменить эту строку

loss= tf.keras.losses.MeanSquaredError(img, mk)

to

loss= loss_object(img, mk)
person xdurch0    schedule 17.01.2020
comment
Большое спасибо! Теперь он вычисляет потери! Однако, когда градиенты отображаются как [Нет, Нет, Нет, Нет, Нет, Нет], и это вызывает ошибку, когда я пытаюсь применить его к обучаемым переменным; ValueError: ни для одной переменной не предусмотрено градиентов: это как-то связано с той же ошибкой, что и первая? Если нет, есть ли что-то еще, что является основным, и я не понимаю? Еще раз, спасибо за ваш первоначальный ответ! - person Octave Noisette; 20.01.2020
comment
А теперь посмотрите на ваш код, что такое mk? Я не вижу, чтобы это было определено где-либо. Вам нужно фактически использовать выходные данные модели в потерях, иначе градиенты не могут быть вычислены. Кроме того, все шаги должны быть дифференцируемыми (определены градиенты). Вы вызываете функцию MainGaussian_1_U, которую я не знаю, что она делает (также MainGaussianInit). Возможно, было бы лучше опубликовать отдельный вопрос со всем соответствующим кодом для этой конкретной проблемы. - person xdurch0; 20.01.2020
comment
Этот код предназначен для декодирования размытого изображения. MainGaussianInit Передает информацию об изображении и размытии (например, их размеры и т. д.). Тогда MainGaussian(sizeh**-2 * np.ones((sizeh, sizeh))).reshape(-1, 49)U представляет одну итерацию декодера. Он обновляет различные переменные, а также предполагаемое изображение: mk. Моя цель - узнать параметр Xip из предполагаемой матрицы размытия (где на данный момент находится заполнитель (sizeh**-2 * np.ones((sizeh, sizeh))).reshape(-1, 49) ), поскольку Xip используется на каждой итерации и сильно меняет производительность декодера. - person Octave Noisette; 20.01.2020