DenoisingAutoencoder.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import tensorflow as tf
  2. class AdditiveGaussianNoiseAutoencoder(object):
  3. def __init__(self, n_input, n_hidden, transfer_function = tf.nn.softplus, optimizer = tf.train.AdamOptimizer(),
  4. scale = 0.1):
  5. self.n_input = n_input
  6. self.n_hidden = n_hidden
  7. self.transfer = transfer_function
  8. self.scale = tf.placeholder(tf.float32)
  9. self.training_scale = scale
  10. network_weights = self._initialize_weights()
  11. self.weights = network_weights
  12. # model
  13. self.x = tf.placeholder(tf.float32, [None, self.n_input])
  14. self.hidden = self.transfer(tf.add(tf.matmul(self.x + scale * tf.random_normal((n_input,)),
  15. self.weights['w1']),
  16. self.weights['b1']))
  17. self.reconstruction = tf.add(tf.matmul(self.hidden, self.weights['w2']), self.weights['b2'])
  18. # cost
  19. self.cost = 0.5 * tf.reduce_sum(tf.pow(tf.subtract(self.reconstruction, self.x), 2.0))
  20. self.optimizer = optimizer.minimize(self.cost)
  21. init = tf.global_variables_initializer()
  22. self.sess = tf.Session()
  23. self.sess.run(init)
  24. def _initialize_weights(self):
  25. all_weights = dict()
  26. all_weights['w1'] = tf.get_variable("w1", shape=[self.n_input, self.n_hidden],
  27. initializer=tf.contrib.layers.xavier_initializer())
  28. all_weights['b1'] = tf.Variable(tf.zeros([self.n_hidden], dtype = tf.float32))
  29. all_weights['w2'] = tf.Variable(tf.zeros([self.n_hidden, self.n_input], dtype = tf.float32))
  30. all_weights['b2'] = tf.Variable(tf.zeros([self.n_input], dtype = tf.float32))
  31. return all_weights
  32. def partial_fit(self, X):
  33. cost, opt = self.sess.run((self.cost, self.optimizer), feed_dict = {self.x: X,
  34. self.scale: self.training_scale
  35. })
  36. return cost
  37. def calc_total_cost(self, X):
  38. return self.sess.run(self.cost, feed_dict = {self.x: X,
  39. self.scale: self.training_scale
  40. })
  41. def transform(self, X):
  42. return self.sess.run(self.hidden, feed_dict = {self.x: X,
  43. self.scale: self.training_scale
  44. })
  45. def generate(self, hidden=None):
  46. if hidden is None:
  47. hidden = self.sess.run(tf.random_normal([1, self.n_hidden]))
  48. return self.sess.run(self.reconstruction, feed_dict = {self.hidden: hidden})
  49. def reconstruct(self, X):
  50. return self.sess.run(self.reconstruction, feed_dict = {self.x: X,
  51. self.scale: self.training_scale
  52. })
  53. def getWeights(self):
  54. return self.sess.run(self.weights['w1'])
  55. def getBiases(self):
  56. return self.sess.run(self.weights['b1'])
  57. class MaskingNoiseAutoencoder(object):
  58. def __init__(self, n_input, n_hidden, transfer_function = tf.nn.softplus, optimizer = tf.train.AdamOptimizer(),
  59. dropout_probability = 0.95):
  60. self.n_input = n_input
  61. self.n_hidden = n_hidden
  62. self.transfer = transfer_function
  63. self.dropout_probability = dropout_probability
  64. self.keep_prob = tf.placeholder(tf.float32)
  65. network_weights = self._initialize_weights()
  66. self.weights = network_weights
  67. # model
  68. self.x = tf.placeholder(tf.float32, [None, self.n_input])
  69. self.hidden = self.transfer(tf.add(tf.matmul(tf.nn.dropout(self.x, self.keep_prob), self.weights['w1']),
  70. self.weights['b1']))
  71. self.reconstruction = tf.add(tf.matmul(self.hidden, self.weights['w2']), self.weights['b2'])
  72. # cost
  73. self.cost = 0.5 * tf.reduce_sum(tf.pow(tf.subtract(self.reconstruction, self.x), 2.0))
  74. self.optimizer = optimizer.minimize(self.cost)
  75. init = tf.global_variables_initializer()
  76. self.sess = tf.Session()
  77. self.sess.run(init)
  78. def _initialize_weights(self):
  79. all_weights = dict()
  80. all_weights['w1'] = tf.get_variable("w1", shape=[self.n_input, self.n_hidden],
  81. initializer=tf.contrib.layers.xavier_initializer())
  82. all_weights['b1'] = tf.Variable(tf.zeros([self.n_hidden], dtype = tf.float32))
  83. all_weights['w2'] = tf.Variable(tf.zeros([self.n_hidden, self.n_input], dtype = tf.float32))
  84. all_weights['b2'] = tf.Variable(tf.zeros([self.n_input], dtype = tf.float32))
  85. return all_weights
  86. def partial_fit(self, X):
  87. cost, opt = self.sess.run((self.cost, self.optimizer),
  88. feed_dict = {self.x: X, self.keep_prob: self.dropout_probability})
  89. return cost
  90. def calc_total_cost(self, X):
  91. return self.sess.run(self.cost, feed_dict = {self.x: X, self.keep_prob: 1.0})
  92. def transform(self, X):
  93. return self.sess.run(self.hidden, feed_dict = {self.x: X, self.keep_prob: 1.0})
  94. def generate(self, hidden=None):
  95. if hidden is None:
  96. hidden = self.sess.run(tf.random_normal([1, self.n_hidden]))
  97. return self.sess.run(self.reconstruction, feed_dict = {self.hidden: hidden})
  98. def reconstruct(self, X):
  99. return self.sess.run(self.reconstruction, feed_dict = {self.x: X, self.keep_prob: 1.0})
  100. def getWeights(self):
  101. return self.sess.run(self.weights['w1'])
  102. def getBiases(self):
  103. return self.sess.run(self.weights['b1'])