CNN.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import tensorflow as tf
  2. import numpy as np
  3. class CNNtextual(object):
  4. def __init__(self, embedding_matrix, sequence_length, vocab_size, embedding_size, filter_sizes, num_filters):
  5. # Placeholders for input, dropout
  6. self.input_text = tf.placeholder(tf.int32, [None, sequence_length], name="input_text")
  7. self.keep_prob = tf.placeholder(tf.float32, name="keep_prob")
  8. # embedding layer
  9. with tf.name_scope("embedding"):
  10. self.embed_input = tf.nn.embedding_lookup(embedding_matrix, self.input_x)
  11. self.embed_input_expanded = tf.expand_dims(self.embed_input, -1)
  12. # conv and maxpool layer for each size
  13. pooled_ouputs = []
  14. for i, filter_size in enumerate(filter_sizes):
  15. with tf.name_scope("conv-maxpool-{}".format(str(filter_size))):
  16. # Conv layer
  17. filter_shape = [filter_size, embedding_size, 1, num_filters]
  18. W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
  19. b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
  20. conv = tf.nn.conv2d(self.embed_input_expanded, W, strides=[1,1,1,1], padding="VALID", name="conv")
  21. # relu
  22. h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
  23. # max-pooling over outputs
  24. pooled = tf.nn.max_pool(h, ksize=[1, sequence_length-filter_size + 1, 1, 1], padding="VALID", name="pool")
  25. pooled_outputs.append(pooled)
  26. # Combine all pooled features
  27. num_filters_total = num_filters*len(filter_sizes)
  28. self.hpool = tf.concat(3, pooled_outputs)
  29. self.hpool_flat = tf.reshape(self.hpool, [-1, num_filters_total])
  30. # dropout
  31. with tf.name_scope("dropout"):
  32. self.h_drop = tf.nn.dropout(self.h_pool_flat, self.keep_prob)
  33. # TODO Recurrent layer
  34. with sess as tf.Session():