MSE потеря в tenorflow 2.0 ошибки y_true для ключа сокращения - PullRequest
1 голос
/ 17 января 2020

Я использую действительно простую нейронную сеть с последней версией tenorflow 2.0 на ноутбуке Jupyter с python 3.7.0. NN имеет Xip, float в качестве вывода, который я использую в качестве параметра в моей функции MainGaussian_1_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]].

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

1 Ответ

0 голосов
/ 17 января 2020

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

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

на

loss= loss_object(img, mk)
...