【问题标题】:MSE loss in tensorflow 2.0 mistakes y_true for a reduction keytensorflow 2.0 中的 MSE 损失将 y_true 错误作为归约键
【发布时间】:2020-01-17 15:39:59
【问题描述】:

我在运行 python 3.7.0 的 jupyter notebook 上使用了一个非常简单的神经网络和最新版本的 tensorflow 2.0。 NN 有 Xip,一个浮点数作为输出,我在我的函数 MainGaussian_1_U 中使用它作为参数,它近似于一个图像。当我尝试使用真实图像 img 和近似值 mk 之间的 MeanSquareError 计算损失时,我得到一个错误,其中损失函数似乎将 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 上的第一个问题:如果我能把它说得更清楚一些,请告诉我!

【问题讨论】:

    标签: python-3.x tensorflow tensorflow2.0 mean-square-error


    【解决方案1】:

    您正确地创建了“损失对象”,但从不使用它。相反,您的代码尝试使用图像作为参数创建一个新的“损失对象”(这不起作用)。相反,您希望将图像放入已经创建的损失对象中。你只需要改变这一行

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

    loss= loss_object(img, mk)
    

    【讨论】:

    • 非常感谢!它现在计算损失!但是,当梯度显示为 [None, None, None, None, None, None] 并且当我尝试将其应用于可训练变量时会导致错误; “ValueError:没有为任何变量提供梯度:”这是否与第一个错误类型相同?如果没有,还有其他基本的东西我不明白吗?再次感谢您的初步回答!
    • 呃,现在看看你的代码,mk 是什么?我没有看到它在任何地方定义。您需要在损失中实际使用模型的输出,否则无法计算梯度。此外,所有步骤都必须是可微的(定义了梯度)。你正在调用一个函数MainGaussian_1_U,我不知道它做了什么(也是MainGaussianInit)。最好发布一个单独的问题,其中包含此特定问题的所有相关代码。
    • 此代码用于解码模糊图像。 MainGaussianInit 是否传递有关图像和模糊器的信息(例如它们的大小等)。那么 MainGaussian_1_U 代表解码器的一次迭代。它更新各种变量以及估计的图像:mk。我的目标是从估计的模糊矩阵(现在是占位符 (sizeh**-2 * np.ones((sizeh, sizeh))).reshape(-1, 49) )中学习参数 Xip,因为 Xip 在每次迭代中都会使用,并且解码器的性能会发生很大变化
    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2020-11-18
    • 2019-02-03
    相关资源
    最近更新 更多