Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于输入的输出子集上的自定义损失函数_Python_Tensorflow_Keras - Fatal编程技术网

Python 基于输入的输出子集上的自定义损失函数

Python 基于输入的输出子集上的自定义损失函数,python,tensorflow,keras,Python,Tensorflow,Keras,我想创建一个损失函数,其中MSE仅在输出的子集上计算。子集取决于输入数据。我使用这个问题的答案来了解如何基于输入数据创建自定义函数: 但是,我在实现自定义函数时遇到了问题 这是我整理的东西 def自定义丢失(输入张量): def损失(y_真,y_pred): 板=输入张量[:81] 答案向量=电路板==.5 #断言np.sum(答案向量)>0 返回K.mean(K.square(y_pred*答案向量-y_true),轴=-1) 回波损耗 def构建模型(输入大小、输出大小): 学习率=.00

我想创建一个损失函数,其中MSE仅在输出的子集上计算。子集取决于输入数据。我使用这个问题的答案来了解如何基于输入数据创建自定义函数:

但是,我在实现自定义函数时遇到了问题

这是我整理的东西

def自定义丢失(输入张量):
def损失(y_真,y_pred):
板=输入张量[:81]
答案向量=电路板==.5
#断言np.sum(答案向量)>0
返回K.mean(K.square(y_pred*答案向量-y_true),轴=-1)
回波损耗
def构建模型(输入大小、输出大小):
学习率=.001
a=输入(形状=(输入大小)
b=密度(60,活化='relu')(a)
b=密度(60,活化='relu')(b)
b=密度(60,活化='relu')(b)
b=密集(输出尺寸,激活=线性)(b)
模型=模型(输入=a,输出=b)
compile(loss=custom\u loss(a),optimizer=Adam(lr=learning\u rate))
回归模型
模型=构建模型(83,81)
我希望MSE将板不等于0.5时的输出视为0。(真值是一个热编码的值,其中一个在子集内)。由于某种原因,我的输出我的输出总是被视为零。换句话说,自定义损耗函数似乎找不到任何板等于0.5的位置


我不知道我是否曲解了维度,或者比较是否因为张量而失败,或者即使有一种更简单的方法来做我正在尝试的事情。

问题是,
answer\u vector=board=.5
不是你想象的那样。它不是张量,而是布尔值False,因为board是张量,0.5是数字:

a = tf.constant([0.5, 0.5])
print(a == 0.5) # False
现在,
a*False
是零的向量:

with tf.Session() as sess:
   print(sess.run(a * False)) # [0.0, 0.0]

您需要使用tf.equal而不是==。另一个可能的陷阱是将浮点值与相等值进行比较是危险的,请参见,例如
answer\u vector=board=.5
是否创建了张量?您是否尝试过使用
tf.where
?您可以添加打印(答案向量)以在模型构建期间显示这是张量(还是常数)。我希望比较会产生“tensor==0.5”=>False。作为调试工具,我尝试创建一个包含1/2元素的批处理,然后在loss函数中使用
var=K.print\u tensor(var)
跟踪函数如何转换值。