autoencoder.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. import tensorflow as tf
  4. from sklearn.metrics import accuracy_score
  5. from tensorflow.keras import layers, losses
  6. from tensorflow.keras.models import Model
  7. import misc
  8. latent_dim = 64
  9. print("# GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))
  10. class Autoencoder(Model):
  11. def __init__(self, nary):
  12. super(Autoencoder, self).__init__()
  13. self.latent_dim = latent_dim
  14. self.encoder = tf.keras.Sequential()
  15. self.encoder.add(tf.keras.Input(shape=(nary,), dtype=bool))
  16. self.encoder.add(layers.Dense(units=16))
  17. # self.encoder.add(layers.Dropout(0.2))
  18. self.encoder.add(layers.Dense(units=2))
  19. # self.encoder.add(layers.ReLU(max_value=1.0))
  20. self.decoder = tf.keras.Sequential()
  21. self.decoder.add(tf.keras.Input(shape=(2,)))
  22. self.decoder.add(layers.Dense(units=16))
  23. # self.decoder.add(layers.Dropout(0.2))
  24. self.decoder.add(layers.Dense(units=nary))
  25. self.randomiser = tf.random_normal_initializer(mean=0.0, stddev=0.1, seed=None)
  26. # self.decoder.add(layers.Softmax(units=4, dtype=bool))
  27. # [
  28. # layers.Input(shape=(28, 28, 1)),
  29. # layers.Conv2D(16, (3, 3), activation='relu', padding='same', strides=2),
  30. # layers.Conv2D(8, (3, 3), activation='relu', padding='same', strides=2)
  31. # ])
  32. # self.decoder = tf.keras.Sequential([
  33. # layers.Conv2DTranspose(8, kernel_size=3, strides=2, activation='relu', padding='same'),
  34. # layers.Conv2DTranspose(16, kernel_size=3, strides=2, activation='relu', padding='same'),
  35. # layers.Conv2D(1, kernel_size=(3, 3), activation='sigmoid', padding='same')
  36. # ])
  37. def call(self, x, **kwargs):
  38. encoded = self.encoder(x)
  39. encoded = tf.clip_by_value(encoded, clip_value_min=[0, 0], clip_value_max=[1, 2*np.pi], name=None)
  40. # noise = self.randomiser(shape=(-1, 2), dtype=tf.float32)
  41. noise = np.random.normal(0, 1, (1, 2)) * 0.2
  42. noisy = tf.convert_to_tensor(noise, dtype=tf.float32)
  43. decoded = self.decoder(encoded + noisy)
  44. return decoded
  45. def view_encoder(encoder, N, samples=1000):
  46. test_values = misc.generate_random_bit_array(samples).reshape((-1, N))
  47. mvector = np.array([2**i for i in range(N)], dtype=int)
  48. symbols = (test_values * mvector).sum(axis=1)
  49. encoded = misc.polar2rect(encoder(test_values).numpy())
  50. for i in range(2**N):
  51. xy = encoded[symbols == i]
  52. plt.plot(xy[:, 0], xy[:, 1], 'x', markersize=12, label=format(i, f'0{N}b'))
  53. plt.annotate(xy=[xy[:, 0].mean()+0.01, xy[:, 1].mean()+0.01], text=format(i, f'0{N}b'))
  54. plt.xlabel('Real')
  55. plt.ylabel('Imaginary')
  56. plt.title("Autoencoder generated alphabet")
  57. # plt.legend()
  58. plt.show()
  59. pass
  60. if __name__ == '__main__':
  61. # (x_train, _), (x_test, _) = fashion_mnist.load_data()
  62. #
  63. # x_train = x_train.astype('float32') / 255.
  64. # x_test = x_test.astype('float32') / 255.
  65. #
  66. # print(f"Train data: {x_train.shape}")
  67. # print(f"Test data: {x_test.shape}")
  68. samples = 3e6
  69. n = 4
  70. x_train = misc.generate_random_bit_array(samples).reshape((-1, n))
  71. x_test_array = misc.generate_random_bit_array(samples * 0.25)
  72. x_test = x_test_array.reshape((-1, n))
  73. autoencoder = Autoencoder(n)
  74. autoencoder.compile(optimizer='adam', loss=losses.MeanSquaredError())
  75. autoencoder.fit(x_train, x_train,
  76. epochs=1,
  77. shuffle=True,
  78. validation_data=(x_test, x_test))
  79. encoded_data = autoencoder.encoder(x_test)
  80. decoded_data = autoencoder.decoder(encoded_data).numpy().reshape((-1,))
  81. result = np.zeros(x_test_array.shape, dtype=bool)
  82. result[decoded_data > 0.5] = True
  83. print("Accuracy: %.4f" % accuracy_score(x_test_array, result))
  84. view_encoder(autoencoder.encoder, n)
  85. pass