def gaussian_mask(params, R, C):
"""Define a mask of size RxC given by one 1-D Gaussian per row.
u, s and d must be 1-dimensional vectors"""
u, s, d = (params[..., i] for i in xrange(3))
for i in (u, s, d):
assert len(u.get_shape()) == 1, i
batch_size = tf.to_int32(tf.shape(u)[0])
R = tf.range(tf.to_int32(R))
C = tf.range(tf.to_int32(C))
R = tf.to_float(R)[tf.newaxis, tf.newaxis, :]
C = tf.to_float(C)[tf.newaxis, :, tf.newaxis]
C = tf.tile(C, (batch_size, 1, 1))
u, d = u[:, tf.newaxis, tf.newaxis], d[:, tf.newaxis, tf.newaxis]
s = s[:, tf.newaxis, tf.newaxis]
ur = u + (R - 0.) * d
sr = tf.ones_like(ur) * s
mask = C - ur
mask = tf.exp(-.5 * (mask / sr) ** 2)
mask /= tf.reduce_sum(mask, 1, keep_dims=True) + 1e-8
return mask
评论列表
文章目录