min_test.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. """
  2. These are some unstructured tests. Feel free to use this code for anything else
  3. """
  4. import logging
  5. import pathlib
  6. from itertools import chain
  7. from sys import stdout
  8. from tensorflow.python.framework.errors_impl import NotFoundError
  9. from tensorflow.keras import backend as K
  10. import defs
  11. from graphs import get_SNR, get_AWGN_ber, show_train_history
  12. from models import basic
  13. from models.autoencoder import Autoencoder, view_encoder
  14. import matplotlib.pyplot as plt
  15. import tensorflow as tf
  16. import misc
  17. import numpy as np
  18. from models.basic import AlphabetDemod, AlphabetMod
  19. from models.data import BinaryGenerator
  20. from models.layers import BitsToSymbols, SymbolsToBits
  21. from models.optical_channel import OpticalChannel
  22. from models.quantized_net import QuantizedNeuralNetwork
  23. def _test_optics_autoencoder():
  24. ch = OpticalChannel(
  25. noise_level=-10,
  26. dispersion=-21.7,
  27. symbol_rate=10e9,
  28. sample_rate=400e9,
  29. length=10,
  30. pulse_shape='rcos',
  31. sqrt_out=True
  32. )
  33. tf.executing_eagerly()
  34. aenc = Autoencoder(4, channel=ch)
  35. aenc.train(samples=1e6)
  36. plt.plot(*get_SNR(
  37. aenc.get_modulator(),
  38. aenc.get_demodulator(),
  39. ber_func=get_AWGN_ber,
  40. samples=100000,
  41. steps=50,
  42. start=-5,
  43. stop=15
  44. ), '-', label='AE')
  45. plt.plot(*get_SNR(
  46. AlphabetMod('4pam', 10e6),
  47. AlphabetDemod('4pam', 10e6),
  48. samples=30000,
  49. steps=50,
  50. start=-5,
  51. stop=15,
  52. length=1,
  53. pulse_shape='rcos'
  54. ), '-', label='4PAM')
  55. plt.yscale('log')
  56. plt.grid()
  57. plt.xlabel('SNR dB')
  58. plt.title("Autoencoder Performance")
  59. plt.legend()
  60. plt.savefig('optics_autoencoder.eps', format='eps')
  61. plt.show()
  62. def _test_autoencoder_pretrain():
  63. # aenc = Autoencoder(4, -25)
  64. # aenc.train(samples=1e6)
  65. # plt.plot(*get_SNR(
  66. # aenc.get_modulator(),
  67. # aenc.get_demodulator(),
  68. # ber_func=get_AWGN_ber,
  69. # samples=100000,
  70. # steps=50,
  71. # start=-5,
  72. # stop=15
  73. # ), '-', label='Random AE')
  74. aenc = Autoencoder(4, -25)
  75. # aenc.fit_encoder('16qam', 3e4)
  76. aenc.fit_decoder('16qam', 1e5)
  77. plt.plot(*get_SNR(
  78. aenc.get_modulator(),
  79. aenc.get_demodulator(),
  80. ber_func=get_AWGN_ber,
  81. samples=100000,
  82. steps=50,
  83. start=-5,
  84. stop=15
  85. ), '-', label='16QAM Pre-trained AE')
  86. aenc.train(samples=3e6)
  87. plt.plot(*get_SNR(
  88. aenc.get_modulator(),
  89. aenc.get_demodulator(),
  90. ber_func=get_AWGN_ber,
  91. samples=100000,
  92. steps=50,
  93. start=-5,
  94. stop=15
  95. ), '-', label='16QAM Post-trained AE')
  96. plt.plot(*get_SNR(
  97. AlphabetMod('16qam', 10e6),
  98. AlphabetDemod('16qam', 10e6),
  99. ber_func=get_AWGN_ber,
  100. samples=100000,
  101. steps=50,
  102. start=-5,
  103. stop=15
  104. ), '-', label='16QAM')
  105. plt.yscale('log')
  106. plt.grid()
  107. plt.xlabel('SNR dB')
  108. plt.title("4Bit Autoencoder Performance")
  109. plt.legend()
  110. plt.show()
  111. class LiteTFMod(defs.Modulator):
  112. def __init__(self, name, autoencoder):
  113. super().__init__(2 ** autoencoder.N)
  114. self.autoencoder = autoencoder
  115. tflite_models_dir = pathlib.Path("/tmp/tflite/")
  116. tflite_model_file = tflite_models_dir / (name + ".tflite")
  117. self.interpreter = tf.lite.Interpreter(model_path=str(tflite_model_file))
  118. self.interpreter.allocate_tensors()
  119. pass
  120. def forward(self, binary: np.ndarray):
  121. reshaped = binary.reshape((-1, (self.N * self.autoencoder.parallel)))
  122. reshaped_ho = misc.bit_matrix2one_hot(reshaped)
  123. input_index = self.interpreter.get_input_details()[0]["index"]
  124. input_dtype = self.interpreter.get_input_details()[0]["dtype"]
  125. input_shape = self.interpreter.get_input_details()[0]["shape"]
  126. output_index = self.interpreter.get_output_details()[0]["index"]
  127. output_shape = self.interpreter.get_output_details()[0]["shape"]
  128. x = np.zeros((len(reshaped_ho), output_shape[1]))
  129. for i, ho in enumerate(reshaped_ho):
  130. self.interpreter.set_tensor(input_index, ho.reshape(input_shape).astype(input_dtype))
  131. self.interpreter.invoke()
  132. x[i] = self.interpreter.get_tensor(output_index)
  133. if self.autoencoder.bipolar:
  134. x = x * 2 - 1
  135. if self.autoencoder.parallel > 1:
  136. x = x.reshape((-1, self.autoencoder.signal_dim))
  137. f = np.zeros(x.shape[0])
  138. if self.autoencoder.signal_dim <= 1:
  139. p = np.zeros(x.shape[0])
  140. else:
  141. p = x[:, 1]
  142. x3 = misc.rect2polar(np.c_[x[:, 0], p, f])
  143. return basic.RFSignal(x3)
  144. class LiteTFDemod(defs.Demodulator):
  145. def __init__(self, name, autoencoder):
  146. super().__init__(2 ** autoencoder.N)
  147. self.autoencoder = autoencoder
  148. tflite_models_dir = pathlib.Path("/tmp/tflite/")
  149. tflite_model_file = tflite_models_dir / (name + ".tflite")
  150. self.interpreter = tf.lite.Interpreter(model_path=str(tflite_model_file))
  151. self.interpreter.allocate_tensors()
  152. def forward(self, values: defs.Signal) -> np.ndarray:
  153. if self.autoencoder.signal_dim <= 1:
  154. val = values.rect_x
  155. else:
  156. val = values.rect
  157. if self.autoencoder.parallel > 1:
  158. val = val.reshape((-1, self.autoencoder.parallel))
  159. input_index = self.interpreter.get_input_details()[0]["index"]
  160. input_dtype = self.interpreter.get_input_details()[0]["dtype"]
  161. input_shape = self.interpreter.get_input_details()[0]["shape"]
  162. output_index = self.interpreter.get_output_details()[0]["index"]
  163. output_shape = self.interpreter.get_output_details()[0]["shape"]
  164. decoded = np.zeros((len(val), output_shape[1]))
  165. for i, v in enumerate(val):
  166. self.interpreter.set_tensor(input_index, v.reshape(input_shape).astype(input_dtype))
  167. self.interpreter.invoke()
  168. decoded[i] = self.interpreter.get_tensor(output_index)
  169. result = misc.int2bit_array(decoded.argmax(axis=1), self.N * self.autoencoder.parallel)
  170. return result.reshape(-1, )
  171. def _test_autoencoder_perf():
  172. assert float(tf.__version__[:3]) >= 2.3
  173. # aenc = Autoencoder(3, -15)
  174. # aenc.train(samples=1e6)
  175. # plt.plot(*get_SNR(
  176. # aenc.get_modulator(),
  177. # aenc.get_demodulator(),
  178. # ber_func=get_AWGN_ber,
  179. # samples=100000,
  180. # steps=50,
  181. # start=-5,
  182. # stop=15
  183. # ), '-', label='3Bit AE')
  184. # aenc = Autoencoder(4, -25, bipolar=True, dtype=tf.float64)
  185. # aenc.train(samples=5e5)
  186. # plt.plot(*get_SNR(
  187. # aenc.get_modulator(),
  188. # aenc.get_demodulator(),
  189. # ber_func=get_AWGN_ber,
  190. # samples=100000,
  191. # steps=50,
  192. # start=-5,
  193. # stop=15
  194. # ), '-', label='4Bit AE F64')
  195. aenc = Autoencoder(4, -25, bipolar=True)
  196. aenc.train(epoch_size=1e3, epochs=10)
  197. # #
  198. m = aenc.N * aenc.parallel
  199. x_train = misc.bit_matrix2one_hot(misc.generate_random_bit_array(100 * m).reshape((-1, m)))
  200. x_train_enc = aenc.encoder(x_train)
  201. x_train = tf.cast(x_train, tf.float32)
  202. #
  203. # plt.plot(*get_SNR(
  204. # aenc.get_modulator(),
  205. # aenc.get_demodulator(),
  206. # ber_func=get_AWGN_ber,
  207. # samples=100000,
  208. # steps=50,
  209. # start=-5,
  210. # stop=15
  211. # ), '-', label='4AE F32')
  212. # # #
  213. def save_tfline(model, name, types=None, ops=None, io_types=None, train_x=None):
  214. converter = tf.lite.TFLiteConverter.from_keras_model(model)
  215. if types is not None:
  216. converter.optimizations = [tf.lite.Optimize.DEFAULT]
  217. converter.target_spec.supported_types = types
  218. if ops is not None:
  219. converter.optimizations = [tf.lite.Optimize.DEFAULT]
  220. converter.target_spec.supported_ops = ops
  221. if io_types is not None:
  222. converter.inference_input_type = io_types
  223. converter.inference_output_type = io_types
  224. if train_x is not None:
  225. def representative_data_gen():
  226. for input_value in tf.data.Dataset.from_tensor_slices(train_x).batch(1).take(100):
  227. yield [input_value]
  228. converter.representative_dataset = representative_data_gen
  229. tflite_model = converter.convert()
  230. tflite_models_dir = pathlib.Path("/tmp/tflite/")
  231. tflite_models_dir.mkdir(exist_ok=True, parents=True)
  232. tflite_model_file = tflite_models_dir / (name + ".tflite")
  233. tflite_model_file.write_bytes(tflite_model)
  234. print("Saving models")
  235. save_tfline(aenc.encoder, "default_enc")
  236. save_tfline(aenc.decoder, "default_dec")
  237. #
  238. # save_tfline(aenc.encoder, "float16_enc", [tf.float16])
  239. # save_tfline(aenc.decoder, "float16_dec", [tf.float16])
  240. #
  241. # save_tfline(aenc.encoder, "bfloat16_enc", [tf.bfloat16])
  242. # save_tfline(aenc.decoder, "bfloat16_dec", [tf.bfloat16])
  243. INT16X8 = tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8
  244. save_tfline(aenc.encoder, "int16x8_enc", ops=[INT16X8], train_x=x_train)
  245. save_tfline(aenc.decoder, "int16x8_dec", ops=[INT16X8], train_x=x_train_enc)
  246. # save_tfline(aenc.encoder, "int8_enc", ops=[tf.lite.OpsSet.TFLITE_BUILTINS_INT8], io_types=tf.uint8, train_x=x_train)
  247. # save_tfline(aenc.decoder, "int8_dec", ops=[tf.lite.OpsSet.TFLITE_BUILTINS_INT8], io_types=tf.uint8, train_x=x_train_enc)
  248. print("Testing BER vs SNR")
  249. plt.plot(*get_SNR(
  250. LiteTFMod("default_enc", aenc),
  251. LiteTFDemod("default_dec", aenc),
  252. ber_func=get_AWGN_ber,
  253. samples=100000,
  254. steps=50,
  255. start=-5,
  256. stop=15
  257. ), '-', label='4AE F32')
  258. # plt.plot(*get_SNR(
  259. # LiteTFMod("float16_enc", aenc),
  260. # LiteTFDemod("float16_dec", aenc),
  261. # ber_func=get_AWGN_ber,
  262. # samples=100000,
  263. # steps=50,
  264. # start=-5,
  265. # stop=15
  266. # ), '-', label='4AE F16')
  267. # #
  268. # plt.plot(*get_SNR(
  269. # LiteTFMod("bfloat16_enc", aenc),
  270. # LiteTFDemod("bfloat16_dec", aenc),
  271. # ber_func=get_AWGN_ber,
  272. # samples=100000,
  273. # steps=50,
  274. # start=-5,
  275. # stop=15
  276. # ), '-', label='4AE BF16')
  277. #
  278. plt.plot(*get_SNR(
  279. LiteTFMod("int16x8_enc", aenc),
  280. LiteTFDemod("int16x8_dec", aenc),
  281. ber_func=get_AWGN_ber,
  282. samples=100000,
  283. steps=50,
  284. start=-5,
  285. stop=15
  286. ), '-', label='4AE I16x8')
  287. # plt.plot(*get_SNR(
  288. # AlphabetMod('16qam', 10e6),
  289. # AlphabetDemod('16qam', 10e6),
  290. # ber_func=get_AWGN_ber,
  291. # samples=100000,
  292. # steps=50,
  293. # start=-5,
  294. # stop=15,
  295. # ), '-', label='16qam')
  296. plt.yscale('log')
  297. plt.grid()
  298. plt.xlabel('SNR dB')
  299. plt.ylabel('BER')
  300. plt.title("Autoencoder with different precision data types")
  301. plt.legend()
  302. plt.savefig('autoencoder_compression.eps', format='eps')
  303. plt.show()
  304. view_encoder(aenc.encoder, 4)
  305. # aenc = Autoencoder(5, -25)
  306. # aenc.train(samples=2e6)
  307. # plt.plot(*get_SNR(
  308. # aenc.get_modulator(),
  309. # aenc.get_demodulator(),
  310. # ber_func=get_AWGN_ber,
  311. # samples=100000,
  312. # steps=50,
  313. # start=-5,
  314. # stop=15
  315. # ), '-', label='5Bit AE')
  316. #
  317. # aenc = Autoencoder(6, -25)
  318. # aenc.train(samples=2e6)
  319. # plt.plot(*get_SNR(
  320. # aenc.get_modulator(),
  321. # aenc.get_demodulator(),
  322. # ber_func=get_AWGN_ber,
  323. # samples=100000,
  324. # steps=50,
  325. # start=-5,
  326. # stop=15
  327. # ), '-', label='6Bit AE')
  328. #
  329. # for scheme in ['64qam', '32qam', '16qam', 'qpsk', '8psk']:
  330. # plt.plot(*get_SNR(
  331. # AlphabetMod(scheme, 10e6),
  332. # AlphabetDemod(scheme, 10e6),
  333. # ber_func=get_AWGN_ber,
  334. # samples=100000,
  335. # steps=50,
  336. # start=-5,
  337. # stop=15,
  338. # ), '-', label=scheme.upper())
  339. #
  340. # plt.yscale('log')
  341. # plt.grid()
  342. # plt.xlabel('SNR dB')
  343. # plt.title("Autoencoder vs defined modulations")
  344. # plt.legend()
  345. # plt.show()
  346. def _test_autoencoder_perf2():
  347. aenc = Autoencoder(2, -20)
  348. aenc.train(samples=3e6)
  349. plt.plot(*get_SNR(aenc.get_modulator(), aenc.get_demodulator(), ber_func=get_AWGN_ber, samples=100000, steps=50,
  350. start=-5, stop=15), '-', label='2Bit AE')
  351. aenc = Autoencoder(3, -20)
  352. aenc.train(samples=3e6)
  353. plt.plot(*get_SNR(aenc.get_modulator(), aenc.get_demodulator(), ber_func=get_AWGN_ber, samples=100000, steps=50,
  354. start=-5, stop=15), '-', label='3Bit AE')
  355. aenc = Autoencoder(4, -20)
  356. aenc.train(samples=3e6)
  357. plt.plot(*get_SNR(aenc.get_modulator(), aenc.get_demodulator(), ber_func=get_AWGN_ber, samples=100000, steps=50,
  358. start=-5, stop=15), '-', label='4Bit AE')
  359. aenc = Autoencoder(5, -20)
  360. aenc.train(samples=3e6)
  361. plt.plot(*get_SNR(aenc.get_modulator(), aenc.get_demodulator(), ber_func=get_AWGN_ber, samples=100000, steps=50,
  362. start=-5, stop=15), '-', label='5Bit AE')
  363. for a in ['qpsk', '8psk', '16qam', '32qam', '64qam']:
  364. try:
  365. plt.plot(
  366. *get_SNR(AlphabetMod(a, 10e6), AlphabetDemod(a, 10e6), ber_func=get_AWGN_ber, samples=100000, steps=50,
  367. start=-5, stop=15, ), '-', label=a.upper())
  368. except KeyboardInterrupt:
  369. break
  370. except Exception:
  371. pass
  372. plt.yscale('log')
  373. plt.grid()
  374. plt.xlabel('SNR dB')
  375. plt.title("Autoencoder vs defined modulations")
  376. plt.legend()
  377. plt.savefig('autoencoder_mods.eps', format='eps')
  378. plt.show()
  379. # view_encoder(aenc.encoder, 2)
  380. def _test_autoencoder_perf_qnn():
  381. fh = logging.FileHandler("model_quantizing.log", mode="w+")
  382. fh.setLevel(logging.INFO)
  383. sh = logging.StreamHandler(stream=stdout)
  384. sh.setLevel(logging.INFO)
  385. logger = logging.getLogger(__name__)
  386. logger.setLevel(level=logging.INFO)
  387. logger.addHandler(fh)
  388. logger.addHandler(sh)
  389. aenc = Autoencoder(4, -25, bipolar=True)
  390. # aenc.encoder.save_weights('ae_enc.bin')
  391. # aenc.decoder.save_weights('ae_dec.bin')
  392. # aenc.encoder.load_weights('ae_enc.bin')
  393. # aenc.decoder.load_weights('ae_dec.bin')
  394. try:
  395. aenc.load_weights('autoencoder')
  396. except NotFoundError:
  397. aenc.train(epoch_size=1e3, epochs=10)
  398. aenc.save_weights('autoencoder')
  399. aenc.compile(optimizer='adam', loss=tf.losses.MeanSquaredError())
  400. m = aenc.N * aenc.parallel
  401. view_encoder(aenc.encoder, 4, title="FP32 Alphabet")
  402. batch_size = 25000
  403. x_train = misc.bit_matrix2one_hot(misc.generate_random_bit_array(batch_size * m).reshape((-1, m)))
  404. x_test = misc.bit_matrix2one_hot(misc.generate_random_bit_array(5000 * m).reshape((-1, m)))
  405. bits = [np.log2(i) for i in (32,)][0]
  406. alphabet_scalars = 2 # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  407. num_layers = sum([layer.__class__.__name__ in ('Dense',) for layer in aenc.all_layers])
  408. # for b in (3, 6, 8, 12, 16, 24, 32, 48, 64):
  409. get_data = (sample for sample in x_train)
  410. for i in range(num_layers):
  411. get_data = chain(get_data, (sample for sample in x_train))
  412. qnn = QuantizedNeuralNetwork(
  413. network=aenc,
  414. batch_size=batch_size,
  415. get_data=get_data,
  416. logger=logger,
  417. bits=np.log2(16),
  418. alphabet_scalar=alphabet_scalars,
  419. )
  420. qnn.quantize_network()
  421. qnn.quantized_net.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError())
  422. view_encoder(qnn.quantized_net, 4, title=f"Quantised {16}b alphabet")
  423. # view_encoder(qnn_enc.quantized_net, 4, title=f"Quantised {b}b alphabet")
  424. # _, q_accuracy = qnn.quantized_net.evaluate(x_test, x_test, verbose=True)
  425. pass
  426. class BitAwareAutoencoder(Autoencoder):
  427. def __init__(self, N, channel, **kwargs):
  428. super().__init__(N, channel, **kwargs, cost=self.cost)
  429. self.BITS = 2 ** N - 1
  430. # data_generator=BinaryGenerator,
  431. # self.b2s_layer = BitsToSymbols(2**N)
  432. # self.s2b_layer = SymbolsToBits(2**N)
  433. def cost(self, y_true, y_pred):
  434. y = tf.cast(y_true, dtype=tf.float32)
  435. z0 = tf.math.argmax(y) / self.BITS
  436. z1 = tf.math.argmax(y_pred) / self.BITS
  437. error0 = y - y_pred
  438. sqr_error0 = K.square(error0) # mean of the square of the error
  439. mean_sqr_error0 = K.mean(sqr_error0) # square root of the mean of the square of the error
  440. sme0 = K.sqrt(mean_sqr_error0) # return the error
  441. error1 = z0 - z1
  442. sqr_error1 = K.square(error1)
  443. mean_sqr_error1 = K.mean(sqr_error1)
  444. sme1 = K.sqrt(mean_sqr_error1)
  445. return sme0 + tf.cast(sme1 * 300, dtype=tf.float32)
  446. # def call(self, x, **kwargs):
  447. # x1 = self.b2s_layer(x)
  448. # y = self.encoder(x1)
  449. # z = self.channel(y)
  450. # z1 = self.decoder(z)
  451. # return self.s2b_layer(z1)
  452. def _bit_aware_test():
  453. aenc = BitAwareAutoencoder(6, -50, bipolar=True)
  454. try:
  455. aenc.load_weights('ae_bitaware')
  456. except NotFoundError:
  457. pass
  458. # try:
  459. # hist = aenc.train(
  460. # epochs=70,
  461. # epoch_size=1e3,
  462. # optimizer='adam',
  463. # # metrics=[tf.keras.metrics.Accuracy()],
  464. # # callbacks=[tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3, min_delta=0.001)]
  465. # )
  466. # show_train_history(hist, "Autonecoder training history")
  467. # except KeyboardInterrupt:
  468. # aenc.save_weights('ae_bitaware')
  469. # exit(0)
  470. #
  471. # aenc.save_weights('ae_bitaware')
  472. view_encoder(aenc.encoder, 6, title=f"4bit autoencoder alphabet")
  473. print("Computing BER/SNR for autoencoder")
  474. plt.plot(*get_SNR(
  475. aenc.get_modulator(),
  476. aenc.get_demodulator(),
  477. ber_func=get_AWGN_ber,
  478. samples=1000000, steps=40,
  479. start=-5, stop=15), '-', label='4Bit AE')
  480. print("Computing BER/SNR for QAM16")
  481. plt.plot(*get_SNR(
  482. AlphabetMod('64qam', 10e6),
  483. AlphabetDemod('64qam', 10e6),
  484. ber_func=get_AWGN_ber,
  485. samples=1000000,
  486. steps=40,
  487. start=-5,
  488. stop=15,
  489. ), '-', label='16qam AWGN')
  490. plt.yscale('log')
  491. plt.grid()
  492. plt.xlabel('SNR dB')
  493. plt.ylabel('BER')
  494. plt.title("16QAM vs autoencoder")
  495. plt.show()
  496. if __name__ == '__main__':
  497. _bit_aware_test()
  498. # _test_autoencoder_perf()
  499. # _test_autoencoder_perf_qnn()
  500. # _test_autoencoder_perf2()
  501. # _test_autoencoder_pretrain()
  502. # _test_optics_autoencoder()