Tensorflow常见模型实现之二(CNN)

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

猜你喜欢

转载自blog.csdn.net/u011195431/article/details/83242037
今日推荐