
import tensorflow as tf
from tensorflow.python.keras.layers import Concatenate,Conv1D,Reshape
def compressed_interaction_net(x0, xl, D, n_filters):
"""
@param x0: 原始输入
@param xl: 第l层的输入
@param D: embedding dim
@param n_filters: 压缩网络filter的数量
"""
x0_cols = tf.split(x0, D, axis=-1)
xl_cols = tf.split(xl, D, axis=-1)
assert len(x0_cols )==len(xl_cols), print("error shape!")
feature_maps = []
for i in range(D):
feature_map = tf.matmul(xl_cols[i], x0_cols[i], transpose_b=True)
feature_map = tf.expand_dims(feature_map, axis=-1)
feature_maps.append(feature_map)
feature_maps = Concatenate(axis=-1)(feature_maps)
x0_n_feats = x0.get_shape()[1]
xl_n_feats = xl.get_shape()[1]
reshaped_feature_maps = Reshape(target_shape=(x0_n_feats * xl_n_feats, D))(feature_maps)
transposed_feature_maps = tf.transpose(reshaped_feature_maps, [0, 2, 1])
new_feature_maps = Conv1D(n_filters, kernel_size=1, strides=1)(transposed_feature_maps)
new_feature_maps = tf.transpose(new_feature_maps, [0, 2, 1])
return new_feature_maps
def compressed_interaction_net_v2(x0, xl, D, n_filters):
x0_cols = tf.split(x0, D, axis=-1)
xl_cols = tf.split(xl, D, axis=-1)
feature_map_list = []
for i in range(D):
print()
feature_map = tf.matmul(xl_cols[i], x0_cols[i], transpose_b=True)
feature_map_list.append(feature_map)
feature_map_tensor = tf.convert_to_tensor(feature_map_list)
transposed_feature_map_tensor = tf.transpose(feature_map_tensor, [1, 0, 2, 3])
x0_n_feats = x0.get_shape()[1]
xl_n_feats = xl.get_shape()[1]
reshaped_feature_maps = \
Reshape(target_shape=(D, x0_n_feats * xl_n_feats))(transposed_feature_map_tensor)
new_feature_maps = Conv1D(n_filters, kernel_size=1, strides=1)(reshaped_feature_maps)
new_feature_maps = tf.transpose(new_feature_maps, [0, 2, 1])
return new_feature_maps
if __name__ == '__main__':
x0 = tf.constant([
[[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 3]],
[[5, 6, 7, 1],
[8, 9, 10, 11],
[11, 12, 13, 14]]
], dtype=tf.float32)
xl = tf.constant([
[[1, 2, 3, 7],
[2, 3, 4, 9]],
[[1, 2, 3, 4],
[2, 3, 4, 6]]
], dtype=tf.float32)
res_v1 = compressed_interaction_net(x0, xl, 4, 3)
print("res_v1:", res_v1)
res_v2 = compressed_interaction_net_v2(x0, xl, 4, 3)
print("res_v2:",res_v2)