我正在尝试使用具有自定义丢失的Keras在python中构建神经网络,并且我在最后一层中是否具有sigmoid函数作为激活函数并且在自定义丢失的开头具有sigmoid是相同的或不。所以这就是我的意思:
我感觉在第二个模型中计算了损失,但是在第一个模型中它没有通过S形回传播。是对的吗?
答案 0 :(得分:3)
实际上,在第二种情况下,反向传播不会通过S形。改变损失函数内部的数据是一件非常糟糕的事情。
这是一件坏事,因为那样,你会反过来传播输出上的错误,这不是网络所犯的真正错误。
用简单的案例解释自己:
你有二进制形式的标签说张量user_greetings = {"hello", "hi"}
user_input = input("-")
if user_input in user_greetings:
print("Welcome User")
else:
print("TESTPHRASE")
如果你的sigmoid在你的自定义损失函数中,你的输出可能看起来像这样[0, 0, 1, 0]
你的损失中的sigmoid会把它转换成类似于tihs的东西:[-100, 0, 20, 100],
将被反向传播的错误将是[0, 0.5, 1, 1]
。反向传播将不考虑到sigmoid,您将直接将此错误应用于输出。您可以看到错误的大小并未反映输出错误的所有大小:最后一个值为100且应该处于负区域,但模型将反向传播一个小错误 - 该层上有1个。
总而言之,sigmoid必须在网络中,以便在反向传播错误时反向传播将其考虑在内。