【发布时间】:2020-06-12 13:33:22
【问题描述】:
我正在尝试实现加权二元交叉熵损失函数 另外,我正在使用自定义训练循环进行训练
def grads_ds(model_ds, ds_inputs,y_true,cw):
with tf.GradientTape() as ds_tape:
#ds_tape.watch(tf.convert_to_tensor(y_true.astype('float')))
#ds_tape.watch(tf.convert_to_tensor(ds_inputs))
y_pred = model_ds(ds_inputs)
#print(y_true,y_pred)
log_logits = np.append(np.log(y_pred),np.log(1-y_pred),axis=0).T
org_labs = np.append(y_true,1-y_true,axis=0).T
loss = K.sum(-1*org_labs*cw*log_logits,axis=1)
loss_value_ds = K.sum(loss)
ds_grads = ds_tape.gradient(loss_value_ds,model_ds.trainable_variables)
return loss_value_ds, ds_grads
y_true 和 y_pred 的形状均为 (1,3),cw 的形状为 (3,2)
cw是
[[0.5145 3.6036]
[1.7163 0.7127]
[2.4231 0.6708]]
ds_tape.gradient 正在返回 None 渐变。
我什至尝试添加ds_tape.watch 作为输入和真实标签y_true。但仍然收到None。
在我的网络中,我在某一层之后使用了tf.math.reduce_max。这会是问题的根源吗?
还是因为我在张量 y_pred 上使用了 numpy 函数?
tf.GradientTape().gradient() 当目标和源是UNCONNECTED 时返回None。我无法弄清楚它是如何断开连接的。
注意:当我使用tf.keras.losses.binary_crossentropy(y_true,y_pred) 时,没有出现上述错误。只有当我使用自定义损失计算代码而不是 keras 函数时,才会出现此错误
有什么解决办法吗? 我在网上看到的方法都不起作用。
【问题讨论】:
标签: python tensorflow neural-network conv-neural-network tf.keras