Tensorflow 1.15 / Keras 2.3.1 Model.train_on_batch() returns 值比 outputs/loss 函数多
Tensorflow 1.15 / Keras 2.3.1 Model.train_on_batch() returns more values than there are outputs/loss functions
我正在尝试训练一个具有多个输出的模型,因此,在我编译它时也附加了多个损失函数。
我过去没有做过类似的事情(至少不是从头开始)。
这是我用来弄清楚这是如何工作的一些代码。
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
有两个条目(每个损失函数一个),但是,我得到了三个。我认为也许其中之一是加权平均值,但事实并非如此。
谁能解释一下传递多个损失函数是如何工作的,因为很明显,我误会了什么。
我相信这三个输出是所有损失的总和,然后是每个输出的个别损失。
例如,如果您查看此处打印的样本输出:
0.3519104 + 0.47928077 = 0.83119117 ≈ 0.8311912
您假设应该有两次损失是不正确的。你有一个有两个输出的模型,你为每个输出指定了一个损失,但是模型必须在一个损失上训练,所以 Keras 训练模型在一个新的损失上,这个损失是每个输出损失的总和。
您可以使用 model.compile
中的 loss_weights
参数控制这些损失的混合方式。我认为默认情况下它的权重值等于 1.0
.
所以最后什么train_on_batch
returns是loss,输出一个mse,输出两个mse。这就是您获得三个值的原因。
我正在尝试训练一个具有多个输出的模型,因此,在我编译它时也附加了多个损失函数。
我过去没有做过类似的事情(至少不是从头开始)。
这是我用来弄清楚这是如何工作的一些代码。
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
有两个条目(每个损失函数一个),但是,我得到了三个。我认为也许其中之一是加权平均值,但事实并非如此。
谁能解释一下传递多个损失函数是如何工作的,因为很明显,我误会了什么。
我相信这三个输出是所有损失的总和,然后是每个输出的个别损失。
例如,如果您查看此处打印的样本输出:
0.3519104 + 0.47928077 = 0.83119117 ≈ 0.8311912
您假设应该有两次损失是不正确的。你有一个有两个输出的模型,你为每个输出指定了一个损失,但是模型必须在一个损失上训练,所以 Keras 训练模型在一个新的损失上,这个损失是每个输出损失的总和。
您可以使用 model.compile
中的 loss_weights
参数控制这些损失的混合方式。我认为默认情况下它的权重值等于 1.0
.
所以最后什么train_on_batch
returns是loss,输出一个mse,输出两个mse。这就是您获得三个值的原因。