我在plaidML后端使用keras,需要实现反射填充。
使用tensorflow后端,这是一个简单的tf.pad,mode设置为反射。
如何用K函数或plaidml平铺函数实现该功能?
或者有什么实现可以供我使用?
使用K函数,简单地将值切片、倒置和连接在一起可能是可能的,但我在那个方向上的所有尝试都是一团糟的,而且并没有真正解决。
发布于 2019-03-25 04:25:27
这里有一个反射填充的版本,作为纯K函数,它应该(但不是经过测试)与每个后端一起工作:
def reflection_padding(inp, paddings):
paddings = [(x, x) if isinstance(x, int) else x for x in paddings]
ishape = inp.shape.dims
ndims = inp.shape.ndims
if len(ishape) != len(paddings):
raise ValueError("Padding dims != input dims")
last = inp
_all_slice = slice(None, None, None)
def _get_slices(ndims, axis, slice_):
ret = [_all_slice for _ in range(ndims)]
ret[axis] = slice_
return tuple(ret)
for axis, pads in ((i, x) for i, x in enumerate(paddings) if x[0]+x[1] != 0):
pad_data = []
if pads[0]:
pre = last[_get_slices(ndims, axis, slice(pads[0], 0, -1))]
pad_data.append(pre)
pad_data.append(last)
if pads[1]:
post = last[_get_slices(ndims, axis, slice(-2, -pads[1]-2, -1))]
pad_data.append(post)
last = K.concatenate(pad_data, axis)
ishape = last.shape.dims
return last
# USAGE: reflection_padding(image_batch, [0, [2,2], [2,2], 0])我将接受我自己的答案。如果有人有更好的答案,我很乐意把这个转到他们的身上
https://datascience.stackexchange.com/questions/47427
复制相似问题