1. multi-channel CNN
import tensorflow as tf
import tensorflow.contib as contrib
from tensorflow.python.ops import array_ops
from tensorflow.python.framework import dtypes
class cnn(object):
def __init__(self, in_data, in_dim, max_seq_len, num_feature_map=100, filter_sizes=[2,3,4]):
self.in_data = in_data
self.in_dim = in_dim
self.max_seq_len = max_seq_len
self.num_feature_map = num_feature_num
self.filter_sizes = filter_sizes
out_data = []
out_dim = self.num_feature_map * len(self.filter_sizes)
in_data = tf.reshape(self.in_data, [-1, self.max_seq_len, self.in_dim, 1])
for size in filter_sizes:
conv = contrib.layers.conv2d(inputs=in_data, num_outputs=self.num_feature_map, kernel_size=[size,self.in_dim], stride=[1,1],padding='VALID', weights_initializer=contrib.layers.xavier_initializer())
pool = contrib.layers.max_pool2d(inputs=conv, kernel_size=[self.max_seq+1-size, 1], stride=1, padding='VALID')
out_data.append(pool)
output = tf.reshape(tf.concat(out_data, axis=3),[-1, out_dim])
self.output = output
2. depth-wise cnn
import tensorflow as tf
def depth_wise_conv(in_data, scope, kernel_size, dim):
with tf.variable_scope(scope):
shapes = in_data.shape.as_list()
depthwise_filter = tf.get_varibale("depthwise_conv.weight",
(kernel_size[0], kernel_size[1], shapes[-1]
dtype=tf.float32, )
pointwise_filter = tf.get_variable("pointwise_conv.weight",
(1,1, shapes[-1], dim),
dtype=tf.float32, )
outputs = tf.nn.separable_conv2d(in_data,
depthwise_filter,
pointwise_filter,
strides=(1,1,1,1),
padding="SAME"
)
return outputs
3. 多层depth-wise cnn
def multi_convs(input_x, dim, conv_number=2, k=5):
# input_x: 输入数据,为batch * seq * dim
# dim:对应的输入的维度
# conv_number: 对应的卷积的层数,一般2,
# k对应的是卷积核的窗口大小
res = input_x
for index in range(conv_number):
out = norm(res) # layer norm
out = tf.expand_dims(out, 2) # bach * seq * 1 * dim
out = depth_wise_conv(out, kernel_size=(k, 1), dim=dim, scope="convs.%d" % index)
out = tf.squeeze(out, 2) # batch * seq * dim
out = tf.nn.relu(out)
out = out + res
res = out
out = norm(out) # 输出为 batch * seq * 1 * dim
out = tf.squeeze(out, squeeze_dims=2) # 输出为 batch * seq * dim
return out