【发布时间】:2016-10-22 10:35:56
【问题描述】:
我正在尝试实现自定义 Keras 目标函数:
在“直接内在函数:通过卷积回归学习反照率阴影分解”中,Narihira 等人。
这是上一张图片中方程(4) 和(6) 的总和。 Y* 是基本事实,Y 是预测图,y = Y* - Y。
这是我的代码:
def custom_objective(y_true, y_pred):
#Eq. (4) Scale invariant L2 loss
y = y_true - y_pred
h = 0.5 # lambda
term1 = K.mean(K.sum(K.square(y)))
term2 = K.square(K.mean(K.sum(y)))
sca = term1-h*term2
#Eq. (6) Gradient L2 loss
gra = K.mean(K.sum((K.square(K.gradients(K.sum(y[:,1]), y)) + K.square(K.gradients(K.sum(y[1,:]), y)))))
return (sca + gra)
但是,我怀疑公式(6)没有正确实现,因为结果不好。我计算对了吗?
谢谢!
编辑:
我正在尝试用 Prewitt 过滤器近似 (6) 卷积。它适用于我的输入是一大块图像,即y[batch_size, channels, row, cols],但不适用于y_true 和y_pred(类型为TensorType(float32, 4D))。
我的代码:
def cconv(image, g_kernel, batch_size):
g_kernel = theano.shared(g_kernel)
M = T.dtensor3()
conv = theano.function(
inputs=[M],
outputs=conv2d(M, g_kernel, border_mode='full'),
)
accum = 0
for curr_batch in range (batch_size):
accum = accum + conv(image[curr_batch])
return accum/batch_size
def gradient_loss(y_true, y_pred):
y = y_true - y_pred
batch_size = 40
# Direction i
pw_x = np.array([[-1,0,1],[-1,0,1],[-1,0,1]]).astype(np.float64)
g_x = cconv(y, pw_x, batch_size)
# Direction j
pw_y = np.array([[-1,-1,-1],[0,0,0],[1,1,1]]).astype(np.float64)
g_y = cconv(y, pw_y, batch_size)
gra_l2_loss = K.mean(K.square(g_x) + K.square(g_y))
return (gra_l2_loss)
崩溃发生在:
accum = accum + conv(image[curr_batch])
...错误描述如下:
*** TypeError: ('在索引 0(基于 0)处名称为“custom_models.py:836”的 theano 函数的输入参数错误', '期望类似数组 对象,但找到了一个变量:也许你正在尝试调用一个函数 在(可能是共享的)变量而不是数字数组上?')
如何使用 y (y_true - y_pred) 作为 numpy 数组,或者如何解决这个问题?
【问题讨论】:
标签: image-processing deep-learning keras