python - 如何将这个用 Lasagne 编写的损失函数转换为 Keras?
问题描述
我一直在努力将用 Lasagne 编写的 CNN 转换为 Keras(链接到 Lasagne 版本:https ://github.com/MTG/DeepConvSep/blob/master/examples/dsd100/trainCNN.py )我相信我已经大部分都记下来了,但是,损失函数是我正在努力重写的部分。
网络的输出具有形状 (32,513,30,4),损失函数使用不同的层(最后一个暗淡)。我尝试将其重写为自定义损失函数,我可以将其插入 model.compile() 这是我编写的代码:
rand_num = np.random.uniform(size=(32,513,30,1))
epsilon=1e-8
alpha=0.001
beta=0.01
beta_voc=0.03
def loss_func(y_true, y_pred):
global alpha, beta, beta_voc, rand_num
voc = y_pred[:,:,:,0:1] + epsilon * rand_num
bass = y_pred[:,:,:,1:2] + epsilon * rand_num
dru = y_pred[:,:,:,2:3] + epsilon * rand_num
oth = y_pred[:,:,:,3:4] + epsilon * rand_num
mask_vox = voc/(voc+bass+dru+oth)
mask_bass = bass/(voc+bass+dru+oth)
mask_drums = dru/(voc+bass+dru+oth)
mask_oth = oth/(voc+bass+dru+oth)
vocals = mask_vox * inp
bass = mask_bass * inp
drums = mask_drums * inp
other = mask_oth * inp
train_loss_vocals = mean_squared_error(y_true=y_true[:,:,:,0:1],y_pred=vocals)
alpha_component = alpha*mean_squared_error(y_true=y_true[:,:,:,1:2],y_pred=vocals)
alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,2:3],y_pred=vocals)
train_loss_recon_neg_voc = beta_voc*mean_squared_error(y_true=y_true[:,:,:,3:4],y_pred=vocals)
train_loss_bass = mean_squared_error(y_true=y_true[:,:,:,1:2],y_pred=bass)
alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,0:1],y_pred=bass)
alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,2:3],y_pred=bass)
train_loss_recon_neg = beta*mean_squared_error(y_true=y_true[:,:,:,3:4],y_pred=bass)
train_loss_drums = mean_squared_error(y_true=y_true[:,:,:,2:3],y_pred=drums)
alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,0:1],y_pred=drums)
alpha_component += alpha*mean_squared_error(y_true=y_true[:,:,:,1:2],y_pred=drums)
train_loss_recon_neg += beta*mean_squared_error(y_true=y_true[:,:,:,3:4],y_pred=drums)
vocals_error=train_loss_vocals.sum()
drums_error=train_loss_drums.sum()
bass_error=train_loss_bass.sum()
negative_error=train_loss_recon_neg.sum()
negative_error_voc=train_loss_recon_neg_voc.sum()
alpha_component=alpha_component.sum()
loss=abs(vocals_error+drums_error+bass_error-negative_error-alpha_component-negative_error_voc)
return loss
我得到的第一个错误是:
AttributeError:“张量”对象没有属性“总和”
但是,我不确定其他一些操作,即使不正确,是否会引发错误。
我真的很感激一些帮助。谢谢你。
解决方案
例如,请参阅此示例,了解如何在 Keras 中定义自定义损失。
y_pred
作为 Keras 模型的输出是张量。您必须调整您的操作以使用张量,因此np.sum
您必须使用K.sum
K 作为您的 keras 后端,而不是使用类似的东西。
一些运算符是重载的,因此您可以例如使用添加两个张量+
。
推荐阅读
- csv - AWS Glue 爬虫无法提取 CSV 标头
- css - 需要图像反弹
- node.js - Sails.js 无法运行脚本:sails run rebuild-cloud-sdk
- c# - 从 FileSystemWatcher 事件调用的方法在更改富文本框文本后停止
- html - 关于通过 winhttp 安全网站进行身份验证的问题
- javascript - 使用 useState Hook 在功能组件中将 Render 道具与 Children 反应
- angular - 更新后如何使用管道编写 rxjs 捕获和映射函数
- r - 拆分一列,获取拆分列的平均值,并更新结果
- kubernetes - 来自 Kubernetes API 服务器 /healthz 的 401
- php - 当我尝试将我的网站上传到主机时出现错误