Bilinear-CNN-Tensorflow来源:https://github.com/abhaydoke09/Bilinear-CNN-TensorFlow/
def bilenear_pooling(x,y):
x_len = x.shape.as_list()[1]
y_len = y.shape.as_list()[1]
phi_I = tf.einsum('im,in->imn', x, y) # 1 5 7
phi_I = tf.reshape(phi_I, [-1, x_len * y_len])
# phi_I = tf.divide(phi_I,784.0) # 用于规范化 在 784 维上求和 将该求和归一化,以防止值取巨大的值。
y_ssqrt = tf.multiply(tf.sign(phi_I), tf.sqrt(tf.abs(phi_I) + 1e-12))
z_l2 = tf.nn.l2_normalize(y_ssqrt, dim=1) # batchsize*mn
return tf.squeeze(z_l2,[2])
我的数据:
x:[batch_size,xlen]
y:[batch_size,ylen]
输出:
[batch_size,xlen*ylen]
如果你的shape跟我的不一样,相应地修改这部分:phi_I = tf.einsum('im,in->imn', x, y)
参考git