示例#1
0
    def conv_bn_layer(self, x, filter_shape, name):

        with tf.name_scope("conv-%s" % name):
            # Convolution Layer size1
            #     filter_shape = [filter_size, 151, 1, num_filters1]
            W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
            b = tf.Variable(tf.constant(0.1, shape=[filter_shape[-1]]), name="b")
            conv = tf.nn.conv2d(
                x,
                W,
                strides=[1, 1, 1, 1],
                padding="VALID",
                name="conv")

            # Apply BatchNormalization

            ewma = tf.train.ExponentialMovingAverage(decay=0.99)
            bn = BN(filter_shape[-1], 0.001, ewma, True)
            update_assignments = bn.get_assigner()
            bn1 = bn.normalize(conv, train=True)


            # relu1 = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")

            return tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")
示例#2
0
    def conv_pooling_bn_layer(self, x, filter_shape, name):
        # filter_shape_cm2 = [2, 30, num_filters3, num_filters3]
        with tf.name_scope("conv-pool-%s" % name):
            W_cm = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W1")
            b_cm = tf.Variable(tf.constant(0.1, shape=[filter_shape[-1]]), name="b2")
            conv_cm = tf.nn.conv2d(
                x,
                W_cm,
                strides=[1, 2, 1, 1],
                padding="VALID",
                name="conv")

            # Apply BatchNormalization

            ewma_cm = tf.train.ExponentialMovingAverage(decay=0.99)
            bn_cm = BN(filter_shape[-1], 0.001, ewma_cm, True)
            update_assignments = bn_cm.get_assigner()
            bn_cm_o = bn_cm.normalize(conv_cm, train=True)

            pooled3 = tf.nn.relu(tf.nn.bias_add(bn_cm_o, b_cm), name="relu")
            return pooled3
    def __init__(self,
                 sequence_length,
                 num_classes,
                 vocab_size,
                 embedding_size,
                 filter_sizes,
                 num_filters,
                 l2_reg_lambda=0.0):

        # Placeholders for input, output and dropout
        self.input_x = tf.placeholder(tf.int32, [None, sequence_length],
                                      name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes],
                                      name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32,
                                                name="dropout_keep_prob")

        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        # Embedding layer
        num_filters1 = 8
        num_filters2 = 16
        num_filters3 = num_filters
        with tf.device('/cpu:0'), tf.name_scope("embedding"):
            W = tf.Variable(tf.random_uniform([vocab_size, embedding_size],
                                              -1.0, 1.0),
                            name="W")
            self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
            self.embedded_chars_expanded = tf.expand_dims(
                self.embedded_chars, -1)

        print self.embedded_chars_expanded.get_shape()
        # Create a convolution + maxpool layer for each filter size
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer size1
                filter_shape = [filter_size, 101, 1, num_filters1]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1),
                                name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters1]),
                                name="b")
                conv = tf.nn.conv2d(self.embedded_chars_expanded,
                                    W,
                                    strides=[1, 1, 1, 1],
                                    padding="VALID",
                                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters1, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)

                relu1 = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")

                # Convolution layer 2

                filter_shape2 = [2, 101, num_filters1, num_filters2]
                W2 = tf.Variable(tf.truncated_normal(filter_shape2,
                                                     stddev=0.1),
                                 name="W1")
                b2 = tf.Variable(tf.constant(0.1, shape=[num_filters2]),
                                 name="b2")
                conv = tf.nn.conv2d(relu1,
                                    W2,
                                    strides=[1, 1, 1, 1],
                                    padding="VALID",
                                    name="conv")

                # Apply BatchNormalization

                ewma2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn2 = BN(num_filters2, 0.001, ewma2, True)
                update_assignments = bn2.get_assigner()
                bn22 = bn2.normalize(conv, train=True)

                relu2 = tf.nn.relu(tf.nn.bias_add(bn22, b2), name="relu")

                print filter_size, "before pooling", relu2.get_shape()
                # Maxpooling over the outputs
                # pooled = tf.nn.max_pool(
                #     relu1,
                #     ksize=[1, 2, 1, 1],
                #     strides=[1, 2, 1, 1],
                #     padding='VALID',
                #     name="pool")

                # Convolution pooling

                filter_shape_cm = [2, 2, num_filters2, num_filters2]
                W_cm = tf.Variable(tf.truncated_normal(filter_shape_cm,
                                                       stddev=0.1),
                                   name="W1")
                b_cm = tf.Variable(tf.constant(0.1, shape=[num_filters2]),
                                   name="b2")
                conv_cm = tf.nn.conv2d(relu2,
                                       W_cm,
                                       strides=[1, 2, 2, 1],
                                       padding="VALID",
                                       name="conv")

                # Apply BatchNormalization

                ewma_cm = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm = BN(num_filters2, 0.001, ewma_cm, True)
                update_assignments = bn_cm.get_assigner()
                bn_cm_o = bn_cm.normalize(conv_cm, train=True)

                pooled = tf.nn.relu(tf.nn.bias_add(bn_cm_o, b_cm), name="relu")

                print filter_size, "pooling1", pooled.get_shape()

                filter_shape3 = [1, 27, num_filters2, num_filters3]
                W3 = tf.Variable(tf.truncated_normal(filter_shape3,
                                                     stddev=0.1),
                                 name="W3")
                b3 = tf.Variable(tf.constant(0.1, shape=[num_filters3]),
                                 name="b3")
                conv3 = tf.nn.conv2d(pooled,
                                     W3,
                                     strides=[1, 1, 1, 1],
                                     padding="VALID",
                                     name="conv3")

                # Apply BatchNormalization
                ewma3 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_3 = BN(num_filters3, 0.001, ewma3, True)
                update_assignments = bn_3.get_assigner()
                bn3 = bn_3.normalize(conv3, train=True)

                # Apply nonlinearity
                relu3 = tf.nn.relu(tf.nn.bias_add(bn3, b3), name="relu3")

                # Maxpooling over the outputs

                # Convolution pooling
                w = 2
                # if filter_size == 3:
                #     w = 3

                # pooled3 = tf.nn.max_pool(
                #     relu3,
                #     # ksize=[1, 2, 15, 1],
                #     ksize=[1, w, 15, 1],
                #     strides=[1, 2, 1, 1],
                #     padding='VALID',
                #     name="pool3")

                # pooled3 = tf.nn.top_k(relu3, 10, sorted=False, name="k-max-pooling")
                filter_shape_cm2 = [w, 2, num_filters3, num_filters3]
                W_cm2 = tf.Variable(tf.truncated_normal(filter_shape_cm2,
                                                        stddev=0.1),
                                    name="W1")
                b_cm2 = tf.Variable(tf.constant(0.1, shape=[num_filters3]),
                                    name="b2")
                conv_cm2 = tf.nn.conv2d(relu3,
                                        W_cm2,
                                        strides=[1, 2, 2, 1],
                                        padding="VALID",
                                        name="conv")

                # Apply BatchNormalization

                ewma_cm2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm2 = BN(num_filters3, 0.001, ewma_cm2, True)
                update_assignments = bn_cm2.get_assigner()
                bn_cm_o2 = bn_cm2.normalize(conv_cm2, train=True)

                pooled3 = tf.nn.relu(tf.nn.bias_add(bn_cm_o2, b_cm2),
                                     name="relu")

                pooled_outputs.append(pooled3)
        print pooled_outputs[0].get_shape()
        print pooled_outputs[1].get_shape()
        print pooled_outputs[2].get_shape()
        # Combine all the pooled features
        sum = 0
        for i in pooled_outputs:
            sum += i.get_shape()[1].value
        # Combine all the pooled features
        num_filters_total = num_filters * sum
        self.h_pool = tf.concat(1, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        print "before drop out", self.h_pool_flat.get_shape()
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat,
                                        self.dropout_keep_prob)
            print "after drop out", self.h_drop.get_shape()

        # with tf.name_scope("fullyConnected"):
        #     # Fully connected layer
        #     W = tf.Variable(tf.truncated_normal([num_filters_total, 256], stddev=0.1), name="W")
        #     b = tf.Variable(tf.constant(0.1, shape=[256]), name="b")
        #     dense1 = tf.reshape(self.h_drop, [-1, W.get_shape().as_list()[0]]) # Reshape conv2 output to fit dense layer input
        #     dense1 = tf.nn.relu(tf.add(tf.matmul(dense1, W), b)) # Relu activation
        #     dense1 = tf.nn.dropout(dense1, self.dropout_keep_prob) # Apply Dropout

        # Final (unnormalized) scores and predictions
        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal(
                [num_filters_total, num_classes], stddev=0.1),
                            name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(
                self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions,
                                           tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions,
                                                   "float"),
                                           name="accuracy")
    def __init__(self, sequence_length, num_classes, height,
                 embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0, batch_size=64):

        # Placeholders for input, output and dropout
        # self.input_x = tf.placeholder(tf.float32, [None, sequence_length], name="input_x")
        # self.input_x = tf.placeholder(tf.float32, [None, 30000], name="input_x")

        # [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3]

        self.input_x = tf.placeholder(tf.float32, [None, height, embedding_size, 1], name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")
        # sentence = self
        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer
                filter_shape = [filter_size, embedding_size, 1, num_filters]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
                conv = tf.nn.conv2d(
                    self.input_x,
                    W,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)




                # Apply nonlinearity
                h = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")


                # Maxpooling over the outputs
                pooled = tf.nn.max_pool(
                     h,
                     ksize=[1, sequence_length - filter_size + 1, 1, 1],
                     strides=[1, 1, 1, 1],
                     padding='VALID',
                     name="pool")


                pooled_outputs.append(pooled)



        print pooled_outputs[0].get_shape()
        print pooled_outputs[1].get_shape()
        print pooled_outputs[2].get_shape()
        # Combine all the pooled features
        # sum = 0
        # for i in pooled_outputs:
        #     sum += i.get_shape()[1].value
        # # Combine all the pooled features
        # num_filters_total = num_filters * sum
        num_filters_total = num_filters * len(filter_sizes)
        self.h_pool = tf.concat(3, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        print "before drop out", self.h_pool_flat.get_shape()
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob)
            print "after drop out", self.h_drop.get_shape()
        # Final (unnormalized) scores and predictions
        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal([num_filters_total, num_classes], stddev=0.1), name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")
示例#5
0
    def __init__(self,
                 sequence_length,
                 num_classes,
                 height,
                 embedding_size,
                 filter_sizes,
                 num_filters,
                 l2_reg_lambda=0.0,
                 batch_size=64):

        self.input_x = tf.placeholder(tf.float32,
                                      [None, height, embedding_size, 1],
                                      name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes],
                                      name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32,
                                                name="dropout_keep_prob")
        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        num_filters1 = 8
        num_filters2 = 16
        num_filters3 = num_filters
        print "input size", height, embedding_size, 1
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer size1
                filter_shape = [filter_size, 101, 1, num_filters1]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1),
                                name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters1]),
                                name="b")
                conv = tf.nn.conv2d(self.input_x,
                                    W,
                                    strides=[1, 1, 1, 1],
                                    padding="VALID",
                                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters1, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)

                relu1 = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")

                # Convolution layer 2

                filter_shape2 = [2, 101, num_filters1, num_filters2]
                W2 = tf.Variable(tf.truncated_normal(filter_shape2,
                                                     stddev=0.1),
                                 name="W1")
                b2 = tf.Variable(tf.constant(0.1, shape=[num_filters2]),
                                 name="b2")
                conv = tf.nn.conv2d(relu1,
                                    W2,
                                    strides=[1, 1, 1, 1],
                                    padding="VALID",
                                    name="conv")

                # Apply BatchNormalization

                ewma2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn2 = BN(num_filters2, 0.001, ewma2, True)
                update_assignments = bn2.get_assigner()
                bn22 = bn2.normalize(conv, train=True)

                relu2 = tf.nn.relu(tf.nn.bias_add(bn22, b2), name="relu")

                # Convolution pooling

                filter_shape_cm = [2, 2, num_filters2, num_filters2]
                W_cm = tf.Variable(tf.truncated_normal(filter_shape_cm,
                                                       stddev=0.1),
                                   name="W1")
                b_cm = tf.Variable(tf.constant(0.1, shape=[num_filters2]),
                                   name="b2")
                conv_cm = tf.nn.conv2d(relu2,
                                       W_cm,
                                       strides=[1, 2, 2, 1],
                                       padding="VALID",
                                       name="conv")

                # Apply BatchNormalization

                ewma_cm = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm = BN(num_filters2, 0.001, ewma_cm, True)
                update_assignments = bn_cm.get_assigner()
                bn_cm_o = bn_cm.normalize(conv_cm, train=True)

                pooled = tf.nn.relu(tf.nn.bias_add(bn_cm_o, b_cm), name="relu")

                #  # third convelution-pooling layer

                filter_shape3 = [1, 49, num_filters2, num_filters3]
                W3 = tf.Variable(tf.truncated_normal(filter_shape3,
                                                     stddev=0.1),
                                 name="W3")
                b3 = tf.Variable(tf.constant(0.1, shape=[num_filters3]),
                                 name="b3")
                conv3 = tf.nn.conv2d(pooled,
                                     W3,
                                     strides=[1, 1, 1, 1],
                                     padding="VALID",
                                     name="conv3")

                # Apply BatchNormalization
                ewma3 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_3 = BN(num_filters3, 0.001, ewma3, True)
                update_assignments = bn_3.get_assigner()
                bn3 = bn_3.normalize(conv3, train=True)

                # Apply nonlinearity
                relu3 = tf.nn.relu(tf.nn.bias_add(bn3, b3), name="relu3")

                # Convolution pooling
                w = 2

                filter_shape_cm2 = [w, 2, num_filters3, num_filters3]
                W_cm2 = tf.Variable(tf.truncated_normal(filter_shape_cm2,
                                                        stddev=0.1),
                                    name="W1")
                b_cm2 = tf.Variable(tf.constant(0.1, shape=[num_filters3]),
                                    name="b2")
                conv_cm2 = tf.nn.conv2d(relu3,
                                        W_cm2,
                                        strides=[1, 2, 2, 1],
                                        padding="VALID",
                                        name="conv")

                # Apply BatchNormalization

                ewma_cm2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm2 = BN(num_filters3, 0.001, ewma_cm2, True)
                update_assignments = bn_cm2.get_assigner()
                bn_cm_o2 = bn_cm2.normalize(conv_cm2, train=True)

                pooled3 = tf.nn.relu(tf.nn.bias_add(bn_cm_o2, b_cm2),
                                     name="relu")
                # print pooled3.get_shape()
                pooled_outputs.append(pooled3)

        sum = 0
        for i in pooled_outputs:
            sum += i.get_shape()[1].value
        # Combine all the pooled features
        num_filters_total = num_filters * sum
        self.h_pool = tf.concat(1, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat,
                                        self.dropout_keep_prob)
        print self.h_drop.get_shape()

        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal(
                [num_filters_total, num_classes], stddev=0.1),
                            name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(
                self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions,
                                           tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions,
                                                   "float"),
                                           name="accuracy")
示例#6
0
    def __init__(self, sequence_length, num_classes, height,
                 embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0, batch_size=64):

        # Placeholders for input, output and dropout
        # self.input_x = tf.placeholder(tf.float32, [None, sequence_length], name="input_x")
        # self.input_x = tf.placeholder(tf.float32, [None, 30000], name="input_x")

        # [batch_size, IMAGE_SIZE, IMAGE_SIZE, 3]

        self.input_x = tf.placeholder(tf.float32, [None, height, embedding_size, 1], name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")
        sentence = self
        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        # Embedding layer
        # with tf.device('/cpu:0'), tf.name_scope("embedding"):
        #     W = tf.Variable(
        #         tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
        #         name="W")
        #     self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
        #     self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)

        # Create a convolution + maxpool layer for each filter size
        num_filters1 = 50
        num_filters2 = 50
        num_filters3 = num_filters
        print "input size", height, embedding_size, 1
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer size1
                filter_shape = [filter_size, 151, 1, num_filters1]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters1]), name="b")
                conv = tf.nn.conv2d(
                    self.input_x,
                    W,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters1, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)


                relu1 = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")

                # Convolution layer 2

                filter_shape2 = [2, 121, num_filters1, num_filters2]
                W2 = tf.Variable(tf.truncated_normal(filter_shape2, stddev=0.1), name="W1")
                b2 = tf.Variable(tf.constant(0.1, shape=[num_filters2]), name="b2")
                conv = tf.nn.conv2d(
                    relu1,
                    W2,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn2 = BN(num_filters2, 0.001, ewma2, True)
                update_assignments = bn2.get_assigner()
                bn22 = bn2.normalize(conv, train=True)


                relu2 = tf.nn.relu(tf.nn.bias_add(bn22, b2), name="relu")


                print filter_size, "before pooling", relu2.get_shape()
                # Maxpooling over the outputs
                # pooled = tf.nn.max_pool(
                #     relu1,
                #     ksize=[1, 2, 1, 1],
                #     strides=[1, 2, 1, 1],
                #     padding='VALID',
                #     name="pool")

                # Convolution Maxpooling

                filter_shape_cm = [2, 1, num_filters2, num_filters2]
                W_cm = tf.Variable(tf.truncated_normal(filter_shape_cm, stddev=0.1), name="W1")
                b_cm = tf.Variable(tf.constant(0.1, shape=[num_filters2]), name="b2")
                conv_cm = tf.nn.conv2d(
                    relu2,
                    W_cm,
                    strides=[1, 2, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma_cm = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm = BN(num_filters2, 0.001, ewma_cm, True)
                update_assignments = bn_cm.get_assigner()
                bn_cm_o = bn_cm.normalize(conv_cm, train=True)

                pooled = tf.nn.relu(tf.nn.bias_add(bn_cm_o, b_cm), name="relu")

                print filter_size, "pooling1", pooled.get_shape()

                #  # third convelution-pooling layer
                # filter_shape3 = [filter_size, 100, num_filters2, num_filters3]
                # W3 = tf.Variable(tf.truncated_normal(filter_shape3, stddev=0.1), name="W3")
                # b3 = tf.Variable(tf.constant(0.1, shape=[num_filters3]), name="b3")
                # conv3 = tf.nn.conv2d(
                #     pooled2,
                #     W3,
                #     strides=[1, 1, 1, 1],
                #     padding="VALID",
                #     name="conv3")
                # # Apply nonlinearity
                # h = tf.nn.relu(tf.nn.bias_add(conv3, b3), name="relu3")
                # # Maxpooling over the outputs
                # pooled3 = tf.nn.avg_pool(
                #     h,
                #     ksize=[1, (((sequence_length - filter_size + 1)/2 - filter_size + 1)/2 - filter_size + 1), 1, 1],
                #     strides=[1, 1, 1, 1],
                #     padding='VALID',
                #     name="pool3")
                #  # third convelution-pooling layer

                filter_shape3 = [1, 1, num_filters2, num_filters3]
                W3 = tf.Variable(tf.truncated_normal(filter_shape3, stddev=0.1), name="W3")
                b3 = tf.Variable(tf.constant(0.1, shape=[num_filters3]), name="b3")
                conv3 = tf.nn.conv2d(
                    pooled,
                    W3,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv3")


                # Apply BatchNormalization
                ewma3 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_3 = BN(num_filters3, 0.001, ewma3, True)
                update_assignments = bn_3.get_assigner()
                bn3 = bn_3.normalize(conv3, train=True)


                # Apply nonlinearity
                relu3 = tf.nn.relu(tf.nn.bias_add(bn3, b3), name="relu3")

                # Maxpooling over the outputs

                # Convolution Maxpooling
                # pooled3 = tf.nn.max_pool(
                #     relu3,
                #     ksize=[1, (((sequence_length - filter_size + 1)/2) - filter_size + 1), 1, 1],
                #     strides=[1, 1, 1, 1],
                #     padding='VALID',
                #     name="pool3")
                filter_shape_cm2 = [2, 30, num_filters3, num_filters3]
                W_cm2 = tf.Variable(tf.truncated_normal(filter_shape_cm2, stddev=0.1), name="W1")
                b_cm2 = tf.Variable(tf.constant(0.1, shape=[num_filters3]), name="b2")
                conv_cm2 = tf.nn.conv2d(
                    relu3,
                    W_cm2,
                    strides=[1, 2, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma_cm2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm2 = BN(num_filters2, 0.001, ewma_cm2, True)
                update_assignments = bn_cm2.get_assigner()
                bn_cm_o2 = bn_cm2.normalize(conv_cm2, train=True)

                pooled3 = tf.nn.relu(tf.nn.bias_add(bn_cm_o2, b_cm2), name="relu")

                pooled_outputs.append(pooled3)

        print pooled_outputs[0].get_shape()
        print pooled_outputs[1].get_shape()
        print pooled_outputs[2].get_shape()

        # Combine all the pooled features
        num_filters_total = num_filters * len(filter_sizes)
        self.h_pool = tf.concat(3, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        # print "before drop out", self.h_pool_flat.get_shape()
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob)

        # print "after drop out", self.h_drop.get_shape()
        # Final (unnormalized) scores and predictions

        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal([num_filters_total, num_classes], stddev=0.1), name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")
示例#7
0
    def __init__(self, sequence_length, num_classes, height,
                 embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0, batch_size=64):

        self.input_x = tf.placeholder(tf.float32, [None, height, embedding_size, 1], name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")
        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        num_filters1 = 8
        num_filters2 = 16
        num_filters3 = num_filters
        print "input size", height, embedding_size, 1
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer size1
                filter_shape = [filter_size, 101, 1, num_filters1]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters1]), name="b")
                conv = tf.nn.conv2d(
                    self.input_x,
                    W,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters1, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)

                relu1 = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")

                # Convolution layer 2

                filter_shape2 = [2, 101, num_filters1, num_filters2]
                W2 = tf.Variable(tf.truncated_normal(filter_shape2, stddev=0.1), name="W1")
                b2 = tf.Variable(tf.constant(0.1, shape=[num_filters2]), name="b2")
                conv = tf.nn.conv2d(
                    relu1,
                    W2,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn2 = BN(num_filters2, 0.001, ewma2, True)
                update_assignments = bn2.get_assigner()
                bn22 = bn2.normalize(conv, train=True)

                relu2 = tf.nn.relu(tf.nn.bias_add(bn22, b2), name="relu")

                # Convolution pooling

                filter_shape_cm = [2, 2, num_filters2, num_filters2]
                W_cm = tf.Variable(tf.truncated_normal(filter_shape_cm, stddev=0.1), name="W1")
                b_cm = tf.Variable(tf.constant(0.1, shape=[num_filters2]), name="b2")
                conv_cm = tf.nn.conv2d(
                    relu2,
                    W_cm,
                    strides=[1, 2, 2, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma_cm = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm = BN(num_filters2, 0.001, ewma_cm, True)
                update_assignments = bn_cm.get_assigner()
                bn_cm_o = bn_cm.normalize(conv_cm, train=True)

                pooled = tf.nn.relu(tf.nn.bias_add(bn_cm_o, b_cm), name="relu")

                #  # third convelution-pooling layer

                filter_shape3 = [1, 49, num_filters2, num_filters3]
                W3 = tf.Variable(tf.truncated_normal(filter_shape3, stddev=0.1), name="W3")
                b3 = tf.Variable(tf.constant(0.1, shape=[num_filters3]), name="b3")
                conv3 = tf.nn.conv2d(
                    pooled,
                    W3,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv3")

                # Apply BatchNormalization
                ewma3 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_3 = BN(num_filters3, 0.001, ewma3, True)
                update_assignments = bn_3.get_assigner()
                bn3 = bn_3.normalize(conv3, train=True)

                # Apply nonlinearity
                relu3 = tf.nn.relu(tf.nn.bias_add(bn3, b3), name="relu3")

                # Convolution pooling
                w = 2

                filter_shape_cm2 = [w, 2, num_filters3, num_filters3]
                W_cm2 = tf.Variable(tf.truncated_normal(filter_shape_cm2, stddev=0.1), name="W1")
                b_cm2 = tf.Variable(tf.constant(0.1, shape=[num_filters3]), name="b2")
                conv_cm2 = tf.nn.conv2d(
                    relu3,
                    W_cm2,
                    strides=[1, 2, 2, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma_cm2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm2 = BN(num_filters3, 0.001, ewma_cm2, True)
                update_assignments = bn_cm2.get_assigner()
                bn_cm_o2 = bn_cm2.normalize(conv_cm2, train=True)

                pooled3 = tf.nn.relu(tf.nn.bias_add(bn_cm_o2, b_cm2), name="relu")
                # print pooled3.get_shape()
                pooled_outputs.append(pooled3)

        sum = 0
        for i in pooled_outputs:
            sum += i.get_shape()[1].value
        # Combine all the pooled features
        num_filters_total = num_filters * sum
        self.h_pool = tf.concat(1, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob)
        print self.h_drop.get_shape()

        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal([num_filters_total, num_classes], stddev=0.1), name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")
示例#8
0
    def __init__(self,
                 sequence_length,
                 num_classes,
                 vocab_size,
                 embedding_size,
                 filter_sizes,
                 num_filters,
                 l2_reg_lambda=0.0):

        # Placeholders for input, output and dropout
        self.input_x = tf.placeholder(tf.int32, [None, sequence_length],
                                      name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes],
                                      name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32,
                                                name="dropout_keep_prob")

        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        # Embedding layer
        with tf.device('/cpu:0'), tf.name_scope("embedding"):
            W = tf.Variable(tf.random_uniform([vocab_size, embedding_size],
                                              -1.0, 1.0),
                            name="W")
            self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
            self.embedded_chars_expanded = tf.expand_dims(
                self.embedded_chars, -1)

        # Create a convolution + maxpool layer for each filter size
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer
                filter_shape = [filter_size, embedding_size, 1, num_filters]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1),
                                name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters]),
                                name="b")
                conv = tf.nn.conv2d(self.embedded_chars_expanded,
                                    W,
                                    strides=[1, 1, 1, 1],
                                    padding="VALID",
                                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)

                # Apply nonlinearity
                h = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")

                # Maxpooling over the outputs
                pooled = tf.nn.max_pool(
                    h,
                    ksize=[1, sequence_length - filter_size + 1, 1, 1],
                    strides=[1, 1, 1, 1],
                    padding='VALID',
                    name="pool")

                pooled_outputs.append(pooled)

        # Combine all the pooled features
        num_filters_total = num_filters * len(filter_sizes)
        self.h_pool = tf.concat(3, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        print "before drop out", self.h_pool_flat.get_shape()
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat,
                                        self.dropout_keep_prob)
            print "after drop out", self.h_drop.get_shape()

        # Final (unnormalized) scores and predictions
        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal(
                [num_filters_total, num_classes], stddev=0.1),
                            name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(
                self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions,
                                           tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions,
                                                   "float"),
                                           name="accuracy")
    def __init__(
      self, sequence_length, num_classes, vocab_size,
      embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0):

        # Placeholders for input, output and dropout
        self.input_x = tf.placeholder(tf.int32, [None, sequence_length], name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")

        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        # Embedding layer
        num_filters1 = 8
        num_filters2 = 16
        num_filters3 = num_filters
        with tf.device('/cpu:0'), tf.name_scope("embedding"):
            W = tf.Variable(
                tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
                name="W")
            self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
            self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)

        print self.embedded_chars_expanded.get_shape()
        # Create a convolution + maxpool layer for each filter size
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer size1
                filter_shape = [filter_size, 101, 1, num_filters1]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters1]), name="b")
                conv = tf.nn.conv2d(
                    self.embedded_chars_expanded,
                    W,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters1, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)


                relu1 = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")

                # Convolution layer 2

                filter_shape2 = [2, 101, num_filters1, num_filters2]
                W2 = tf.Variable(tf.truncated_normal(filter_shape2, stddev=0.1), name="W1")
                b2 = tf.Variable(tf.constant(0.1, shape=[num_filters2]), name="b2")
                conv = tf.nn.conv2d(
                    relu1,
                    W2,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn2 = BN(num_filters2, 0.001, ewma2, True)
                update_assignments = bn2.get_assigner()
                bn22 = bn2.normalize(conv, train=True)


                relu2 = tf.nn.relu(tf.nn.bias_add(bn22, b2), name="relu")


                print filter_size, "before pooling", relu2.get_shape()
                # Maxpooling over the outputs
                # pooled = tf.nn.max_pool(
                #     relu1,
                #     ksize=[1, 2, 1, 1],
                #     strides=[1, 2, 1, 1],
                #     padding='VALID',
                #     name="pool")

                # Convolution pooling

                filter_shape_cm = [2, 2, num_filters2, num_filters2]
                W_cm = tf.Variable(tf.truncated_normal(filter_shape_cm, stddev=0.1), name="W1")
                b_cm = tf.Variable(tf.constant(0.1, shape=[num_filters2]), name="b2")
                conv_cm = tf.nn.conv2d(
                    relu2,
                    W_cm,
                    strides=[1, 2, 2, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma_cm = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm = BN(num_filters2, 0.001, ewma_cm, True)
                update_assignments = bn_cm.get_assigner()
                bn_cm_o = bn_cm.normalize(conv_cm, train=True)

                pooled = tf.nn.relu(tf.nn.bias_add(bn_cm_o, b_cm), name="relu")

                print filter_size, "pooling1", pooled.get_shape()



                filter_shape3 = [1, 27, num_filters2, num_filters3]
                W3 = tf.Variable(tf.truncated_normal(filter_shape3, stddev=0.1), name="W3")
                b3 = tf.Variable(tf.constant(0.1, shape=[num_filters3]), name="b3")
                conv3 = tf.nn.conv2d(
                    pooled,
                    W3,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv3")


                # Apply BatchNormalization
                ewma3 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_3 = BN(num_filters3, 0.001, ewma3, True)
                update_assignments = bn_3.get_assigner()
                bn3 = bn_3.normalize(conv3, train=True)


                # Apply nonlinearity
                relu3 = tf.nn.relu(tf.nn.bias_add(bn3, b3), name="relu3")

                # Maxpooling over the outputs

                # Convolution pooling
                w = 2
                # if filter_size == 3:
                #     w = 3

                # pooled3 = tf.nn.max_pool(
                #     relu3,
                #     # ksize=[1, 2, 15, 1],
                #     ksize=[1, w, 15, 1],
                #     strides=[1, 2, 1, 1],
                #     padding='VALID',
                #     name="pool3")

                # pooled3 = tf.nn.top_k(relu3, 10, sorted=False, name="k-max-pooling")
                filter_shape_cm2 = [w, 2, num_filters3, num_filters3]
                W_cm2 = tf.Variable(tf.truncated_normal(filter_shape_cm2, stddev=0.1), name="W1")
                b_cm2 = tf.Variable(tf.constant(0.1, shape=[num_filters3]), name="b2")
                conv_cm2 = tf.nn.conv2d(
                    relu3,
                    W_cm2,
                    strides=[1, 2, 2, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma_cm2 = tf.train.ExponentialMovingAverage(decay=0.99)
                bn_cm2 = BN(num_filters3, 0.001, ewma_cm2, True)
                update_assignments = bn_cm2.get_assigner()
                bn_cm_o2 = bn_cm2.normalize(conv_cm2, train=True)

                pooled3 = tf.nn.relu(tf.nn.bias_add(bn_cm_o2, b_cm2), name="relu")

                pooled_outputs.append(pooled3)
        print pooled_outputs[0].get_shape()
        print pooled_outputs[1].get_shape()
        print pooled_outputs[2].get_shape()
        # Combine all the pooled features
        sum = 0
        for i in pooled_outputs:
            sum += i.get_shape()[1].value
        # Combine all the pooled features
        num_filters_total = num_filters * sum
        self.h_pool = tf.concat(1, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        print "before drop out", self.h_pool_flat.get_shape()
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob)
            print "after drop out", self.h_drop.get_shape()

        # with tf.name_scope("fullyConnected"):
        #     # Fully connected layer
        #     W = tf.Variable(tf.truncated_normal([num_filters_total, 256], stddev=0.1), name="W")
        #     b = tf.Variable(tf.constant(0.1, shape=[256]), name="b")
        #     dense1 = tf.reshape(self.h_drop, [-1, W.get_shape().as_list()[0]]) # Reshape conv2 output to fit dense layer input
        #     dense1 = tf.nn.relu(tf.add(tf.matmul(dense1, W), b)) # Relu activation
        #     dense1 = tf.nn.dropout(dense1, self.dropout_keep_prob) # Apply Dropout

        # Final (unnormalized) scores and predictions
        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal([num_filters_total, num_classes], stddev=0.1), name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")
    def __init__(
      self, sequence_length, num_classes, vocab_size,
      embedding_size, filter_sizes, num_filters, l2_reg_lambda=0.0):

        # Placeholders for input, output and dropout
        self.input_x = tf.placeholder(tf.int32, [None, sequence_length], name="input_x")
        self.input_y = tf.placeholder(tf.float32, [None, num_classes], name="input_y")
        self.dropout_keep_prob = tf.placeholder(tf.float32, name="dropout_keep_prob")

        # Keeping track of l2 regularization loss (optional)
        l2_loss = tf.constant(0.0)

        # Embedding layer
        with tf.device('/cpu:0'), tf.name_scope("embedding"):
            W = tf.Variable(
                tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),
                name="W")
            self.embedded_chars = tf.nn.embedding_lookup(W, self.input_x)
            self.embedded_chars_expanded = tf.expand_dims(self.embedded_chars, -1)

        print self.embedded_chars_expanded.get_shape()
        # Create a convolution + maxpool layer for each filter size
        pooled_outputs = []
        for i, filter_size in enumerate(filter_sizes):
            with tf.name_scope("conv-maxpool-%s" % filter_size):
                # Convolution Layer
                filter_shape = [filter_size, embedding_size, 1, num_filters]
                W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
                b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
                conv = tf.nn.conv2d(
                    self.embedded_chars_expanded,
                    W,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")

                # Apply BatchNormalization

                ewma = tf.train.ExponentialMovingAverage(decay=0.99)
                bn = BN(num_filters, 0.001, ewma, True)
                update_assignments = bn.get_assigner()
                bn1 = bn.normalize(conv, train=True)

                # Apply nonlinearity
                h = tf.nn.relu(tf.nn.bias_add(bn1, b), name="relu")



                # Maxpooling over the outputs
                pooled = tf.nn.max_pool(
                     h,
                     ksize=[1, sequence_length - filter_size + 1, 1, 1],
                     strides=[1, 1, 1, 1],
                     padding='VALID',
                     name="pool")



                pooled_outputs.append(pooled)
        # print pooled_outputs[0].get_shape()
        # print pooled_outputs[1].get_shape()
        # print pooled_outputs[2].get_shape()
        # Combine all the pooled features
        num_filters_total = num_filters * len(filter_sizes)
        self.h_pool = tf.concat(3, pooled_outputs)
        self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])
        print "before drop out", self.h_pool_flat.get_shape()
        # Add dropout
        with tf.name_scope("dropout"):
            self.h_drop = tf.nn.dropout(self.h_pool_flat, self.dropout_keep_prob)
            print "after drop out", self.h_drop.get_shape()

        # with tf.name_scope("fullyConnected"):
        #     # Fully connected layer
        #     W = tf.Variable(tf.truncated_normal([num_filters_total, 256], stddev=0.1), name="W")
        #     b = tf.Variable(tf.constant(0.1, shape=[256]), name="b")
        #     dense1 = tf.reshape(self.h_drop, [-1, W.get_shape().as_list()[0]]) # Reshape conv2 output to fit dense layer input
        #     dense1 = tf.nn.relu(tf.add(tf.matmul(dense1, W), b)) # Relu activation
        #     dense1 = tf.nn.dropout(dense1, self.dropout_keep_prob) # Apply Dropout

        # Final (unnormalized) scores and predictions
        with tf.name_scope("output"):
            W = tf.Variable(tf.truncated_normal([num_filters_total, num_classes], stddev=0.1), name="W")
            b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
            l2_loss += tf.nn.l2_loss(W)
            l2_loss += tf.nn.l2_loss(b)
            self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
            self.predictions = tf.argmax(self.scores, 1, name="predictions")

        # CalculateMean cross-entropy loss
        with tf.name_scope("loss"):
            losses = tf.nn.softmax_cross_entropy_with_logits(self.scores, self.input_y)
            self.loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss

        # Accuracy
        with tf.name_scope("accuracy"):
            correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
            self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")