Keras 连接层更改损失大小

Keras 连接层更改损失大小,keras,keras-layer,Keras,Keras Layer,我用一个连接层拟合了一个Keras模型,以实现复合损耗。但是,即使我只是忽略了两个合并的组件中的一个,我的损失也明显高于单独使用的其余组件 或者我的代码中有错误 你有什么线索吗? 谢谢 一些背景 在我的实际设置中,我有两个输入集(X1,X2)和两个对应的标签集(Y,Z),流经同一个模型。 该模型必须最小化(X1,Y)上的二元_交叉熵,并最大化(X2,Z)上的条件熵,同时满足Y预测的等式约束。为此,我将两条路径X1-Y和X2-Z与一个连接层合并,并定义相应的自定义损耗。但是,即使我只是忽略复合损耗

我用一个连接层拟合了一个Keras模型,以实现复合损耗。但是,即使我只是忽略了两个合并的组件中的一个,我的损失也明显高于单独使用的其余组件

或者我的代码中有错误

你有什么线索吗? 谢谢

一些背景 在我的实际设置中,我有两个输入集(X1,X2)和两个对应的标签集(Y,Z),流经同一个模型。 该模型必须最小化(X1,Y)上的二元_交叉熵,并最大化(X2,Z)上的条件熵,同时满足Y预测的等式约束。为此,我将两条路径X1-Y和X2-Z与一个连接层合并,并定义相应的自定义损耗。但是,即使我只是忽略复合损耗中的Z部分,我得到的损耗值与基本的1输入/1输出(X1-Y)路径非常不同

这里有一些(简化的)代码来重现问题:


从keras.models导入顺序、模型
从keras.layers导入密集、丢失、输入、Lambda、连接
从keras.optimizers导入Adam,新加坡元
将keras.backend作为K导入
将numpy作为np导入
#在z标签上定义一个愚蠢的自定义损耗
def损失1(z,zhat):
返回K.sum(K.square(z-zhat),轴=-1)
#(y,z)标签上的另一个愚蠢的自定义丢失——忽略y然后转发到loss1
def loss2(yz,yzhat):
z=yz[:,1]
zhat=yzhat[:,1]
返回损失1(z,zhat)
#玩具数据集
X=np.rand.rand(1000100)
X2=X
y=1*X[:,0]>0.5
z=1*X[:,1]>0.5
#模型
模型=顺序()
添加(密集(30,输入_形状=[X.shape[1]],激活='relu'))
model.add(密集型(1,激活='sigmoid'))
#2个输入(X,X2),2个输出(Y,Z)
inY=输入([X.shape[1]],name=“X”)
outY=Lambda(Lambda x:x,name=“Y”)(型号(inY))
inZ=输入([X2.shape[1]],name=“X2”)
outZ=Lambda(Lambda x:x,name=“Z”)(型号(inZ))
#通过连接Y和Z获得第三个输出YZ
完整的模型=模型(输入=[inY,inZ],输出=[outY,outZ,连接([outY,outZ],name='YZ'),]))
#运行模型时,Z上有loss1,YZ上有loss2
完整的模型编译(optimizer=“adam”,
loss={'Y':“二进制交叉熵”,'Z':loss1,'YZ':loss2},
损失权重={Y':1,'Z':0,'YZ':0})
全模型拟合([X,X2],[y,z,np.堆栈((y,z),轴=-1)],批次大小=32,年代=100,详细程度=1)
#Z_loss1和YZ_loss2应该相等???但是得到
#>Z_损失:0.2542-YZ_损失:8.3113
#>Z_损失:0.2519-YZ_损失:8.2832
#>Z_损失:0.2523-YZ_损失:8.2477
#>Z_损失:0.2598-YZ_损失:8.2236
# > ...
Z_损失1和YZ_损失2应相等

但上面的代码会产生

Z_损失:0.2542-YZ_损失:7.9963

Z_损失:0.2519-YZ_损失:7.4883

Z_损失:0.2523-YZ_损失:7.1448

Z_损失:0.2598-YZ_损失:6.9451

Z_损失:0.2583-YZ_损失:6.6104


Z_损失:0.2621-YZ_损失:6.2509

使用2D张量调用损失函数-采样x输出。然后,loss函数计算批次中每个样本的损失,并单独返回

z=yz[:,1]
-这里您将2D张量转换为1D,然后
loss1
计算整个批次的损失,而不是每个样本的损失

如果保留张量维度:

z=yz[:,1:]
zhat=yzhat[:,1:]
那么YZ损耗与Y损耗完全匹配:

Epoch 1/5
1000/1000 [==============================] - 1s 1ms/step - loss: 0.7100 - Y_loss: 0.7100 - Z_loss: 0.2617 - YZ_loss: 0.2617

使用2D张量调用损失函数-采样x输出。然后,loss函数计算批次中每个样本的损失,并单独返回

z=yz[:,1]
-这里您将2D张量转换为1D,然后
loss1
计算整个批次的损失,而不是每个样本的损失

如果保留张量维度:

z=yz[:,1:]
zhat=yzhat[:,1:]
那么YZ损耗与Y损耗完全匹配:

Epoch 1/5
1000/1000 [==============================] - 1s 1ms/step - loss: 0.7100 - Y_loss: 0.7100 - Z_loss: 0.2617 - YZ_loss: 0.2617