DenoisingAutoencoder.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import tensorflow as tf
  2. import numpy as np
  3. import autoencoder.Utils
  4. class AdditiveGaussianNoiseAutoencoder(object):
  5. def __init__(self, n_input, n_hidden, transfer_function = tf.nn.softplus, optimizer = tf.train.AdamOptimizer(),
  6. scale = 0.1):
  7. self.n_input = n_input
  8. self.n_hidden = n_hidden
  9. self.transfer = transfer_function
  10. self.scale = tf.placeholder(tf.float32)
  11. self.training_scale = scale
  12. network_weights = self._initialize_weights()
  13. self.weights = network_weights
  14. # model
  15. self.x = tf.placeholder(tf.float32, [None, self.n_input])
  16. self.hidden = self.transfer(tf.add(tf.matmul(self.x + scale * tf.random_normal((n_input,)),
  17. self.weights['w1']),
  18. self.weights['b1']))
  19. self.reconstruction = tf.add(tf.matmul(self.hidden, self.weights['w2']), self.weights['b2'])
  20. # cost
  21. self.cost = 0.5 * tf.reduce_sum(tf.pow(tf.sub(self.reconstruction, self.x), 2.0))
  22. self.optimizer = optimizer.minimize(self.cost)
  23. init = tf.global_variables_initializer()
  24. self.sess = tf.Session()
  25. self.sess.run(init)
  26. def _initialize_weights(self):
  27. all_weights = dict()
  28. all_weights['w1'] = tf.Variable(autoencoder.Utils.xavier_init(self.n_input, self.n_hidden))
  29. all_weights['b1'] = tf.Variable(tf.zeros([self.n_hidden], dtype = tf.float32))
  30. all_weights['w2'] = tf.Variable(tf.zeros([self.n_hidden, self.n_input], dtype = tf.float32))
  31. all_weights['b2'] = tf.Variable(tf.zeros([self.n_input], dtype = tf.float32))
  32. return all_weights
  33. def partial_fit(self, X):
  34. cost, opt = self.sess.run((self.cost, self.optimizer), feed_dict = {self.x: X,
  35. self.scale: self.training_scale
  36. })
  37. return cost
  38. def calc_total_cost(self, X):
  39. return self.sess.run(self.cost, feed_dict = {self.x: X,
  40. self.scale: self.training_scale
  41. })
  42. def transform(self, X):
  43. return self.sess.run(self.hidden, feed_dict = {self.x: X,
  44. self.scale: self.training_scale
  45. })
  46. def generate(self, hidden = None):
  47. if hidden is None:
  48. hidden = np.random.normal(size = self.weights["b1"])
  49. return self.sess.run(self.reconstruction, feed_dict = {self.hidden: hidden})
  50. def reconstruct(self, X):
  51. return self.sess.run(self.reconstruction, feed_dict = {self.x: X,
  52. self.scale: self.training_scale
  53. })
  54. def getWeights(self):
  55. return self.sess.run(self.weights['w1'])
  56. def getBiases(self):
  57. return self.sess.run(self.weights['b1'])
  58. class MaskingNoiseAutoencoder(object):
  59. def __init__(self, n_input, n_hidden, transfer_function = tf.nn.softplus, optimizer = tf.train.AdamOptimizer(),
  60. dropout_probability = 0.95):
  61. self.n_input = n_input
  62. self.n_hidden = n_hidden
  63. self.transfer = transfer_function
  64. self.dropout_probability = dropout_probability
  65. self.keep_prob = tf.placeholder(tf.float32)
  66. network_weights = self._initialize_weights()
  67. self.weights = network_weights
  68. # model
  69. self.x = tf.placeholder(tf.float32, [None, self.n_input])
  70. self.hidden = self.transfer(tf.add(tf.matmul(tf.nn.dropout(self.x, self.keep_prob), self.weights['w1']),
  71. self.weights['b1']))
  72. self.reconstruction = tf.add(tf.matmul(self.hidden, self.weights['w2']), self.weights['b2'])
  73. # cost
  74. self.cost = 0.5 * tf.reduce_sum(tf.pow(tf.sub(self.reconstruction, self.x), 2.0))
  75. self.optimizer = optimizer.minimize(self.cost)
  76. init = tf.global_variables_initializer()
  77. self.sess = tf.Session()
  78. self.sess.run(init)
  79. def _initialize_weights(self):
  80. all_weights = dict()
  81. all_weights['w1'] = tf.Variable(autoencoder.Utils.xavier_init(self.n_input, self.n_hidden))
  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 = np.random.normal(size = self.weights["b1"])
  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'])