【问题标题】:Tensorflow 1.15 / Keras 2.3.1 Model.train_on_batch() returns more values than there are outputs/loss functionsTensorflow 1.15 / Keras 2.3.1 Model.train_on_batch() 返回的值多于输出/损失函数
【发布时间】:2021-06-14 21:31:21
【问题描述】:

我正在尝试训练一个具有多个输出的模型,因此在我编译它时也附加了多个损失函数。

我过去没有做过类似的事情(至少不是从头开始)。

这是我用来弄清楚它是如何工作的一些代码。

from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.models import Model

batch_size = 50
input_size = 10

i = Input(shape=(input_size,))
x = Dense(100)(i)
x_1 = Dense(output_size)(x)
x_2 = Dense(output_size)(x)

model = Model(i, [x_1, x_2])

model.compile(optimizer = 'adam', loss = ["mse", "mse"])

# Data creation
x = np.random.random_sample([batch_size, input_size]).astype('float32')
y = np.random.random_sample([batch_size, output_size]).astype('float32')

loss = model.train_on_batch(x, [y,y])

print(loss) # sample output [0.8311912, 0.3519104, 0.47928077]

我希望变量loss 有两个条目(每个损失函数一个),但是我得到三个。我认为其中一个可能是加权平均数,但事实并非如此。

谁能解释传入多个损失函数的工作原理,因为很明显,我误解了一些东西。

【问题讨论】:

    标签: python-3.x tensorflow keras deep-learning tf.keras


    【解决方案1】:

    您认为应该有两次损失的假设不正确。您有一个具有两个输出的模型,并且您为每个输出指定了一个损失,但是该模型必须针对单个损失进行训练,因此 Keras 对模型进行了新损失的训练,该损失是每个输出损失的总和。

    您可以使用model.compile 中的loss_weights 参数控制这些损失的混合方式。我认为默认情况下它的权重值等于1.0

    所以最后train_on_batch返回的是loss,输出1个mse,输出2个mse。这就是为什么你会得到三个值。

    【讨论】:

      【解决方案2】:

      我相信这三个输出是所有损失的总和,然后是每个输出的单个损失。

      例如,如果您查看打印的示例输出:

      0.3519104 + 0.47928077 = 0.83119117 ≈ 0.8311912
      

      【讨论】:

        猜你喜欢
        • 2019-06-23
        • 2019-01-13
        • 2021-02-25
        • 1970-01-01
        • 2019-01-20
        • 2018-01-09
        • 2020-09-01
        • 2018-10-28
        • 2017-12-29
        相关资源
        最近更新 更多