{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 構建自動編碼器(Autoencoder)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "注意: 這篇文章的內容需要一些對Keras的理解, 這先確認你/妳己先閱讀並練習過以下的連結內容:\n", "\n", "* [1.1-keras-functional-api](https://github.com/erhwenkuo/deep-learning-with-keras-notebooks/blob/master/1.1-keras-functional-api.ipynb)\n", "\n", "為了獲得最好的學習效果與理解, 強烈建議先行聆聽以下的線上課程:\n", "* [台大李宏毅 - (ML Lecture 16: Unsupervised Learning - Auto-encoder)](https://www.youtube.com/watch?v=Tk5B4seA-AU&lc=z13atbuzfxjtzx1nf23iw5thtrrdxjnga04)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在本教程中,我們將回答關於autoencoders的一些常見問題,我們將介紹以下模型的代碼示例:\n", "* 一個基於完全連接層(fully-connected layer)的簡單的自動編碼器\n", "* 一個深度完全連接(deep fully-connected)的自動編碼器\n", "* 一個深度卷積(deep convolutional)自動編碼器\n", "* 圖像去噪(denoising)模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 什麼是自動編碼器?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![auto-encoder](https://blog.keras.io/img/ae/autoencoder_schema.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "“自動編碼(Autoencoding)”是一種數據壓縮算法,其中壓縮和解壓縮功能是:\n", "1. 針對特定的數據\n", "2. 有損的\n", "3. 自動從數據中學習而不是由人工設計\n", "\n", "另外,在幾乎所有使用術語“自動編碼器”的情況下,壓縮和解壓縮功能都是用神經網絡來實現的。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. 針對特定的數據\n", "\n", "自動編碼器是針對特定的數據,這意味著它們只能壓縮類似於他們所訓練的數據。這與例如MPEG-2音頻層壓縮算法不同,後者通常只保留關於“聲音”的假設,而不涉及特定類型的聲音。在\"臉部\"圖片上訓練的自動編碼器在壓縮\"樹\"的圖片方面做得相當差,因為它將學習的特徵是\"臉部\"特定的。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. 有損的\n", "\n", "自動編碼器是有損失的壓縮,這意味著與原始輸入相比,解壓縮的輸出會降低(類似於MP3或JPEG壓縮)。這與無損壓縮算法不同。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. 自動從數據中學習而不是由人工設計\n", "\n", "自動編碼器是從數據中自動學習的,這是一很有用的特性:這意味著很容易訓練出特定的算法實例,在特定類型的輸入上運行良好。它不需要任何新的工程,只需要適當的訓練數據。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "要構建一個自動編碼器,需要三件事:編碼函數,解碼函數和數據壓縮表示與解壓縮表示(即“丟失”函數)之間的信息損失量之間的距離函數。\n", "\n", "編碼器和解碼器將被選擇為參數函數(通常為神經網絡),並且相對於距離函數是可微分的,因此可以優化編碼/解碼函數的參數以最小化重構損失,使用隨機梯度下降。這很簡單!而且你甚至不需要理解這些詞語就可以在實踐中開始使用自動編碼器。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 他們擅長數據壓縮嗎?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "一般來說並不擅長。例如在圖片壓縮中,訓練一個比JPEG這樣的基本算法效果更好的自動編碼器是相當困難的,而且通常可以實現的唯一方法是將自己限制在一個非常特定類型的圖片上(例如用於哪個JPEG做不好)。自動編碼器是用特定的 數據所訓練出來的事實使得它們對於不能有效的解決現實世界中的數據壓縮問題:您只能將它們用於與其所訓練的數據類似的數據,並使其更加通用,因此需要大量的訓練數據。但是誰知道,未來的進展可能會改變這一點。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 那麼自動編碼器擅長?\n", "\n", "自動編碼器在實際應用中很少被使用。在2012年,它們被發現可以應用於一種用於深層卷積神經網絡的貪心分層預訓練上[1],但是隨著我們開始意識到更好的隨機加權初始化方案足以從頭開始訓練深度網絡,它很快就又被拋棄了。在2014年,批量標準化(batch normalization)[2]開始允許更深層次的網絡,從2015年下半年起,我們可以使用殘差學習(residual learning)從頭開始任意深度訓練網絡[3]。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "今天自動編碼器的兩個有趣的實際應用是數據去噪(我們在後面將會介紹)和數據可視化的降維。通過適當的維度和稀疏性約束,自動編碼器可以學習比PCA或其他基本技術更有趣的數據投影。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "對於2D可視化而言,t-SNE(發音為“tee-snee”)可能是最好的算法,但它通常需要相對較低維的數據。因此,在高維數據中可視化相似關係的一個好方法是先使用自動編碼器將數據壓縮到低維空間(例如32維),然後使用t-SNE將壓縮數據映射到2D平面。請注意,Keras中的一個很好的參數實現t-SNE是由Kyle McDonald開發的,可在Github上找到。否則scikit-learn也有一個簡單實用的實現。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 那麼autoencoders有什麼大不了的?\n", "\n", "他們的主要聲譽來自於在線提供的許多入門機器學習課程中的特色。因此,這個領域的很多新手絕對喜歡自動編碼器,但卻苦於不知該如何入門。這就是本教程存在的原因!\n", "\n", "另外吸引如此多研究和關注的一個原因是因為它們一直被認為是解決無監督學習問題的潛在途徑,即無需標籤就可以學習有用的表示(representation)。但是,自動編碼器不是一個真正的無監督學習技術(這將意味著完全不同的學習過程),它們是一個自我監督的技術,一個監督學習的特定實例,其中目標是從輸入數據生成的。為了獲得自我監督的模型來學習有趣的特徵,你必須提出一個有趣的合成目標和損失函數,這就是問題出現的地方:僅僅學習重新構造你的輸入可能不是一個正確的選擇。在這一點上,有重要的證據表明,例如,重點放在像素級的圖像重建不能有效地學習標籤監督學習所引起的有趣的抽象特徵(其中目標是相當抽象的概念) “由諸如”狗“,”汽車“等人類)。實際上,有人可能會爭辯說,在這方面,autoencoder最好的特點是在那些你所感興趣的主要任務(分類,定位等等)上使用不怎麼樣的特徵輸入然而獲得高性能的精確重建。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在應用於計算機視覺的自我監督學習中,自動編碼器式輸入重建的一個潛在的而且富有成效的替代方法是使用玩具任務,例如拼圖遊戲求解或細節上下文匹配(能夠將高分辨率但小塊的圖片與他們從中提取的圖片的低分辨率版本)。下面的文章研究了拼圖遊戲的解決方法,並做了一個非常有趣的閱讀:Noroozi和Favaro(2016)通過解決拼圖遊戲的視覺表示的無監督學習。這些任務為模型提供了關於傳統自動編碼器中缺少的輸入數據的內置假設,例如“視覺宏觀結構比像素級細節更重要”。\n", "\n", "![jigsaw](https://blog.keras.io/img/ae/jigsaw-puzzle.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 我們來構建最簡單的自動編碼器\n", "\n", "我們將從簡單的開始,將一個完全連接(fully-connected)的神經層作為編碼器和解碼器:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "from keras.layers import Input, Dense\n", "from keras.models import Model\n", "\n", "# 這是我們要進行編碼表示(representation)的大小\n", "encoding_dim = 32 # 32 浮點數 -> 假如我們的輸入是784個浮點數, 那麼壓縮係數為: 784/32 = 24.5\n", "\n", "# 這是我們的輸入的佔位符(place holder)\n", "input_img_fc = Input(shape=(784,))\n", "\n", "# \"encoded\"是輸入編碼過後的表示(representation)\n", "encoded_fc = Dense(encoding_dim, activation='relu')(input_img_fc)\n", "\n", "# \"decoded\"是有損失的解碼結果\n", "decoded_fc = Dense(784, activation='sigmoid')(encoded_fc)\n", "\n", "# 串接編碼(encoded)與解碼(decoded)的模型\n", "autoencoder_fc = Model(input_img_fc, decoded_fc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我們還要創建一個單獨的編碼器模型:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 這個模型串接輸入到編碼表示(representation)\n", "encoder_fc = Model(input_img_fc, encoded_fc)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以及解碼器模型:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 產生一個佔位符來做為\"編碼表示(32-dimensional)\"的輸入\n", "encoded_input_fc = Input(shape=(encoding_dim,))\n", "\n", "# 取得autoencoder模型最後一層的神經層\n", "decoder_layer_fc = autoencoder_fc.layers[-1]\n", "\n", "# 產生解碼模型\n", "decoder_fc = Model(encoded_input_fc, decoder_layer_fc(encoded_input_fc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "現在讓我們訓練我們的自動編碼器來重建MNIST數字。\n", "\n", "首先,我們將我們的模型配置為使用每像素二進制信號(binary crossentropy)損失函數,以及Adadelta優化器:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input_1 (InputLayer) (None, 784) 0 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 32) 25120 \n", "_________________________________________________________________\n", "dense_2 (Dense) (None, 784) 25872 \n", "=================================================================\n", "Total params: 50,992\n", "Trainable params: 50,992\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "# 模型參數設定\n", "autoencoder_fc.compile(optimizer='adadelta', loss='binary_crossentropy')\n", "\n", "# 秀出模型結構\n", "autoencoder_fc.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "讓我們準備我們的輸入數據。我們使用的是MNIST數字,我們放棄了標籤(因為我們只對編碼/解碼輸入圖像感興趣)。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.datasets import mnist\n", "import numpy as np\n", "\n", "(x_train, _), (x_test, _) = mnist.load_data()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我們將歸一化(normalize)所有像素值落於0和1之間,我們將把28x28的圖像打平變成784的向量。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(60000, 784)\n", "(10000, 784)\n" ] } ], "source": [ "x_train = x_train.astype('float32') / 255.\n", "x_test = x_test.astype('float32') / 255.\n", "\n", "x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))\n", "x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))\n", "\n", "print(x_train.shape)\n", "print(x_test.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "現在讓我們訓練我們的自動編碼器50個循環(epochs):" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 60000 samples, validate on 10000 samples\n", "Epoch 1/50\n", "60000/60000 [==============================] - 3s 45us/step - loss: 0.3856 - val_loss: 0.2742\n", "Epoch 2/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.2681 - val_loss: 0.2593\n", "Epoch 3/50\n", "60000/60000 [==============================] - 1s 23us/step - loss: 0.2497 - val_loss: 0.2373\n", "Epoch 4/50\n", "60000/60000 [==============================] - 1s 20us/step - loss: 0.2290 - val_loss: 0.2184\n", "Epoch 5/50\n", "60000/60000 [==============================] - 1s 25us/step - loss: 0.2129 - val_loss: 0.2048\n", "Epoch 6/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.2009 - val_loss: 0.1943\n", "Epoch 7/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1915 - val_loss: 0.1862\n", "Epoch 8/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1841 - val_loss: 0.1795\n", "Epoch 9/50\n", "60000/60000 [==============================] - 1s 23us/step - loss: 0.1780 - val_loss: 0.1738\n", "Epoch 10/50\n", "60000/60000 [==============================] - 1s 23us/step - loss: 0.1727 - val_loss: 0.1689\n", "Epoch 11/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1682 - val_loss: 0.1649\n", "Epoch 12/50\n", "60000/60000 [==============================] - 1s 23us/step - loss: 0.1641 - val_loss: 0.1608\n", "Epoch 13/50\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1604 - val_loss: 0.1573\n", "Epoch 14/50\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1570 - val_loss: 0.1540\n", "Epoch 15/50\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1539 - val_loss: 0.1510\n", "Epoch 16/50\n", "60000/60000 [==============================] - 1s 21us/step - loss: 0.1510 - val_loss: 0.1482\n", "Epoch 17/50\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1482 - val_loss: 0.1457\n", "Epoch 18/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1457 - val_loss: 0.1431\n", "Epoch 19/50\n", "60000/60000 [==============================] - 1s 21us/step - loss: 0.1434 - val_loss: 0.1408\n", "Epoch 20/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1411 - val_loss: 0.1387\n", "Epoch 21/50\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1390 - val_loss: 0.1366\n", "Epoch 22/50\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1370 - val_loss: 0.1345\n", "Epoch 23/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1350 - val_loss: 0.1326\n", "Epoch 24/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1331 - val_loss: 0.1307\n", "Epoch 25/50\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1313 - val_loss: 0.1290\n", "Epoch 26/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1296 - val_loss: 0.1273\n", "Epoch 27/50\n", "60000/60000 [==============================] - 1s 21us/step - loss: 0.1280 - val_loss: 0.1257\n", "Epoch 28/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1264 - val_loss: 0.1242\n", "Epoch 29/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1250 - val_loss: 0.1227\n", "Epoch 30/50\n", "60000/60000 [==============================] - 1s 23us/step - loss: 0.1236 - val_loss: 0.1214\n", "Epoch 31/50\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1223 - val_loss: 0.1201\n", "Epoch 32/50\n", "60000/60000 [==============================] - 1s 21us/step - loss: 0.1210 - val_loss: 0.1189\n", "Epoch 33/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1199 - val_loss: 0.1178\n", "Epoch 34/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1188 - val_loss: 0.1167\n", "Epoch 35/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1178 - val_loss: 0.1158\n", "Epoch 36/50\n", "60000/60000 [==============================] - 1s 22us/step - loss: 0.1169 - val_loss: 0.1148\n", "Epoch 37/50\n", "60000/60000 [==============================] - 1s 23us/step - loss: 0.1160 - val_loss: 0.1140\n", "Epoch 38/50\n", "60000/60000 [==============================] - 1s 21us/step - loss: 0.1152 - val_loss: 0.1132\n", "Epoch 39/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1144 - val_loss: 0.1125\n", "Epoch 40/50\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1137 - val_loss: 0.1118\n", "Epoch 41/50\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1131 - val_loss: 0.1112\n", "Epoch 42/50\n", "60000/60000 [==============================] - 1s 20us/step - loss: 0.1125 - val_loss: 0.1106\n", "Epoch 43/50\n", "60000/60000 [==============================] - 1s 23us/step - loss: 0.1119 - val_loss: 0.1100\n", "Epoch 44/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1114 - val_loss: 0.1095\n", "Epoch 45/50\n", "60000/60000 [==============================] - 2s 25us/step - loss: 0.1109 - val_loss: 0.1090\n", "Epoch 46/50\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1104 - val_loss: 0.1086\n", "Epoch 47/50\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1100 - val_loss: 0.1081\n", "Epoch 48/50\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1096 - val_loss: 0.1077\n", "Epoch 49/50\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1092 - val_loss: 0.1073\n", "Epoch 50/50\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1088 - val_loss: 0.1070\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "autoencoder_fc.fit(x_train, x_train,\n", " epochs=50,\n", " batch_size=256,\n", " shuffle=True,\n", " validation_data=(x_test, x_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在50個訓練循環之後,自動編碼器似乎達到穩定的訓練/測試損失值約0.11。我們可以視覺化輸入的重建和編碼表示。我們將使用Matplotlib。" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 編碼與解碼一些手寫數字圖像\n", "encoded_imgs_fc = encoder_fc.predict(x_test)\n", "decoded_imgs_fc = decoder_fc.predict(encoded_imgs_fc)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n1o033ljR8+OzNL0mLqFU+p4/+OCDNd0nVE9Mv1Ct2dWj0Wna2t///vdkW97yVKXdwnSJ6M9//vNk\nXF76oj7Hd77zHY+7du2ajLvwwgs9/sIXvpBsu/zyyz3+8MMPl7bbDeXQQw/1OHZEmDZtmset2clN\n0+Ji+tQDDzzg8aJFi1prl9qtnXbaKXNb7HqTl86Iz2pqakoe62f9tddeS7bVssNQx44dk8eaKnDS\nSSd5HPf32GOPrdk+NQJNjzAzW2WVVTzWbjbxmkW/n7761a96HFM4evfu7XH37t2Tbf/85z893nvv\nvT1+4403Cu17e7Dyyit7HEsmaNmFBQsWJNsuvvhijymtUD/idZ12hfr2t7+dbOvQoYPH+rsgptpf\ndNFFHldafqFLly4ea5fUc845JxmnZV1iKmZbYSUOAAAAAABACXATBwAAAAAAoAS4iQMAAAAAAFAC\npa+JUwvdunXz+Morr/T4c59L73lp+2vyWCt32223JY+/8pWvNDvuz3/+c/I4tttFOWy66aaZ27Qu\nCpbN8sv/3+m9aA2cWFvqyCOP9DjmnRelNXEuuOACjy+55JJkXKdOnTyOn4Pbb7/d4+nTp1e0H2V1\n2GGHeazvkVn6/VRrWmNp6NChHn/88cfJuPPPP9/j9la/qLVoS1SNo1gjYPz48TXbp/Zm3333TR5r\n+3atBRVrOBSldVh22WWXZNu2227b7L+5+eabK3qt9urzn/988lhrCv3mN7/J/Hfarvi6667zWM/V\nZmYbbrhh5nNorZZa1lMqswMPPNDjH/zgB8k2bfu94447JtsWL15c2x1DReJ5bPjw4R5rDRwzs1df\nfdVjrU375JNPVvTaWutm/fXXT7bpb8tRo0Z5HOvgqri/I0aM8Lg1awGyEgcAAAAAAKAEuIkDAAAA\nAABQAqRTNWPYsGEeaxvc2M58ypQprbZPjWbttdf2OC4H1yWumsKhy/TNzJYsWVKjvUO16fLvY445\nJtn2zDPPeHzPPfe02j7hf7Q1dWxJW2kKVRZNi9KUHDOzrbfeuqqvVVadO3dOHmelTphVnqpRCW0P\nr+l5kyZNSsbdf//9rbZP7VXRudKan49GdOmllyaPd911V4/XWWedZJu2etel9kOGDKnotfU5Yutw\n9dJLL3kcW1wjn7YHjzRdLqb8Zxk0aFDh1x47dqzHXMs2Ly9VVK8bZ8+e3Rq7g2WkKU1mn03FVh99\n9JHH22yzjceHHnpoMm6TTTZp9t+/9957yeO+ffs2G5ul17lrrbVW5j6puXPnJo/bKo2clTgAAAAA\nAAAlwE0cAAAAAACAEiCdysy+9KUvJY9jFfRPaaV0M7MJEybUbJ8a3S233OJxly5dMsf95S9/8bi9\ndaVpJHvssYfHa6yxRrJt9OjRHmvXB1RP7KyndKlqrWmKQNynvH0855xzPD766KOrvl/1JHZMWXfd\ndT2+4YYbWnt3XO/evZv973wPtr68tI1qdEbC/4wbNy55vNlmm3m8xRZbJNv22msvj7Xryvz585Nx\n119/faHX1m4nzz77bOa4xx57zGOukVomnk819U1TFmPKhnbYPOiggzyO3Wx0LsZtxx13nMd6rCdO\nnFho39uDmDqjdL6dffbZybZ//vOfHtORr37cd999yWNNvdbfCGZmPXr08Ph3v/udx3mppZqeFVO3\n8mSlUH3yySfJ41tvvdXjU045Jdk2Z86cwq9XTazEAQAAAAAAKAFu4gAAAAAAAJQAN3EAAAAAAABK\ngJo4ZrbPPvskj1dYYQWPx4wZ4/Hjjz/eavvUiDTfeKuttsoc98ADD3gcc11RTptvvrnHMaf15ptv\nbu3daRdOOOEEj2Nub1vZf//9Pd5yyy2TbbqPcX+1Jk6je/vtt5PHmtOvNTnM0vpSb7zxRlX3o1u3\nbsnjrPoEjzzySFVfF83bYYcdPD7qqKMyxy1evNhjWu9W15tvvumx1nOIj88666xlfq0NN9zQY60l\nZpaeE84444xlfq326t57700e69zRujexTk1WXY74fMOGDfP4zjvvTLZ98Ytf9Fjra+j3dnvXtWtX\nj+M1gdaO+9nPfpZs+8lPfuLx1Vdf7bG2dTdL665MmzbN4xdeeCFzn/r375881t+FnG/zxbbfWk9q\ntdVWS7ZpbVqtW7tw4cJk3KxZszzWz4T+5jAzGzx4cIv395prrkke/+hHP/JY6121JVbiAAAAAAAA\nlAA3cQAAAAAAAEqg3aZTdezY0WNtVWdm9sEHH3is6Twffvhh7XesgcTW4boUTVPWIl0qvGTJkurv\nGFpF9+7dPd5xxx09njJlSjJO2/ahejR1qTXpEmgzs379+nms54A8sS1vezr3xiXH2jb4kEMOSbbd\nddddHl9yySUtfq0BAwYkjzWFo1evXsm2rBSCeknVa3T6ffq5z2X//7d77rmnNXYHNaYpInHuabpW\nPFeiuJiCevjhh3usad6dO3fOfI7LLrvM45hG9/7773s8cuTIZJumi+y5554e9+7dOxnXntvGX3zx\nxR5///vfL/zv9Px40kknNRtXi84/LQVx5JFHVv21GllMT9L5UYk///nPyeO8dCpNYdfP2Z/+9Kdk\nnLYwrxesxAEAAAAAACgBbuIAAAAAAACUADdxAAAAAAAASqDd1sQZPny4x7HV7ejRoz1+7LHHWm2f\nGs3pp5+ePN56662bHXfbbbclj2kr3hi++c1veqztiv/1r3+1wd6gtfz4xz9OHmub1TwzZszw+Bvf\n+EayTdtItjd6Poythvfdd1+Pb7jhhhY/94IFC5LHWntjzTXXLPQcMW8ctZHV4j3WEvj973/fGruD\nKjvssMOSx1//+tc91poNZp9ts4vq0BbhOt+OOuqoZJzOOa1dpDVwovPOOy953LdvX4+HDBnS7POZ\nffa7sD3Ruig33nhjsu1vf/ubx8svn/6UXX/99T3Oqx9WDVoDUD8z2ubczOz888+v6X7A7Mwzz/S4\nJTWJTjjhBI8ruY5qS6zEAQAAAAAAKAFu4gAAAAAAAJRAu0mn0mXnZmY//elPPX7rrbeSbeeee26r\n7FOjK9oS8Lvf/W7ymLbijaFnz57N/vc333yzlfcEtTZq1CiPN95444qeY+LEiR4/8sgjy7xPjWLy\n5MkeawtcM7MtttjC44022qjFz61tdKPrr78+eTx06NBmx8WW6KiO9dZbL3kcUzo+NXv27OTxU089\nVbN9Qu3svffemdvuvPPO5PHTTz9d691p9zS1SuNKxfOkpgdpOtWuu+6ajFtjjTU8ji3RG522dI7n\ntT59+mT+u913393jFVZYweNzzjknGZdV4qFSmu48cODAqj43mvftb3/bY01hiyl26oUXXkgejxw5\nsvo71kpYiQMAAAAAAFAC3MQBAAAAAAAogYZOp+rSpYvHv/vd75Jtyy23nMeaCmBmNnbs2NruGBK6\nXNTM7MMPP2zxcyxevDjzOXQ5ZefOnTOfY7XVVkseF00H0yWfZ511VrLt3XffLfQcjWi//fZr9r/f\ncccdrbwn7ZMu7c3r0JC3jP+aa67xeJ111skcp8//ySefFN3FxP7771/Rv2vPxo8f32xcDS+99FKh\ncQMGDEgeT5gwoar70V5tv/32yeOsORy7O6Kc4nn4nXfe8fjXv/51a+8Oauwf//iHx5pOdcQRRyTj\n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\nQDwP63Vu3F9NOz7ppJM81tRYs3T+xbmo6QZF03Lq+XxbScriaqutlmzbYostmv03MSVCry/1GjW2\nItdrnZiKp+f8X//61x6/9dZbmfse/8aix6OM59AolukYMmSIxzGdSq9PNCU/poErveaI6ch6Xi7a\nvj2vVXxeOmejybum0BSq0047LdmmKVT6O3/RokXJuDvuuMPje++912NNnzJLPwfxu0/3S1Mb9Xxv\nls7ZeI36yiuveJxX8qXac7H9fJIAAAAAAABKjJs4AAAAAAAAJVC1dCpdbqbVus2yl7Nph6i4LaZR\nfPDBBx7nLUvTZXBa+TouF9XHOs7M7MEHH/T461//usexm1ZexfKiaVJlXOZY7a4icZnk+eef7/F2\n223nsX6OzMwuv/xyj2+99dZkm6bq5e1j0WX8Rbsd1INKOhHEv0nnVZwf+tkuuvxfl0PGJd+6pHnc\nuHHJNk2rrMZnTf+u+HyNltKhy/MPOuigZFtcRv6peJ68+eabPdZlpnGpqr4/miJglqYH6flU04TM\nzHr16uXx1772tWSbdv/TVKF6T4nLO1fqUnhN4dh0002Tcfq+RDNmzPD4pptu8jguyc+apy15v/Qz\n8+Uvf9nj2FVClzs/99xzyTbdr7z3pt7PsS2lf09Mm8lKichLddPU7vh50eePS7nvvvtuj/WaqlKN\n0PXGLP079DqvW7dumf8mLqfXziXdu3f3OC7/1/OjzqmYsqPn2Jgid+aZZ3p89NFHZz7HpZde6vG0\nadOSbfrZKHqNVM/HOGvf8roErbrqqsk2vW7UEg6xW+J1113X7GsNHDgweaxpb7Hkgn4u8tJ88mRd\nl9bzcWoJvV6LacY77LCDx7GbsXaK0w66eelnui0vHbIa723R77t6v74pQo9h7Ly57777enzssccm\n2zT9UM+1sXPYL37xC4/1N2I81nlpXdqJbrfddvM4/jZV8feofub0PEw6FQAAAAAAALiJAwAAAAAA\nUAbcxAEAAAAAACiBqtXE0fyzmGut7bzyWrVpXmjM7c3KI4t5b1nPn9fuLdI8OM2diy3RtU5DrImT\nlXtZxpzGWtD39bDDDku2HXLIIR7rMfz73/+ejLv99ts9jjUgiuZHF80jLlONhqKfMR0X6zTktZ0u\nWu9J3zOtmxFrOGgdFq3ZYJaeOyqdO5W0S2+Eeap1FGL9GX0fdI499NBDybgTTzzR46x6JlGsiTZr\n1iyPtcaRtvU1S2tFxDor+pl5+umnPc6ryVQP8uq3aZ0oPVbrrbdeMk63xfPcyJEjPZ4wYYLH8Tu4\nks9z/A7THHVtDx/HaR2cxx9/PNmW1cq4TOfXLHnHWv+++H4VPe/oOfmLX/yix3l1W2Ltqrvuusvj\nom2lo0ao3xD3LZ6LPhXrwWkdk1jjROsqnHzyyR7H+mM6n7XNd6wHN3PmTI9jvQitJaGfiyeffDIZ\n98ADD3hc9JyQV0uinmXVh4n7r8ctfs9oG/YRI0Z4rOdZs/Q7s2/fvh5rW2SztAZI/E2j5+u8mouV\nzKMyzcU8ek2g9THN0u/J+D2j7Z7r5bquaF3NvM9uvV/vNEf/hq5duybb9t9/f49jzVn9d/o7QOel\nWVrzKO/90e/kWAvr7LPP9lhrEMb3X+ew/v43S+sTao2mvDpM1cBKHAAAAAAAgBLgJg4AAAAAAEAJ\n1CSdKrZ70+WLuqQzttUr2vIwTyXtr2MbsZ133tlj3XdtIWZmdt9993msy73MiqectCe6nG2DDTbw\n+JRTTsn8N5o6EZev6TK6omk9cZk7x+Z/8loexuWAlbQt33jjjT3W9qtmZvPmzfP44YcfTrZV0gY3\nr1160X9Xxs9F/Lt1Wehaa62VbNNUCk13GjZsWDKu6BxTcZweQ00HyvtcxWOmaQ15y43r7bjlLaHW\npbmaEhPTNPT9i2m7//nPfzzW791qvA8xpVJT2vT5X3755WTc5Zdf7vFrr72WbCu6tLjsczGvnXxU\n9D3R4zF48GCP4/WLfl7uvPPOZJu2mS7j+1ot8W/X6zc91+i50Sw9j8a235o21a9fP4/XX3/9ZJwe\nRz0fDhgwIBmnx1WfzyxNM9FztLYUNzNbuHChx0XTpOr9nJol63sh/j16fLUFuFmahqOpafG909SP\n008/3eM+ffpk7lPec2y44YYev/DCC8m4ouf1sp8zm6PHSt8js/QaQdMSzeo/BTDv+BS9Xq1nWZ9F\nPW+ZpefG+J7o/QBt562pxGbpNZHOlfi9qK919NFHJ9v22msvj/X8HFOO9R7APffck2zTMgK1TqFS\n5f+0AAAAAAAAtAPcxAEAAAAAACiBqqVTqbiUTZdFaZpRrCRdyyVIcZ90ydTAgQOTbQcccECz+6SV\n/s3SpbaVdnpoZPE915SBM844w+PYjUXfS12+Fpfm571W1nLalixzL7rcuIwV45dG35ei6VTxfdGO\nH7r8P6ZpPPXUUx5Xmn6Rtx+6PFWfL45rzSWQtRA7qeh5LS79f/fddz3Wrm/aEcWsstS5vFQoFdNu\nO3Xq5HE8n+ocK+ty4/he6t+rtKNJFLtTaepM0TSzoqkGMTXguOOO81iPwejRo5Nxjz76qMfxGBfd\nj6w5WxYt+Z7JEj/nOofjNYtasGCBx//4xz+SbbEjaBF5x6aS9PV6pPuu58aJEycm43R+xBQOPT47\n7LCDx3Ge6zJ/TROI73PPnj09jimW+nkaO3asx/Eatejxrvf0kyKyzi3x+0dTqLTjnll6zdKjR49m\nYzOzIUOGeLzPPvt4HOesfo/F+bHtttt6fMIJJ3h89dVXJ+OmTp3qcez8mDXn8s4/9T5P9dhpimKc\nR/o4ptho6tWLL77ocbyuyPrM5JVdyPtOK3qezytfoK/dCL8t9Ho/nmemT5/ucUw7zUpFPPLII5Nx\nmhql10PxnKlzPS/FVd9z7ThlZnbllVd6PGnSpGRbtdPZiyrn1TAAAAAAAEA7w00cAAAAAACAEuAm\nDgAAAAAAQAnUpCZOzAfTPETNPatG6+KiLaPjuC5dunis+ahmZuuuu67HmhN3//33J+O0tWPMXaz3\nvNPWENvJ7brrrh7vtNNOHscaKVpr6LnnnvNY32+z9HMQn0PpsWlJDZy8z5nSnOuYL9vWitbGyJuz\nlbZvX3PNNT3W/O/4Hj3//PMea6vXpb121n7k/c2NNi/1b43zTWuaxM/9okWLPNY21ZXWUND5Fz8H\nmpusbXQ7duyYjNNjE2u/aBvrRsgTN0v/fq3F8OqrrybjtIWmtiU3S7+rdFysnaDnKK25s+qqqybj\n9DMzfPjwZNsWW2zhsc7h2BJX53Cl862MdXBUpTVx8s6nG2ywgcebbLKJx3E+aF0rbSne3H61dJ+i\nsp5P885fep2hNRvM0ho5sSaOHodrr73W49jGWt8zPTdqHR0zs+9973sex3a52jr8vPPOa3bf42tF\nWce1rMdU5V3b6LzS866ZWffu3T3++c9/7nGvXr2ScVpfQ59P6ymZpccjvpbWe9l///09jnVb/t//\n+38ez58/37Lov4vnmzKdT/W7qnfv3h7n1S/Sc6OZ2amnnuqx1tWMx0Bro2gdnfhaWqvxjjvuSLY9\n/vjjHmv9nfhdXbQuUdHfK/Usq07QvHnzknF/+ctfPH744YeTbZ07d/Z4jTXW8Fh/V5iZbbzxxh7r\n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\nsezCnDlzPNbfJPE6SOdV/M3zzjvveHzvvfd6PGbMmGScpsK1p7lYKS3VcMEFF3isreDNst+7mGZ8\n2223NTuu7FiJAwAAAAAAUALcxAEAAAAAACgBbuIAAAAAAACUQGlq4mS1Nd5rr72Sccccc4zHmps/\nf/78ZNx1113ncaO0syg76PIAAAdxSURBVG0LsQ6D1sQ5+eSTk21XXnmlx8OGDfN4t912S8Zltd3M\na5sbc4U19/Xll1/2+D//+U8y7rnnnvP4qaeeSrZpG1fNiY01XeqtJX2124rG51txxRU97t27t8ex\nNoa2edcaVLEleyX1CPL+xrx6B+2p5aq+zyeeeGKyTefHIYcc4rGeW82yW9nGz/zs2bM9PuWUU5Jt\nd999t8cxn7zRteZnqpLXirn/Op832mijZJt+T+q5MdZ60M9QPN76HFqrIO5HI9d6iOcgfb+22WYb\nj9dbb71knB5fbZFatKV4lHderGRbmc6ftdjXrOeM80NrAOr1a6zvqHNg3333TbZpnZRHHnnEY/3O\nNcs/35bpeLWU/m3x/c+rU5b12Y7nI73ezGrzHZ8jr96ctr6ObcS15kpLah6VVdHrtUrE46jX8vo7\nIbYY13+n9cjM0tqZt956q8d6TdTca6tGOXbLItb96t+/v8cHHHCAx3Ee6Xs3Y8YMj0866aRkXKNe\nU7ASBwAAAAAAoAS4iQMAAAAAAFACNUmnqkYr1fgcmlajrU+HDBmSOe6tt97yeMSIEck4XY7MUrbK\nxfdOl6zpknuztNWwxvFYa6vNdddd1+Pu3bsn4zR9Jz6HLjfW5Y+6NNUsXd5ftM1qvaff6b7GpYdF\n/159P+NyZH2sS39HjRqVOU6Xmea1Qq61lrTSLTv9e+bNm5ds01bfF198sceHH354Mm7w4MEea0rq\nTTfdlIzTdppxjuF/irYkroWs+bzKKqsk4/r16+dxTFHVdqx6To3jat1WvS1V2po6L61i5ZVX9niD\nDTbw+P3330/GzZ071+Np06Zl7lNrKstxa0vx+GyyySYed+vWzeOYTqB0nFl6XfTee+95HNNcK0m3\nqfQz3taKtnjPmy96bsx774qm0OedC/XaabXVVvM4pqXr+aLStvZlVe2/Iz6fph+effbZHm+11VbJ\nOG37rt+DZmkKj/7mjOk7jZj6tqz0s61ppmbpb3udEzGlUI+Nlg2IaYmNipU4AAAAAAAAJcBNHAAA\nAAAAgBKoSTpV3pK/rG4nUVxyvOaaa3q89957e9y3b99kXFYV8XvvvTcZV+2UmLIuQa0H8b3SZeTT\np09vNkYxcUlnTI36VN7nNc4VTYfSbmQvvvhi5jhNsalFlfhqd7hqdNq1RI+hxmg9tf6+yHr+mBag\nS8O164ZZmtIxdepUj59//vlknHY+i3Nd51zR1M56UjQFtSVpm5qOpu957DSkKcLPPPOMx5V2+yv6\nb8pybJZFLdNS4rWsHq/4nal07jzxxBPJtvvvv99jnW8t6ZSZ9beV9XhXcg1QtHNVvAbKmuvxc6TH\nXks9xG1aQiCm1ennIO6vbivrcWtLeh30wgsveDxx4sRkXFaanVk5v8faSjwXahewLbfcMtm28847\ne6zvsaZPmaXdT+N5sj1gJQ4AAAAAAEAJcBMHAAAAAACgBLiJAwAAAAAAUAI1qYkTZbVWW3HFFZNx\nmk/asWPHZFufPn08HjRokMddunRJxmmOqMYxz1RzUGPL46L1cvJqahTNjwdaU9ZnO6+mU9ymz6Ht\nTTU2S+dftWtQtaSGQ1aeO/MS9aI1P5c6L+Oc1ZpIWlPOzGzttdf2WPPSFy5cmPn8sSZOLeph1Yui\n56R4LtRjoO//5MmTk3FaK07brHIeW3bVfg/zaj/q3Lnkkks8Xn311ZNx8+fP91jrdZil7XNbUgen\nPco751R6rZD1eYk1a7QGSKdOnTL3S2sG6nE3S2tmxb+l2tdV7VleC3De5+qI76O+z+uss06yTe8P\nLFq0yGOtDWdmNmbMGI+1xlF7+V5kJQ4AAAAAAEAJcBMHAAAAAACgBFolnUrpcipd+mSWpjjFVCtt\nMa5LFHWJsVnabnHKlCkez507t/A+Fm032V6Wa6Hx5S0rLtp+vF5bdjNPUY/q4XMZlzfr92n8ztS0\nH01B1uX+WLp43DUdRtMl8lJc6+Gzg2w6r2K6k6YGjB8/3uOYKqNzTNPnUD3VvqaP51M9bjHtVFOv\nNEUktmHWzw9pPSizOL/02mHkyJHJtnHjxnmsv//nzJmTjJsxY4bH7fE8yUocAAAAAACAEuAmDgAA\nAAAAQAlwEwcAAAAAAKAEOrQkB7RDhw51kYitrfq0jo5Z2ko8L6c4Kw/drD5zz5uamqpScKRejmE7\nNa6pqWlQNZ6oLY9j0ZpRjYq52BAaYi5miXM0q8ZVbImbV+Mqa1tbznvmYkNoV3Mxa/6VveYic7Eh\nNPRcbC+Yiw2h0FxkJQ4AAAAAAEAJcBMHAAAAAACgBFraYnyBmc2sxY60hLYlayftTXtW8bnq4hi2\nUw1xHMu2zLvKGuIYorGPY9HUjJhKXOTfLG1bK2roY9iONPRxzJsrDdQyuqGPYTvCcSw/jmFjKHQc\nW1QTBwAAAAAAAG2DdCoAAAAAAIAS4CYOAAAAAABACXATBwAAAAAAoAS4iQMAAAAAAFAC3MQBAAAA\nAAAoAW7iAAAAAAAAlAA3cQAAAAAAAEqAmzgAAAAAAAAlwE0cAAAAAACAEvj/PNEBhNm5fVYAAAAA\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "n = 10 # 我們想展示圖像的數量\n", "plt.figure(figsize=(20, 4))\n", "\n", "for i in range(n):\n", " # 秀出原圖像\n", " ax = plt.subplot(2, n, i+1)\n", " plt.imshow(x_test[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", " # 秀出重建圖像\n", " ax = plt.subplot(2, n, i+1+n)\n", " plt.imshow(decoded_imgs_fc[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以上是我們得到的結果。上面的一行是原始數字圖像,下面一行是重建的數字圖像。如果我們所說的這個autoencoder會失去很多細節(有損的壓縮)。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 深度自動編碼器 (Deep autoencoder)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我們不必將自己限制在一個單獨的神經層上作為編碼器或解碼器,而是可以使用一堆神經層,例如:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 60000 samples, validate on 10000 samples\n", "Epoch 1/100\n", "60000/60000 [==============================] - 2s 41us/step - loss: 0.3414 - val_loss: 0.2625\n", "Epoch 2/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.2551 - val_loss: 0.2453\n", "Epoch 3/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.2355 - val_loss: 0.2263\n", "Epoch 4/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.2193 - val_loss: 0.2111\n", "Epoch 5/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.2081 - val_loss: 0.2035\n", "Epoch 6/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1992 - val_loss: 0.1917\n", "Epoch 7/100\n", "60000/60000 [==============================] - 2s 37us/step - loss: 0.1875 - val_loss: 0.1815\n", "Epoch 8/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1797 - val_loss: 0.1763\n", "Epoch 9/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1742 - val_loss: 0.1701\n", "Epoch 10/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1692 - val_loss: 0.1653\n", "Epoch 11/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1651 - val_loss: 0.1619\n", "Epoch 12/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1611 - val_loss: 0.1577\n", "Epoch 13/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1573 - val_loss: 0.1534\n", "Epoch 14/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1535 - val_loss: 0.1506\n", "Epoch 15/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1504 - val_loss: 0.1471\n", "Epoch 16/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1477 - val_loss: 0.1452\n", "Epoch 17/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1454 - val_loss: 0.1415\n", "Epoch 18/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1432 - val_loss: 0.1399\n", "Epoch 19/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1414 - val_loss: 0.1406\n", "Epoch 20/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1396 - val_loss: 0.1391\n", "Epoch 21/100\n", "60000/60000 [==============================] - 2s 25us/step - loss: 0.1381 - val_loss: 0.1350\n", "Epoch 22/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1365 - val_loss: 0.1344\n", "Epoch 23/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1351 - val_loss: 0.1342\n", "Epoch 24/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1338 - val_loss: 0.1311\n", "Epoch 25/100\n", "60000/60000 [==============================] - 2s 33us/step - loss: 0.1326 - val_loss: 0.1303\n", "Epoch 26/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1314 - val_loss: 0.1300\n", "Epoch 27/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1302 - val_loss: 0.1290\n", "Epoch 28/100\n", "60000/60000 [==============================] - 2s 34us/step - loss: 0.1289 - val_loss: 0.1265\n", "Epoch 29/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1278 - val_loss: 0.1265\n", "Epoch 30/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1267 - val_loss: 0.1252\n", "Epoch 31/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1259 - val_loss: 0.1237\n", "Epoch 32/100\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1248 - val_loss: 0.1231\n", "Epoch 33/100\n", "60000/60000 [==============================] - 2s 35us/step - loss: 0.1239 - val_loss: 0.1213\n", "Epoch 34/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1231 - val_loss: 0.1219\n", "Epoch 35/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1223 - val_loss: 0.1213\n", "Epoch 36/100\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1216 - val_loss: 0.1198\n", "Epoch 37/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1208 - val_loss: 0.1191\n", "Epoch 38/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1202 - val_loss: 0.1173\n", "Epoch 39/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1194 - val_loss: 0.1175\n", "Epoch 40/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1188 - val_loss: 0.1173\n", "Epoch 41/100\n", "60000/60000 [==============================] - 2s 33us/step - loss: 0.1182 - val_loss: 0.1168\n", "Epoch 42/100\n", "60000/60000 [==============================] - 2s 34us/step - loss: 0.1175 - val_loss: 0.1159\n", "Epoch 43/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1170 - val_loss: 0.1143\n", "Epoch 44/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1165 - val_loss: 0.1146\n", "Epoch 45/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1158 - val_loss: 0.1141\n", "Epoch 46/100\n", "60000/60000 [==============================] - 2s 34us/step - loss: 0.1153 - val_loss: 0.1154\n", "Epoch 47/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1149 - val_loss: 0.1128\n", "Epoch 48/100\n", "60000/60000 [==============================] - 2s 37us/step - loss: 0.1144 - val_loss: 0.1122\n", "Epoch 49/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1139 - val_loss: 0.1117\n", "Epoch 50/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1135 - val_loss: 0.1119\n", "Epoch 51/100\n", "60000/60000 [==============================] - 2s 33us/step - loss: 0.1130 - val_loss: 0.1111\n", "Epoch 52/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1126 - val_loss: 0.1112\n", "Epoch 53/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1122 - val_loss: 0.1113\n", "Epoch 54/100\n", "60000/60000 [==============================] - 2s 33us/step - loss: 0.1118 - val_loss: 0.1103\n", "Epoch 55/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1113 - val_loss: 0.1111\n", "Epoch 56/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1111 - val_loss: 0.1100\n", "Epoch 57/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1105 - val_loss: 0.1095\n", "Epoch 58/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1102 - val_loss: 0.1081\n", "Epoch 59/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1099 - val_loss: 0.1089\n", "Epoch 60/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1095 - val_loss: 0.1087\n", "Epoch 61/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1091 - val_loss: 0.1079\n", "Epoch 62/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1090 - val_loss: 0.1070\n", "Epoch 63/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1086 - val_loss: 0.1075\n", "Epoch 64/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1084 - val_loss: 0.1064\n", "Epoch 65/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1081 - val_loss: 0.1072\n", "Epoch 66/100\n", "60000/60000 [==============================] - 2s 25us/step - loss: 0.1078 - val_loss: 0.1063\n", "Epoch 67/100\n", "60000/60000 [==============================] - 2s 35us/step - loss: 0.1074 - val_loss: 0.1054\n", "Epoch 68/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1072 - val_loss: 0.1053\n", "Epoch 69/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1068 - val_loss: 0.1066\n", "Epoch 70/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1066 - val_loss: 0.1045\n", "Epoch 71/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1064 - val_loss: 0.1059\n", "Epoch 72/100\n", "60000/60000 [==============================] - 2s 35us/step - loss: 0.1061 - val_loss: 0.1057\n", "Epoch 73/100\n", "60000/60000 [==============================] - 2s 33us/step - loss: 0.1058 - val_loss: 0.1044\n", "Epoch 74/100\n", "60000/60000 [==============================] - 2s 33us/step - loss: 0.1056 - val_loss: 0.1034\n", "Epoch 75/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1052 - val_loss: 0.1046\n", "Epoch 76/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1050 - val_loss: 0.1035\n", "Epoch 77/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1048 - val_loss: 0.1040\n", "Epoch 78/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1045 - val_loss: 0.1027\n", "Epoch 79/100\n", "60000/60000 [==============================] - 2s 38us/step - loss: 0.1042 - val_loss: 0.1035\n", "Epoch 80/100\n", "60000/60000 [==============================] - 1s 25us/step - loss: 0.1040 - val_loss: 0.1040\n", "Epoch 81/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1037 - val_loss: 0.1023\n", "Epoch 82/100\n", "60000/60000 [==============================] - 2s 32us/step - loss: 0.1035 - val_loss: 0.1015\n", "Epoch 83/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1031 - val_loss: 0.1007\n", "Epoch 84/100\n", "60000/60000 [==============================] - 2s 33us/step - loss: 0.1030 - val_loss: 0.1010\n", "Epoch 85/100\n", "60000/60000 [==============================] - 2s 31us/step - loss: 0.1027 - val_loss: 0.1015\n", "Epoch 86/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1025 - val_loss: 0.1024\n", "Epoch 87/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1023 - val_loss: 0.1011\n", "Epoch 88/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1020 - val_loss: 0.1013\n", "Epoch 89/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1018 - val_loss: 0.1006\n", "Epoch 90/100\n", "60000/60000 [==============================] - 1s 24us/step - loss: 0.1017 - val_loss: 0.0998\n", "Epoch 91/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1014 - val_loss: 0.0997\n", "Epoch 92/100\n", "60000/60000 [==============================] - 2s 29us/step - loss: 0.1012 - val_loss: 0.1002\n", "Epoch 93/100\n", "60000/60000 [==============================] - 2s 30us/step - loss: 0.1010 - val_loss: 0.1001\n", "Epoch 94/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1007 - val_loss: 0.1016\n", "Epoch 95/100\n", "60000/60000 [==============================] - 2s 27us/step - loss: 0.1007 - val_loss: 0.0999\n", "Epoch 96/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1004 - val_loss: 0.1015\n", "Epoch 97/100\n", "60000/60000 [==============================] - 2s 26us/step - loss: 0.1003 - val_loss: 0.0994\n", "Epoch 98/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1001 - val_loss: 0.1004\n", "Epoch 99/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.1000 - val_loss: 0.0986\n", "Epoch 100/100\n", "60000/60000 [==============================] - 2s 28us/step - loss: 0.0999 - val_loss: 0.0995\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "input_img_deep = Input(shape=(784,))\n", "\n", "encoded_deep = Dense(128, activation='relu')(input_img_deep)\n", "encoded_deep = Dense(64, activation='relu')(encoded_deep)\n", "encoded_deep = Dense(32, activation='relu')(encoded_deep)\n", "\n", "decoded_deep = Dense(64, activation='relu')(encoded_deep)\n", "decoded_deep = Dense(128, activation='relu')(decoded_deep)\n", "decoded_deep = Dense(784, activation='sigmoid')(decoded_deep)\n", "\n", "# 串接編碼(encoded)與解碼(decoded)的模型\n", "autoencoder_deep = Model(input_img_deep, decoded_deep)\n", "\n", "# 模型參數設定\n", "autoencoder_deep.compile(optimizer='adadelta', loss='binary_crossentropy')\n", "\n", "# 開始訓練模型\n", "autoencoder_deep.fit(x_train, x_train,\n", " epochs=100,\n", " batch_size=256,\n", " shuffle=True,\n", " validation_data=(x_test, x_test))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n6PfLL794vHz5co/j65Tel77xxhtB28SJEz3+6KOPPP7ss8+CfqtWrUr5+sicLr9gFo4xvdeMvxOZ\n6tSpk8e//fZb0DZt2jSPR40aFbTpd+7XX38t13uXBzNxAAAAAAAAEoCHOAAAAAAAAAnAQxwAAAAA\nAIAEqNA1cbSkuJlZmzZtPJ4yZUrQ1qJFC4/T5SV37tzZ46+++srjVCUBS6N5cEuWLPFYy2fH5s2b\nF2wX65o4Ste/KK9+/fp5vNNOO6Xsp7mopW2j8rr88ss9jr8zjKPceO211zzWEuDlpaVUV65cGbQ1\natTIYy1z+/HHHwf9Ntxww/Xej0IX54NrmeiZM2d6fNNNN+Vtnw4//PC8vRfWtssuuwTb7du3T9lX\n721ef/31nO1Toahdu3awfdRRR6Xse+qpp3qs9425puvgvPXWWyn7xWvixOtJwuyyyy7zWEvGZype\n5+2ggw7yOC5Truvn5HMNjUKRbp2aXXfd1WMtLR0bM2aMx/q7cs6cOUG/hg0beqxroZplZx1BrE2f\nB5x77rkex2OsWrVqpf79119/HWy///77Hs+ePTto098gujZjx44dg356TujZs2fQNn78eI+1THmu\nMRMHAAAAAAAgAXiIAwAAAAAAkAAVmk41cuTItNsqLg33h7i8adu2bT3WaVG77757xvv1888/ezx9\n+nSP4xQvnVqlU9mxfg499FCPtVTnxhtvHPT75ptvPP773/8etP3000852jusr8aNGwfbHTp08FjH\nmxmlGLNl3333DbabN2/usU4HznRqcDxdVKcza6lOM7P999/f43Tlj88++2yP77///oz2o9hcffXV\nwbZOKdep+3FKW7bptS/+bjG9PL/SpfjE4rQDpHfbbbcF2yeccILHen9pZvb888/nZZ9iXbp08bhO\nnTpB2+OPP+7xU089la9dSgxN9TUzO/nkk0vtN2HChGB78eLFHnfv3j3l61evXt1jTdUyM3v66ac9\nXrRo0bp3tsjF9////ve/Pdb0KbMwnThdiqGKU6hUvFwGsu/BBx8MtjUNLl25cH1u8MUXX3h81VVX\nBf30d31szz339FjvQx999NGgnz5f0HOAmdm9997r8QsvvOBxrlNrmYkDAAAAAACQADzEAQAAAAAA\nSIAKTafKhu+++y7Yfvvtt0vtly5VKx2dqhynbunUrcGDB5fr9bE2Ta+Jp1Aq/czffffdnO4TsidO\nv1D5rOpR6DRt7dlnnw3a0k1PVVotTKeIXnvttUG/dOmL+hpnnHGGx7Vq1Qr6DRw40ONNN900aLvn\nnns8Xr169bp2u6AcffTRHscVEWbMmOFxPiu5aVpcnD71zjvvePz999/na5eK1j777JOyLa56ky6d\nEWsrKSkJtvW7vmDBgqAtlxWGNttss2BbUwXOOeccj+P9PeWUU3K2T4VA0yPMzLbaaiuPtZpNfM+i\n16e//OUvHscpHE2bNvW4bt26QduwYcM8Pvjggz1etmxZRvteDLbcckuP4yUTdNmFpUuXBm233nqr\nxyytUHnE93VaFeq0004L2qpUqeKx/i6IU+1vueUWj8u7/ELNmjU91iqpAwYMCPrpsi5xKmZFYSYO\nAAAAAABAAvAQBwAAAAAAIAF4iAMAAAAAAJAAiV8TJxdq167t8X333efxBhuEz7y0/DV5rOX30ksv\nBds9evQotd+TTz4ZbMfldpEMu+yyS8o2XRcF62ejjf48vWe6Bk68tlSfPn08jvPOM6Vr4tx8880e\n33777UG/zTff3OP4e/Dyyy97PHPmzHLtR1Idc8wxHutnZBZen3JN11jq27evx7///nvQ74YbbvC4\n2NYvyhctiapxLF4j4PPPP8/ZPhWbQw45JNjW8u26FlS8hkOmdB2W/fbbL2jr3LlzqX8zZMiQcr1X\nsdpkk02CbV1T6I477kj5d1qu+LHHHvNYz9VmZjvssEPK19C1WnK5nlKSHXHEER5feeWVQZuW/e7S\npUvQtnz58tzuGMolPo/169fPY10Dx8zs66+/9ljXpv3444/L9d661k2DBg2CNv1t+dprr3kcr4Or\n4v0dNGiQx/lcC5CZOAAAAAAAAAnAQxwAAAAAAIAEIJ2qFOeee67HWgY3Lmc+bdq0vO1Todluu+08\njqeD6xRXTeHQafpmZitXrszR3iHbdPr3ySefHLR99tlnHr/55pt52yf8l5amjkvSljeFKhVNi9KU\nHDOz3XffPavvlVTVq1cPtlOlTpiVP1WjPLQ8vKbnTZkyJej39ttv522filWmYyWf349CdOeddwbb\nXbt29bhevXpBm5Z616n2hx12WLneW18jLh2uZs2a5XFc4hrpaXnwmKbLxSn/qXTo0CHj9x4zZozH\n3MuWLl2qqN43zp8/Px+7g/WkKU1ma6diq99++83jTp06eXz00UcH/XbeeedS/37VqlXBdosWLUqN\n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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 編碼與解碼一些手寫數字圖像\n", "decoded_imgs_deep = autoencoder_deep.predict(x_test)\n", "\n", "n = 10 # 我們想展示圖像的數量\n", "plt.figure(figsize=(20, 4))\n", "\n", "for i in range(n):\n", " # 秀出原圖像\n", " ax = plt.subplot(2, n, i+1)\n", " plt.imshow(x_test[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", " # 秀出重建圖像\n", " ax = plt.subplot(2, n, i+1+n)\n", " plt.imshow(decoded_imgs_deep[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 卷積自動編碼器 (Convolutional autoencoder)\n", "\n", "由於我們的輸入是圖像,所以使用卷積神經網絡(convnets)作為編碼器和解碼器是有意義的。在實際設置中,應用於圖像的自動編碼器始終是卷積自動編碼器 - 它們只是表現得更好。\n", "\n", "我們來實現一個。編碼器將包含一堆Conv2D和MaxPooling2D層(最大池用於空間向下採樣down-sampling),而解碼器將包含一堆Conv2D和UpSampling2D層。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input_4 (InputLayer) (None, 28, 28, 1) 0 \n", "_________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 28, 28, 16) 160 \n", "_________________________________________________________________\n", "max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16) 0 \n", "_________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 14, 14, 8) 1160 \n", "_________________________________________________________________\n", "max_pooling2d_2 (MaxPooling2 (None, 7, 7, 8) 0 \n", "_________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 7, 7, 8) 584 \n", "_________________________________________________________________\n", "max_pooling2d_3 (MaxPooling2 (None, 4, 4, 8) 0 \n", "_________________________________________________________________\n", "conv2d_4 (Conv2D) (None, 4, 4, 8) 584 \n", "_________________________________________________________________\n", "up_sampling2d_1 (UpSampling2 (None, 8, 8, 8) 0 \n", "_________________________________________________________________\n", "conv2d_5 (Conv2D) (None, 8, 8, 8) 584 \n", "_________________________________________________________________\n", "up_sampling2d_2 (UpSampling2 (None, 16, 16, 8) 0 \n", "_________________________________________________________________\n", "conv2d_6 (Conv2D) (None, 14, 14, 16) 1168 \n", "_________________________________________________________________\n", "up_sampling2d_3 (UpSampling2 (None, 28, 28, 16) 0 \n", "_________________________________________________________________\n", "conv2d_7 (Conv2D) (None, 28, 28, 1) 145 \n", "=================================================================\n", "Total params: 4,385\n", "Trainable params: 4,385\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "from keras.layers import Input, Dense, Conv2D, MaxPool2D, UpSampling2D\n", "from keras.models import Model\n", "\n", "input_img_cov = Input(shape=(28, 28, 1)) # 使用`channels_first`圖像數據格式\n", "\n", "x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img_cov)\n", "x = MaxPool2D((2, 2), padding='same')(x)\n", "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", "x = MaxPool2D((2, 2), padding='same')(x)\n", "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", "encoded_cov = MaxPool2D((2, 2), padding='same')(x)\n", "\n", "# 到這個節點的編碼表示的結構是 (4, 4, 8), 也可以想成是 128-dimensional\n", "\n", "x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded_cov)\n", "x = UpSampling2D((2, 2))(x)\n", "x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)\n", "x = UpSampling2D((2, 2))(x)\n", "x = Conv2D(16, (3, 3), activation='relu')(x)\n", "x = UpSampling2D((2, 2))(x)\n", "decoded_cov = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", "\n", "# 串接編碼(encoded)與解碼(decoded)的模型\n", "autoencoder_cov = Model(input_img_cov, decoded_cov)\n", "\n", "# 模型參數設定\n", "autoencoder_cov.compile(optimizer='adadelta', loss='binary_crossentropy')\n", "\n", "# 秀出模型結構\n", "autoencoder_cov.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "為了訓練它,我們將使用原始MNIST數字(樣本,28,28),並且我們僅對像素值進行歸一化讓數值落在0和1之間。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(60000, 28, 28, 1)\n", "(10000, 28, 28, 1)\n" ] } ], "source": [ "from keras.datasets import mnist\n", "import numpy as np\n", "\n", "(x_train, _), (x_test, _) = mnist.load_data()\n", "\n", "x_train = x_train.astype('float32') / 255.\n", "x_test = x_test.astype('float32') / 255.\n", "\n", "x_train = np.reshape(x_train, (len(x_train), 28, 28, 1)) # 使用`channels_first`圖像數據格式\n", "x_test = np.reshape(x_test, (len(x_test), 28, 28, 1)) # 使用`channels_first`圖像數據格式\n", "\n", "print(x_train.shape)\n", "print(x_test.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "讓我們訓練這個模型50個循環。為了演示如何在訓練過程中顯示模型的結果,我們將使用TensorFlow後端和TensorBoard回調。\n", "\n", "首先,打開一個終端並啟動一個TensorBoard服務器,該服務器將讀取存儲在/tmp/autoencoder中的日誌。" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 60000 samples, validate on 10000 samples\n", "Epoch 1/50\n", "60000/60000 [==============================] - 6s 97us/step - loss: 0.2409 - val_loss: 0.1732\n", "Epoch 2/50\n", "60000/60000 [==============================] - 5s 75us/step - loss: 0.1648 - val_loss: 0.1551\n", "Epoch 3/50\n", "60000/60000 [==============================] - 4s 71us/step - loss: 0.1477 - val_loss: 0.1390\n", "Epoch 4/50\n", "60000/60000 [==============================] - 4s 74us/step - loss: 0.1376 - val_loss: 0.1317\n", "Epoch 5/50\n", "60000/60000 [==============================] - 4s 74us/step - loss: 0.1313 - val_loss: 0.1305\n", "Epoch 6/50\n", "60000/60000 [==============================] - 5s 80us/step - loss: 0.1264 - val_loss: 0.1224\n", "Epoch 7/50\n", "60000/60000 [==============================] - 4s 67us/step - loss: 0.1235 - val_loss: 0.1205\n", "Epoch 8/50\n", "60000/60000 [==============================] - 4s 70us/step - loss: 0.1209 - val_loss: 0.1187\n", "Epoch 9/50\n", "60000/60000 [==============================] - 5s 76us/step - loss: 0.1192 - val_loss: 0.1189\n", "Epoch 10/50\n", "60000/60000 [==============================] - 5s 75us/step - loss: 0.1177 - val_loss: 0.1178\n", "Epoch 11/50\n", "60000/60000 [==============================] - 4s 72us/step - loss: 0.1160 - val_loss: 0.1152\n", "Epoch 12/50\n", "60000/60000 [==============================] - 4s 72us/step - loss: 0.1140 - val_loss: 0.1147\n", "Epoch 13/50\n", "60000/60000 [==============================] - 5s 84us/step - loss: 0.1131 - val_loss: 0.1106\n", "Epoch 14/50\n", "60000/60000 [==============================] - 4s 70us/step - loss: 0.1124 - val_loss: 0.1100\n", "Epoch 15/50\n", "60000/60000 [==============================] - 5s 77us/step - loss: 0.1118 - val_loss: 0.1094\n", "Epoch 16/50\n", "60000/60000 [==============================] - 4s 68us/step - loss: 0.1105 - val_loss: 0.1111\n", "Epoch 17/50\n", "60000/60000 [==============================] - 4s 68us/step - loss: 0.1099 - val_loss: 0.1073\n", "Epoch 18/50\n", "60000/60000 [==============================] - 4s 75us/step - loss: 0.1094 - val_loss: 0.1105\n", "Epoch 19/50\n", "60000/60000 [==============================] - 4s 70us/step - loss: 0.1089 - val_loss: 0.1089\n", "Epoch 20/50\n", "60000/60000 [==============================] - 5s 81us/step - loss: 0.1077 - val_loss: 0.1065\n", "Epoch 21/50\n", "60000/60000 [==============================] - 5s 82us/step - loss: 0.1075 - val_loss: 0.1052\n", "Epoch 22/50\n", "60000/60000 [==============================] - 5s 79us/step - loss: 0.1071 - val_loss: 0.1041\n", "Epoch 23/50\n", "60000/60000 [==============================] - 5s 75us/step - loss: 0.1065 - val_loss: 0.1049\n", "Epoch 24/50\n", "60000/60000 [==============================] - 5s 79us/step - loss: 0.1062 - val_loss: 0.1070\n", "Epoch 25/50\n", "60000/60000 [==============================] - 4s 73us/step - loss: 0.1056 - val_loss: 0.1042\n", "Epoch 26/50\n", "60000/60000 [==============================] - 5s 78us/step - loss: 0.1053 - val_loss: 0.1040\n", "Epoch 27/50\n", "60000/60000 [==============================] - 5s 76us/step - loss: 0.1048 - val_loss: 0.1038\n", "Epoch 28/50\n", "60000/60000 [==============================] - 5s 77us/step - loss: 0.1044 - val_loss: 0.1026\n", "Epoch 29/50\n", "60000/60000 [==============================] - 5s 79us/step - loss: 0.1045 - val_loss: 0.1020\n", "Epoch 30/50\n", "60000/60000 [==============================] - 5s 75us/step - loss: 0.1041 - val_loss: 0.1018\n", "Epoch 31/50\n", "60000/60000 [==============================] - 4s 74us/step - loss: 0.1036 - val_loss: 0.1029\n", "Epoch 32/50\n", "60000/60000 [==============================] - 5s 78us/step - loss: 0.1033 - val_loss: 0.1020\n", "Epoch 33/50\n", "60000/60000 [==============================] - 4s 72us/step - loss: 0.1031 - val_loss: 0.1009\n", "Epoch 34/50\n", "60000/60000 [==============================] - 4s 73us/step - loss: 0.1031 - val_loss: 0.1009\n", "Epoch 35/50\n", "60000/60000 [==============================] - 4s 74us/step - loss: 0.1027 - val_loss: 0.1018\n", "Epoch 36/50\n", "60000/60000 [==============================] - 5s 77us/step - loss: 0.1025 - val_loss: 0.1026\n", "Epoch 37/50\n", "60000/60000 [==============================] - 5s 77us/step - loss: 0.1023 - val_loss: 0.1011\n", "Epoch 38/50\n", "60000/60000 [==============================] - 4s 72us/step - loss: 0.1018 - val_loss: 0.1005\n", "Epoch 39/50\n", "60000/60000 [==============================] - 5s 79us/step - loss: 0.1016 - val_loss: 0.1009\n", "Epoch 40/50\n", "60000/60000 [==============================] - 4s 74us/step - loss: 0.1014 - val_loss: 0.0997\n", "Epoch 41/50\n", "60000/60000 [==============================] - 5s 78us/step - loss: 0.1011 - val_loss: 0.0993\n", "Epoch 42/50\n", "60000/60000 [==============================] - 5s 78us/step - loss: 0.1010 - val_loss: 0.1005\n", "Epoch 43/50\n", "60000/60000 [==============================] - 5s 76us/step - loss: 0.1009 - val_loss: 0.0998\n", "Epoch 44/50\n", "60000/60000 [==============================] - 4s 70us/step - loss: 0.1005 - val_loss: 0.0983\n", "Epoch 45/50\n", "60000/60000 [==============================] - 4s 74us/step - loss: 0.1002 - val_loss: 0.0988\n", "Epoch 46/50\n", "60000/60000 [==============================] - 5s 78us/step - loss: 0.1004 - val_loss: 0.0998\n", "Epoch 47/50\n", "60000/60000 [==============================] - 5s 86us/step - loss: 0.1003 - val_loss: 0.0986\n", "Epoch 48/50\n", "60000/60000 [==============================] - 4s 70us/step - loss: 0.1002 - val_loss: 0.0980\n", "Epoch 49/50\n", "60000/60000 [==============================] - 5s 80us/step - loss: 0.0998 - val_loss: 0.0975\n", "Epoch 50/50\n", "60000/60000 [==============================] - 5s 77us/step - loss: 0.0997 - val_loss: 0.0982\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 開始訓練模型\n", "autoencoder_cov.fit(x_train, x_train,\n", " epochs=50,\n", " batch_size=128,\n", " shuffle=True,\n", " validation_data=(x_test, x_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "該模型收斂到0.094的損失,明顯好於我們之前的模型(這在很大程度上是由於編碼表示的更高的熵容量,128維度與之前的32維度)。我們來看看重建的數字圖像:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABHEAAADqCAYAAAAlBtnSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzt3WecVFW29/HVKgbEEUEQUDIiKgJK\nMqGAmWDOmPMVHjHnDOoMmB0FnTsGEBUVjCjXhBgwgYJKFJSkZBBFMNLPCz8u/3vTVTRNVXWfqt/3\n1TruTfWZPn1CndlrraLi4mIDAAAAAABAxbZBee8AAAAAAAAA1o6XOAAAAAAAAAnASxwAAAAAAIAE\n4CUOAAAAAABAAvASBwAAAAAAIAF4iQMAAAAAAJAAvMQBAAAAAABIAF7iAAAAAAAAJAAvcQAAAAAA\nABJgo3WZXFRUVJytHUF6xcXFRZn4HI5huVpcXFxcIxMfxHEsP5yLeYFzMQ9wLuYFzsU8wLmYFzgX\n8wDnYl4o1bnIShwgd2aV9w4AMDPORaCi4FwEKgbORaBiKNW5yEscAAAAAACABOAlDgAAAAAAQALw\nEgcAAAAAACABeIkDAAAAAACQALzEAQAAAAAASABe4gAAAAAAACQAL3EAAAAAAAASgJc4AAAAAAAA\nCbBRee8ACtOll17q8WabbRaMtWjRwuOjjz465WcMGDDA4w8++CAYGzx48PruIgAAAAAAFQorcQAA\nAAAAABKAlzgAAAAAAAAJwEscAAAAAACABKAmDnJm6NChHqerdaNWr16dcuzcc8/1eP/99w/GRo8e\n7fHs2bNLu4soZ02bNg22p0yZ4nHv3r09vu+++3K2T4Vs880397h///4e67lnZjZu3DiPjznmmGBs\n1qxZWdo7AACA8rHVVlt5XK9evVL9m/iZ6KKLLvL4yy+/9HjatGnBvAkTJpRlF5HHWIkDAAAAAACQ\nALzEAQAAAAAASADSqZA1mj5lVvoUKk2h+b//+z+PGzVqFMzr3r27x40bNw7GevTo4fFtt91Wqp+L\n8rfrrrsG25pON3fu3FzvTsGrXbu2x2effbbHcZpj69atPe7WrVswdv/992dp76B22203j4cPHx6M\nNWjQIGs/98ADDwy2J0+e7PGcOXOy9nOxdnqPNDN78cUXPe7Vq5fHAwcODOb98ccf2d2xPFSzZk2P\nn376aY/HjBkTzHvooYc8njlzZtb36y9bbrllsL3PPvt4PHLkSI9/++23nO0TkARdu3b1+NBDDw3G\nOnbs6HGTJk1K9XlxmlT9+vU93mSTTVL+uw033LBUn4/CwUocAAAAAACABOAlDgAAAAAAQAKQToWM\natOmjcdHHHFEynkTJ070OF6euHjxYo9XrFjh8cYbbxzM+/DDDz1u2bJlMFa9evVS7jEqklatWgXb\nP/30k8fPPfdcrnen4NSoUSPYfuyxx8ppT7CuDjroII/TLcnOtDhl54wzzvD4+OOPz9l+4E9673vg\ngQdSzvv3v//t8cMPPxyMrVq1KvM7lme0K41Z+EyjqUsLFiwI5pVXCpV2EDQLr/WaDjt9+vTs71jC\n/OMf/wi2NUW/efPmHsddUklNq9i0DEPPnj091tRxM7PNNtvM46KiovX+uXEXVqCsWIkDAAAAAACQ\nALzEAQAAAAAASABe4gAAAAAAACRAudbEiVtOax7id999F4z9/PPPHg8ZMsTj+fPnB/PI5y1f2pI4\nzh3VnHGt3zBv3rxSffYll1wSbO+0004p544YMaJUn4nypznl2vbWzGzw4MG53p2Cc8EFF3h8+OGH\nB2Pt2rVb58/T1rVmZhts8Pf/VzBhwgSP33nnnXX+bIQ22ujvW3iXLl3KZR/iWhsXX3yxx5tvvnkw\npjWukB16/m233XYp5z355JMe6/MVUtt66609Hjp0aDBWrVo1j7UW0f/7f/8v+zuWwrXXXutxw4YN\ng7Fzzz3XY56b19SjRw+Pb7nllmCsbt26Jf6buHbOkiVLMr9jyBi9Pvbu3TurP2vKlCke63chZI62\neNdrtVlYo1XbwpuZrV692uOBAwd6/P777wfzKuJ1kpU4AAAAAAAACcBLHAAAAAAAgAQo13Sqfv36\nBdsNGjQo1b/TZaA//vhjMJbLZWpz5871OP7fMnbs2JztR0Xy0ksveaxL28zCY7V06dJ1/uy4XW2l\nSpXW+TNQ8TRr1szjOP0iXrKOzLvrrrs81mWlZXXkkUem3J41a5bHxx13XDAvTsvB2nXq1MnjPfbY\nw+P4fpRNcatlTXOtXLlyMEY6VebF7eSvueaaUv07TVUtLi7O6D7lq912283jeEm+uvnmm3OwN2va\neeedg21NQX/uueeCMe6ta9L0mrvvvtvj6tWrB/NSnS/33XdfsK3p4WV55kXpxKkzmhqlKTEjR44M\n5v3yyy8eL1++3OP4PqXPpa+99low9uWXX3r80UcfefzZZ58F81atWpXy81F6Wn7BLDzH9Fkz/pso\nrfbt23v8+++/B2NTp071+L333gvG9G/u119/LdPPLgtW4gAAAAAAACQAL3EAAAAAAAASgJc4AAAA\nAAAACVCuNXG0pbiZWYsWLTyePHlyMLbjjjt6nC4veffdd/d4zpw5HqdqCVgSzYNbtGiRx9o+OzZ7\n9uxgu1Br4iitf1FWl112mcdNmzZNOU9zUUvaRsV1+eWXexz/zXAeZccrr7zisbYALyttpbpixYpg\nrH79+h5rm9uPP/44mLfhhhuu937kuzgfXNtEz5gxw+Nbb701Z/t02GGH5exnYU277LJLsN26deuU\nc/XZ5tVXX83aPuWLmjVrBttHHXVUyrlnnnmmx/rcmG1aB+eNN95IOS+uiRPXk4TZpZde6rG2jC+t\nuM7bwQcf7HHcplzr5+Syhka+SFenpmXLlh5ra+nYhx9+6LF+r5w5c2Ywr169eh5rLVSzzNQRxJr0\nfUDPnj09js+xf/zjHyX++2+//TbYfvfddz3+5ptvgjH9DqK1Gdu1axfM02tCly5dgrEJEyZ4rG3K\ns42VOAAAAAAAAAnASxwAAAAAAIAEKNd0qjfffDPttopbw/0lbm/aqlUrj3VZVNu2bUu9Xz///LPH\n06ZN8zhO8dKlVbqUHeunW7duHmurzo033jiYt3DhQo+vuuqqYGzlypVZ2jusrwYNGgTbbdq08VjP\nNzNaMWbKvvvuG2zvsMMOHuty4NIuDY6Xi+pyZm3VaWbWuXNnj9O1P/6f//kfjwcMGFCq/Sg01157\nbbCtS8p16X6c0pZpeu+L/7ZYXp5b6VJ8YnHaAdK74447gu2TTjrJY32+NDN75plncrJPsQ4dOni8\nzTbbBGOPPvqox48//niudikxNNXXzOz0008vcd7nn38ebC9YsMDj/fffP+Xnb7nllh5rqpaZ2ZAh\nQzyeP3/+2ne2wMXP/0888YTHmj5lFqYTp0sxVHEKlYrLZSDzHnzwwWBb0+DStQvX9wZffPGFx1df\nfXUwT7/Xx/bcc0+P9Tn04YcfDubp+wW9BpiZ3X///R4PGzbM42yn1rISBwAAAAAAIAF4iQMAAAAA\nAJAA5ZpOlQnLli0LtkeNGlXivHSpWunoUuU4dUuXbg0dOrRMn481aXpNvIRS6e989OjRWd0nZE6c\nfqFy2dUj32na2lNPPRWMpVueqrRbmC4Rvemmm4J56dIX9TPOOeccj2vUqBHM69evn8ebbrppMPbv\nf//b499++21tu51Xjj76aI/jjgjTp0/3OJed3DQtLk6fevvttz3+/vvvc7VLBWufffZJORZ3vUmX\nzog1FRcXB9v6t/7dd98FY9nsMLTZZpsF25oqcP7553sc7+8ZZ5yRtX3KB5oeYWa2xRZbeKzdbOJn\nFr0/nXDCCR7HKRyNGzf2uFatWsHYCy+84PEhhxzi8dKlS0u174WgSpUqHsclE7TswuLFi4Ox22+/\n3WNKK1Qc8XOddoU666yzgrGioiKP9XtBnGrfv39/j8tafqF69eoea5fUG2+8MZinZV3iVMzywkoc\nAAAAAACABOAlDgAAAAAAQALwEgcAAAAAACABEl8TJxtq1qzp8QMPPODxBhuE77y0/TV5rGX3/PPP\nB9sHHnhgifMGDRoUbMftdpEMu+yyS8oxrYuC9bPRRn9f3ktbAyeuLXX88cd7HOedl5bWxLnttts8\nvvPOO4N5lStX9jj+O3jxxRc9njFjRpn2I6mOOeYYj/V3ZBben7JNayz16NHD4z/++COY17dvX48L\nrX5RrmhLVI1jcY2A8ePHZ22fCk3Xrl2DbW3frrWg4hoOpaV1WDp27BiM7b777iX+m2effbZMP6tQ\nbbLJJsG21hS66667Uv47bVf8yCOPeKzXajOzRo0apfwMrdWSzXpKSXb44Yd7fOWVVwZj2va7Q4cO\nwdjy5cuzu2Mok/g6dtlll3msNXDMzL799luPtTbtxx9/XKafrbVu6tatG4zpd8tXXnnF47gOror3\nd/DgwR7nshYgK3EAAAAAAAASgJc4AAAAAAAACUA6VQl69uzpsbbBjduZT506NWf7lG9q167tcbwc\nXJe4agqHLtM3M1uxYkWW9g6Zpsu/Tz/99GDss88+8/j111/P2T7hT9qaOm5JW9YUqlQ0LUpTcszM\n2rZtm9GflVRbbrllsJ0qdcKs7KkaZaHt4TU9b/LkycG8UaNG5WyfClVpz5Vc/n3ko3vuuSfY7tSp\nk8d16tQJxrTVuy61P/TQQ8v0s/Uz4tbh6uuvv/Y4bnGN9LQ9eEzT5eKU/1TatGlT6p/94Ycfesyz\nbMnSpYrqc+PcuXNzsTtYT5rSZLZmKrb6/fffPW7fvr3HRx99dDCvWbNmJf77VatWBds77rhjibFZ\n+Jy7zTbbpNwntWDBgmC7vNLIWYkDAAAAAACQALzEAQAAAAAASADSqcxsr732CrbjKuh/0UrpZmZf\nfvll1vYp3w0bNszj6tWrp5z3+OOPe1xoXWnyyf777+9xtWrVgrGRI0d6rF0fkDlxZz2lS1WzTVME\n4n1Kt4833nijxyeffHLG96siiTumbLvtth4/+eSTud4d17hx4xL/O/fB3EuXtpGJzkj407hx44Lt\nFi1aeNyqVatg7OCDD/ZYu64sWrQomPfYY4+V6mdrt5MJEyaknDdmzBiPeUZaN/H1VFPfNGUxTtnQ\nDptHHHGEx3E3Gz0X47Gzzz7bYz3WkyZNKtW+F4I4dUbp+XbDDTcEYy+88ILHdOSrON56661gW1Ov\n9TuCmVm9evU8vvfeez1Ol1qq6Vlx6lY6qVKoVq9eHWw/99xzHl9wwQXB2Lx580r98zKJlTgAAAAA\nAAAJwEscAAAAAACABOAlDgAAAAAAQAJQE8fMunTpEmxXqlTJ4zfffNPjDz74IGf7lI8033i33XZL\nOe/tt9/2OM51RTK1bNnS4zin9dlnn8317hSE8847z+M4t7e8dO/e3eNdd901GNN9jPdXa+Lkux9/\n/DHY1px+rclhFtaXWrp0aUb3o2bNmsF2qvoE7733XkZ/Lkq29957e3ziiSemnLd8+XKPab2bWcuW\nLfNY6znE21dcccV6/6xGjRp5rLXEzMJrwqWXXrreP6tQvfHGG8G2njta9yauU5OqLkf8eT179vT4\n5ZdfDsa23357j7W+ht63C12NGjU8jp8JtHbc9ddfH4xde+21Hg8cONBjbetuFtZdmT59uscTJ05M\nuU8777xzsK3fC7nephe3/dZ6UlWrVg3GtDat1q1dsmRJMG/27Nke69+EfucwM2vXrt067+9DDz0U\nbF999dUea72r8sRKHAAAAAAAgATgJQ4AAAAAAEACFGw61WabbeaxtqozM/v111891nSe3377Lfs7\nlkfi1uG6FE1T1mK6VHjFihWZ3zHkRK1atTzu0KGDx1OnTg3mads+ZI6mLuWSLoE2M9tpp5081mtA\nOnFb3kK69sZLjrVt8FFHHRWMjRgxwuM777xznX9W8+bNg21N4WjQoEEwliqFoKKk6uU7vZ9usEHq\n///t9ddfz8XuIMs0RSQ+9zRdK75WovTiFNRjjz3WY03z3nLLLVN+xn333edxnEb3888/ezx8+PBg\nTNNFDjroII8bN24czCvktvG33367xxdffHGp/51eH88///wS40zR809LQRx//PEZ/1n5LE5P0vOj\nLAYNGhRsp0un0hR2/Tt79NFHg3nawryiYCUOAAAAAABAAvASBwAAAAAAIAF4iQMAAAAAAJAABVsT\n57LLLvM4bnU7cuRIj8eMGZOzfco3l1xySbDdtm3bEuc9//zzwTZtxfPDaaed5rG2K3711VfLYW+Q\nK9dcc02wrW1W05k5c6bHp556ajCmbSQLjV4P41bDXbt29fjJJ59c589evHhxsK21N7beeutSfUac\nN47sSNXiPa4l8OCDD+Zid5BhxxxzTLB9yimneKw1G8zWbLOLzNAW4Xq+nXjiicE8Pee0dpHWwIn1\n6dMn2N5xxx09PvTQQ0v8PLM174WFROuiDB06NBh74oknPN5oo/CrbN26dT1OVz8sE7QGoP7NaJtz\nM7O+fftmdT9gdvnll3u8LjWJzjvvPI/L8hxVnliJAwAAAAAAkAC8xAEAAAAAAEiAgkmn0mXnZmbX\nXXedxz/88EMwdvPNN+dkn/JdaVsC9urVK9imrXh+qF+/fon/fdmyZTneE2TbK6+84vEOO+xQps+Y\nNGmSx++9995671O+mDJlisfaAtfMrFWrVh43adJknT9b2+jGHnvssWC7R48eJc6LW6IjM7bbbrtg\nO07p+MvcuXOD7bFjx2Ztn5A9hxxySMqxl19+Odj+9NNPs707BU9TqzQuq/g6qelBmk7VqVOnYF61\natU8jlui5ztt6Rxf15o2bZry3+23334eV6pUyeMbb7wxmJeqxENZabpz69atM/rZKNlZZ53lsaaw\nxSl2auLEicH28OHDM79jOcJKHAAAAAAAgATgJQ4AAAAAAEAC5HU6VfXq1T2+9957g7ENN9zQY00F\nMDP78MMPs7tjCOhyUTOz3377bZ0/Y/ny5Sk/Q5dTbrnllik/o2rVqsF2adPBdMnnFVdcEYytXLmy\nVJ+Rj7p161bif3/ppZdyvCeFSZf2puvQkG4Z/0MPPeRxnTp1Us7Tz1+9enVpdzHQvXv3Mv27QjZ+\n/PgS40z4+uuvSzWvefPmwfaXX36Z0f0oVHvuuWewneocjrs7Ipni6/BPP/3k8R133JHr3UGWPf30\n0x5rOtVxxx0XzNNyA5R6KJ0333yzxP+u6cdmYTrV77//7vEjjzwSzPvPf/7j8YUXXhiMpUpzRXa0\na9cu2NZrY5UqVVL+Oy3Tod2ozMx++eWXDO1d7rESBwAAAAAAIAF4iQMAAAAAAJAAvMQBAAAAAABI\ngLyriaO1bkaOHOlxw4YNg3kzZszwWNuNI/c+//zz9f6MZ555JtieN2+ex9tss43Hcb5xps2fPz/Y\nvuWWW7L68yqSvffeO9iuVatWOe0JzMwGDBjgcb9+/VLO0/a16erZlLbWTWnnDRw4sFTzUD60plJJ\n23+hBk52aE2/2OLFiz2+5557crE7yAKtzaDPKWZmCxcu9JiW4vlH75N6fz7ssMOCeTfccIPHTz31\nVDA2bdq0LO1dfnrttdeCbX0+15bUZ599djCvSZMmHnfs2LFUP2vu3Lll2EOsTVw7cYsttihxntYU\nMwvrTr3//vuZ37FywkocAAAAAACABOAlDgAAAAAAQALkXTpV48aNPW7dunXKedo+WlOrkDlx6/Z4\nmWgmHXPMMWX6d9pWMF0ayIsvvujx2LFjU8579913y7Qf+eCII44ItjW18bPPPvP4nXfeydk+FbLh\nw4d7fNlllwVjNWrUyNrPXbRoUbA9efJkj8855xyPNeURFU9xcXHabWTXQQcdlHJs9uzZHi9fvjwX\nu4Ms0HSq+PwaMWJEyn+nKQRbbbWVx/p3geQYP368x9dff30w1r9/f49vvfXWYOzkk0/2eNWqVVna\nu/yhzyJmYZv3Y489NuW/69SpU8qxP/74w2M9Z6+88sqy7CJKoNe7yy+/vFT/ZsiQIcH222+/ncld\nqjBYiQMAAAAAAJAAvMQBAAAAAABIAF7iAAAAAAAAJEDia+LUr18/2I5byP0lrgmhbXWRHUceeWSw\nrbmMlSpVKtVn7Lzzzh6vS3vwhx9+2OOZM2emnDds2DCPp0yZUurPx58qV67scZcuXVLOe/bZZz3W\nHGJkz6xZszw+/vjjg7HDDz/c4969e2f052rbTjOz+++/P6Ofj9zYdNNNU45RfyE79L6o9f1iP//8\ns8e//fZbVvcJ5UPvkz169AjGLrroIo8nTpzo8amnnpr9HUNWDRo0KNg+99xzPY6fqW+++WaPP//8\n8+zuWB6I71sXXnihx1WqVPG4TZs2wbyaNWt6HH+fGDx4sMc33nhjBvYSZuHxmDRpksfpvjvqOaDH\nNp+xEgcAAAAAACABeIkDAAAAAACQAIlPp9KWtWZm9erVK3He6NGjg23apeZev3791uvfn3jiiRna\nE2SKLuVftmxZMKZt2e+5556c7RPWFLd1121NQY2vp927d/dYj+dDDz0UzCsqKvJYl74iuU4//fRg\n+/vvv/e4T58+ud6dgrB69WqPx44dG4w1b97c4+nTp+dsn1A+zjrrLI/PPPPMYOy///2vx5yL+WXR\nokXB9v777+9xnMpzxRVXeByn3GHtFixY4LE+62jrdjOz3Xff3eObbropGFu4cGGW9q6wde7c2ePt\nttvO43Tf3TXNVFOO8xkrcQAAAAAAABKAlzgAAAAAAAAJULQuaUVFRUUVIgdp77339viVV14JxrSi\ntWrXrl2wHS9VruiKi4uL1j5r7SrKMSxQ44qLi9usfdracRzLD+diXuBcXIuXXnop2L7zzjs9HjVq\nVK53p0T5fC7WqVMn2O7bt6/H48aN8zgPur8V7Lmoz7LaacgsTHkdMGBAMKapy7/++muW9m7d5PO5\nWFHE3Xf32GMPj9u3b+/xeqQ0F+y5mE/y4VycMGGCx7vsskvKef379/dY0wvzQKnORVbiAAAAAAAA\nJAAvcQAAAAAAABKAlzgAAAAAAAAJkMgW4x06dPA4VQ0cM7MZM2Z4vGLFiqzuEwAA+UJbriL3vvvu\nu2D7jDPOKKc9Qba89957HmtLXaAkRx99dLCtdUOaNGni8XrUxAEqhGrVqnlcVPR3iZ+4pfvdd9+d\ns32qiFiJAwAAAAAAkAC8xAEAAAAAAEiARKZTpaPLC/fbbz+Ply5dWh67AwAAAABl9sMPPwTbDRs2\nLKc9AbLrzjvvLDHu06dPMG/evHk526eKiJU4AAAAAAAACcBLHAAAAAAAgATgJQ4AAAAAAEACFBUX\nF5d+clFR6Scjo4qLi4vWPmvtOIblalxxcXGbTHwQx7H8cC7mBc7FPMC5mBc4F/MA52Je4FzMA5yL\neaFU5yIrcQAAAAAAABKAlzgAAAAAAAAJsK4txheb2axs7AjSqp/Bz+IYlh+OY/JxDPMDxzH5OIb5\ngeOYfBzD/MBxTD6OYX4o1XFcp5o4AAAAAAAAKB+kUwEAAAAAACQAL3EAAAAAAAASgJc4AAAAAAAA\nCcBLHAAAAAAAgATgJQ4AAAAAAEAC8BIHAAAAAAAgAXiJAwAAAAAAkAC8xAEAAAAAAEgAXuIAAAAA\nAAAkAC9xAAAAAAAAEoCXOAAAAAAAAAnASxwAAAAAAIAE4CUOAAAAAABAAvASBwAAAAAAIAF4iQMA\nAAAAAJAAvMQBAAAAAABIAF7iAAAAAAAAJAAvcQAAAAAAABKAlzgAAAAAAAAJwEscAAAAAACABOAl\nDgAAAAAAQALwEgcAAAAAACABNlqXyUVFRcXZ2hGkV1xcXJSJz+EYlqvFxcXFNTLxQRzH8sO5mBc4\nF/MA52Je4FzMA5yLeYFzMQ9wLuaFUp2L6/QSB8i1oqK/r0XFxYm/nswq7x0AYGaci0BFwbkIVAyc\ni0DFUKpzkZc4qNDy4MUNAAAAAAAZQU0cAAAAAACABOAlDgAAAAAAQALwEgcAAAAAACABqImDclep\nUqVgu3r16h5XrVrV42XLlgXzlixZ4vHvv/+epb1Dedpgg7/fM2t9JGolAQAAAChErMQBAAAAAABI\nAF7iAAAAAAAAJADpVMiZjTfe2ONWrVp53KtXr2BemzZtPK5SpYrHM2bMCOY99dRTHj/22GPB2M8/\n/7x+O4tyoX8jZmYtWrTweO7cuR7Pnz8/Z/uENRUVFQXbpLcBAAAAucFKHAAAAAAAgATgJQ4AAAAA\nAEAC8BIHAAAAAAAgAaiJg6zZfffdg+3//ve/Hjdo0MDjjTYK/wy1vobW3thyyy2Dee3atfN43333\nDcbOOOMMj6mPU7HpMd5rr72Csdtvv93jQYMGeXzvvfcG86jJkh2bbLKJx/fcc4/HLVu2DOYNGTLE\n44EDBwZjv//+e5b2DqpSpUoeb7BB+P/P/PLLL7neHVQAce2q2rVre6z3xaVLl+Zsn/JF/LutXLmy\nxytXrvS4ot6bdP/12hFfr1evXp2zfQLylZ5veq0wM2vbtq3H22+/vccLFiwI5o0ePdrj5cuXZ3oX\nkUCsxAEAAAAAAEgAXuIAAAAAAAAkAOlUyChdlqvpF2ZmzZo181iXGH/77bfBvK+//trjLbbYwmNN\n7Yg/r1u3bsHY/vvv7/GIESNK/LmoGDT148gjjwzGGjdu7HHVqlU9psV1dsQt3h988EGPTzjhBI/j\ndJ1WrVp5vMsuuwRj5513nsccp8zS86B9+/Ye77TTTsG8YcOGebxs2TKP4+NR2uOjPzf+m9lwww09\n/vXXX4MxUuuyT8/NU089NRjr37+/x1999ZXHHTt2DOaRfrd2m2++ebDdvHlzj2fPnu1xnBLxxx9/\nZHfHUth2222D7d69e3s8bdo0j5955plgHmkba97v9Pqn6Wbc35JLj6l+7zAz69q1q8fdu3cPxlq3\nbu2x3t+22mqrYJ5ux99l9Gfr35Deq83MbrvtNo/vu+++YIxrdmFiJQ4AAAAAAEAC8BIHAAAAAAAg\nASpUOlWcIpEKSxYrLl1aOnz48GBMK7LrUu7//Oc/wTwd23TTTT2OlyA+8sgjHm+33XbBWPXq1T1O\ntVQRFYOmY8QdzbTLx6hRozzvkTavAAAeS0lEQVSmY0bmaPrLBRdcEIwdd9xxHmuqZEyXmx9xxBHB\nmHaueuedd8q8n1iTHrsuXbp4HKe0ffPNNx6PGTPG4zjdKV1qQKrl5rvuumswr0qVKh5/9NFHwdji\nxYtL/FnInM0228zjXr16BWPa4bFWrVoex+c2S/NLpr8nTSE1M2vTpo3H22yzjcfaUcbM7IcffvA4\n2+eApnBoKp1Z2CH04Ycf9vinn37K6j4lhV7HND3fzKxevXoeT5gwweO5c+cG8/S6y/Wu4tHvFCee\neKLHV155ZTCvfv36HsfXyjjVriz0b0OvvfpdKN6Ovy//tR+F/HemvxN9Noq39XulWXgMtWtjfB/U\nZ6KK8l2SlTgAAAAAAAAJwEscAAAAAACABOAlDgAAAAAAQALkvCaO5p7FdUzOPvtsjxs1ahSMPffc\ncx5/8cUXHsftqTXHX9u9pctfi3MLNXdOx9LlQmrtDrPyayNZ3vR/91133RWMDRgwoMR56drQ6u8/\nzj395JNPPNYcZbOKmbuIkmnrU63ZYGb25ptvejx27Nic7VMh6dy5s8c333xzMKa5w3rOxtc33Y6v\nkzfccIPHhxxyiMfxeY91p/fQbt26eRznxae6p8XS1Q/T62/NmjVL/LlmYevlGTNmBGOLFi1K+bOR\nGc2aNfO4SZMmwZge3zlz5nhM6/eSxeeK1kbR65qZ2W+//ebxsGHDPNYaVGZmG23092N3umfUsjy3\naB0XM7PzzjvP47iuy+DBgz3++uuvS9ynQqPXSb0X6u/RLLwWLly40ONJkyYF8/Q7jZ5vKB9x6/Ce\nPXt6fPXVV3us9TvNwnMi/q63atWqEsfie51+X5k9e3YwNn78eI+1rfjUqVODeVqvSq83hSS+Jmtd\nI61TduyxxwbzdEy/c5iF12R9vzB06NBg3qeffurxrFmzgjGtn5PL75ysxAEAAAAAAEgAXuIAAAAA\nAAAkQM7TqZo2bepxv379grF9993XY22TaWZ2wAEHeKzLyLRdo1m43GzBggUea2vT+PN1+bdZuEQ9\n3dJzbS14//33B2Pjxo0rcX8LSZwuodulbfutY3E6lf5e06XEoWKJj1Xr1q09jpdyP/744x5r6z+s\nn6pVq3p85513ehy3XlS6bDhupapjNWrUCMa09e7tt9/u8SWXXBLMK9Tr5LqIr4HXX3+9x1tvvbXH\nTz31VDBPlwjrst90qRPprst6Lv7jH/8IxjQVOl6+jszTpeBmZhdeeKHHcXqN3oPfe++9Ev87/qbX\nSTOzK664wuM4VU2fBzX1N27ZneqZJt35Fqev6j1044039vi0004L5mmKyIoVK4IxTW8v1OMfP4uc\nfPLJHp9//vkea8qGWXis9H6n9zozs0cffdTjU045JRiLS0EgvfhYadp2fO7oWJ06dTw+6aSTgnmn\nnnpqiZ8fP99oOY958+YFY5oKpal18fFdvny5x/GzDiUf1qTXRj3H4vPooIMO8rh58+Yex6UZ9PPi\n5yg99poqvuuuuwbzZs6c6fHo0aODMT3XdV62W76zEgcAAAAAACABeIkDAAAAAACQALzEAQAAAAAA\nSICc18TR2jRPP/10MPbdd995vPPOOwdjmpusdRu22mqrYJ7mzm2//fYex7n/mqcW58fpmNbLiXPP\ntQaB1hkwM/v88889ptbDmtK1Dtf8UM1FbtmyZTBvjz328Dhu5/fyyy+X+Hkof3G9q4MPPtjjH3/8\nMRibOHGix9nOLc1n8bXrjjvu8Diu7aD0uqZ5vh988EEwT+uP7bPPPsGY5imfcMIJHmsdHTOz6667\nzuNCrdGwNi1atAi2u3Tp4rEeg0GDBgXz9Pqo9TXW5dqo1+y6det6fOCBBwbz9PPjOhzIvLgGld4X\nY1qf5YUXXvCYa+vf9O98xx13DMa22WYbj/V8MwvrfWkr2vjZMNXPimt+6LkZj2kdHK3boDVwYnp9\nNQvbiheq+HvGXXfd5bH+juNjqPVOtC5nXF9T73233nprMKbtx7nflUy/G8T1vfQ7odbAMTPr1KmT\nx1rjtF27dsE8PXZaf1Hrm5iFxzv+vqLPs9piPK7hyPeQ9OJ6jN26dfO4d+/eHsffA/V5Q79rL126\nNJin2/Ex1Lp++nlxbdVddtnF4/jeUK9ePY8vuugij7VlfDawEgcAAAAAACABeIkDAAAAAACQADlP\np9KlRc8++2wwNmLECI/jln7Vq1f3WJc7NWjQIJin27r0Vdu7xWrVqhVsaxt0TQ2IW6lqisKsWbOC\nMZZHrkmXsFWrVs3juI2nHmtNF+jatWswT5eufvzxx8FYnJaDiiM+3xo3buyxpuyYhemXKLt99903\n2D7xxBM91mtt3Mp2yZIlHo8cOdLjd955J5in53bcVlqXM2v6q7ZwNQuvCfFYIaek6vHp379/MKZL\n/rWtcXw/io9racQpHLqc/bzzzvNY77NmZrNnz/Y4XtLMkvLM0GPToUOHYKx27dolzjMze//99z3W\ntvMomd6bzMJnk/jeFLcS/0u8dF/pcv108+J0kQMOOMDje++91+P43vrNN994PHz48GCsUFPo9JzQ\ntAez8JlSn+FHjRoVzHvooYc81ufXjh07BvO0/XGcfqEtkONyAPiT3vt22mmnYExT1eJUK33m0JR8\nTXM0C1uJT5o0yeM4fU7vW/F5qnP1nOJet3b6nfrKK68Mxg477DCP9dkwTsPXa5zGkydPDuZ99dVX\nHsfvFzQFWZ9ftSSLWfg3GJeFaNWqlcfbbrutx99//30wL9N/F6zEAQAAAAAASABe4gAAAAAAACRA\nztOpdFl3vMQ7XRX/hQsXlvjfp0+fHmzrUrfSLm2Ll6rqUijtOKBLI83C5XdxN5C4GxbCpcOasqbL\n5szMdttttxLnxcsY3377bY/jNIN0f0vIPV3CrMfXLDzGb731VjBWyGk060vPl/j80E4Aem2MUwI0\nbeqxxx7zeN68ecE8Pbd1+bKZ2ZgxYzzu0aOHx3FXo+OPP95j7ZxjFnabKzSa+hafO9ph5pFHHvE4\n7gqViWXemrpVuXJlj7XDh5nZU0895XGcToXM0FTu+DzSZd7xffDuu+/2OF6Wjj/pvUq7kZiF50D8\njKe/67irSarP12fP+PlGU3vatGkTjPXp08dj7ZIalw0455xzPM52l5Sk0GOjaRpmYccx/W7Rt2/f\nYJ4++2s6afw3occtTjPWDn+kU5VM06T22muvYExLZ2hnY7Mw/W3cuHEex/cjfb4s631R/x0pVOnF\nXVKvuuoqjzVF2yzs7qXlMeLvCJomqn8H8fVOn4HidCpNtdLv/5deemkwT6/RcaqyPjvr81G2sRIH\nAAAAAAAgAXiJAwAAAAAAkAC8xAEAAAAAAEiAnNfESSddPmGqsUy0SYw/W3Ob69Wr53Fcw0dbpGur\nOpRM8yE7d+7scadOnYJ5mpOox/fbb78N5g0ePNjjKVOmBGPkplYsmiPau3fvYEzzU1999dVgrCyt\nkfEnzRmPWyXqeaW5x1pXxczsnnvu8VjPvzj3X/ODtS25WZjvrznoe+65ZzBP248//PDDwZjOjeug\n5RutV2RmdsYZZ3isNTnMwnpDWqchPj5luR7GOd9a+0FbL8+fPz+Yp/dFbdOLzNFW0nFNHKW5/mZm\nH3/8scfcI0umv5e4roKeE1qLxixs+63Xufgc0LoKWvMjPt8aNmzo8ZlnnhmMaQtlfV6Nr5vvvvuu\nxxzvP+nvX88Hs/Ba9v7773s8Y8aMYJ7+LrVVuNYxMguvw9pO2cysffv2Hn/22WclfnYh0uOz7777\nety9e/dgnp6b8XHUVuKLFy/2OH6ezMTvutCP17rQZwgzs/3228/j+Lln5cqVHut5OWvWrGCe1uTT\n625c61bFP6tmzZoet27d2mO9zpqFf5vx35I+5+qzcrb/PliJAwAAAAAAkAC8xAEAAAAAAEiACpVO\nVV7ipVW33nqrx7vuuqvH33//fTBPW5uR9rF22tpRlwrHy4h1uZzGw4YNC+bpcleW7Vc8ely1PWTc\ntlXPK00JwfrRlMX4/NBlp3oe/etf/wrmLVy40ON0qau6ZDQ+nzVd65tvvvFYlzmbhelUVatWDca0\n/eRll11W4s/NF/GS4zp16ngcp3eMGDHC47g9/PqKU7f0HNZ2uS+++GIwb9q0aR7n4/EpL3r/1PSa\nGjVqBPP0PH3iiSeCMT0XUTL9m3388ceDMf29x0vtL7roIo8PP/xwj+fMmRPMi6+Pf4lbjOt1QFNj\nzcLrubbcve+++4J5ep3Hn/RZXdNuzMKUJ03zbtasWTBPU+n23ntvj7X8gllYQiBub62pjunSNAqN\nphged9xxHjdq1CiY99prr3msbcTNwvuk/j7Lej/SczY+Twv9eK2L+Lu2tg6Pn1H1fqdpinEafu3a\ntUv8vDh9UdMe69evH4xpCY/q1at7vNlmmwXzNHVr7Nixwdi1117r8bx58yxXWIkDAAAAAACQALzE\nAQAAAAAASICCTafSpVpaJd4srIiuS5Pjzi2aaoC107QArQAepwiMHj3aY01ZiztQsVS4YtNz7OST\nT/ZYO1WZmX300Uces9y/7OJl+tqRasWKFcHY+PHjPe7Tp4/HWmHfrGzd/+Ily7rcWFPntPvA2mRi\nSXRSxOlUmloWp0zp8dGl+3F3qtIeR+3osMMOOwRj3bp181j/1t57771gHtfl7NB0w6OOOsrjuAuH\n3k+fe+65YIyl/+smToU6++yzPb777ruDMU2xSdexSJfoa8qOxmbhcY1TGxcsWODxK6+84vF3330X\nzMv3a2VZpLsWasqOplg0b948mKfd4bRTX3ycdDs+98466yyPtfvOxIkTg3mFdgz1+XCnnXbyWNNc\nzMxatWrlcbt27YIxTXnSczh+viztc4WmD1erVi0Y03OO59f04udL7a6paVFm4TPM8uXLPY6vk/qc\nq+ebdpyKt/V4moV/L/ocFT839+vXz+NBgwYFY5oumYmu2aXFShwAAAAAAIAE4CUOAAAAAABAAvAS\nBwAAAAAAIAEKpiaO1ucwC1sGPvjgg8GY1iR49913Pb7uuuuCeXHdAYTiGh133HGHx5pH/Pzzzwfz\ntCaOthiPay0UWq5w0mgtj4MPPtjj+Fz8+OOPPeacKrv496r55Jrna2b2+uuvezx16lSPs1EzQ/OD\ndR/jdqyalxznFOvfSL6Lj9Uvv/yScq7m52stgfj3p8dVa23ELT8bNmzocc+ePYOxli1beqzX3jhv\nnOtyZsT3T22tqvfPeJ7WjtP7J9afPpuccsopwVibNm081vNKa+WYhbUBtT28HlOzsEVu3Op22rRp\nHn/wwQcec/9cN3E9Kb1nal2j+JqmtTf0uTSu76j1UrR1tllYi/OGG27w+Nxzzw3mxa3J853WfdPf\nbdzaW9tEn3nmmcGY1sjR73AzZsxI+bO0dpUeezOzvfbay+O4nso999zjsdbf4T64Jm0BbmZ2++23\nexzXb9NzTK+FLVq0COZp7aq6det6rN/xzcKaSvE9U5+xtD34Aw88EMzTY13WuoOZxkocAAAAAACA\nBOAlDgAAAAAAQALkdTqVLpnS9pxmZhdffLHHuoTczOybb77xWJfMrktLXIRLhc3M9ttvP4+1TVzc\nCk5TBHSJY7xsX5evsXSx4tHljHr+xcsQR4wY4THHseziNJymTZt6rMtRzcJlp7pMOV5mmonjoZ9/\n9NFHexy36tSfHZ/ro0aNWu/9SIovvvgi2NYW3nvssUcwptdUTZmaO3duMG/hwoUe699CfF9s0qSJ\nx3EaiC5t11jbfyJz4nOxY8eOHqdrXTxkyBCP06XiYd3pM8eECROCMW0Nrccuvi7rsdPnG03lMTM7\n8MADPdZ0DjOzJ5980mNNmSuvJf1Jove0Dz/8MBgbN26cx23btvU4bhOvzzCaQqOpbWZms2fP9lhb\nYpuZde7c2ePdd9/d4wsuuCCY17dv3xJ/br7Se/+//vUvjy+55JJgnt7H4u8QHTp08HjnnXf2WFu5\nxz9LU6jiduaaAhmnden3wv79+3scpw7xbLvm70CfHT777LNgTH/PmvY4fvz4YJ4+w+hxj9vO6zU5\nvk7qdaBPnz4ev/POO8G8bJQbWF+sxAEAAAAAAEgAXuIAAAAAAAAkAC9xAAAAAAAAEiCva+JoHp3m\nk5uF+cZxW0Bt9/ftt99mZ+cKwPHHHx9sa9tNzS38/vvvg3n6O9d807hGQLytyD/Nvfh4aMtVzUHV\nPHEzs0mTJmV3xwpE3GJcW07HY3rNK0tNnHTnXpwzfsghh3h81VVXpZyn+f7XXHNNMFZIbVbjXPp/\n/vOfHj/00EPBmNZZ0LoN2trWzGzMmDEer1q1yuO4dfGCBQs8jnPUtU6A5qHHNT+49maG1o0zC6+n\n+jtesmRJMI8aY+UjVb0SrR9lZvbzzz97rC2O4/pFWlOuZcuWwdj06dM9/vXXX9d9Z2FmZosXLw62\ntR7Ndttt53Fcc0WfZbX+WFzLTefpcTcz23XXXT3WNslHHnlkMG/kyJEexzV88pFes4YNG+ax1io1\nC79fdOvWLRjT9uP6u43rn+o5q99J9LiZhd8l4zGtbaR/C3Edv6+++spjrstrin8nejx0LP6+rs+2\nWscqrven30HimoFaB+f9998vcR8qKlbiAAAAAAAAJAAvcQAAAAAAABIgr9OptGVcr169grEtttjC\n43jZ+KuvvuoxLRvLTtvfxn744QeP33777WBs5syZHqdbKqzL6OL0jlTtx+PjmW5Zo36m/qz439Dq\n/E9xyo62+NMUjnhJsI6h7OKln7o8Px7bcccdPdal4vGxiFMB/hKn0Ohy49atWwdjDzzwgMfaFjQ+\nFz///HOPH3300RJ/biHSlppxiur222/v8bx58zyOz0VtMa5LyON5elzjdDdN3YrbjyMz9J7TuHHj\nYEyPtabhxG1QNSUOFU+q55H4Gq3ns14bzcymTJlS4mdg/ehzqaZ5T548uUyfp9fQuGxAkyZNPD7g\ngAM81jQuM7MePXp4rC3QzVLfn/OFPv9/9NFHwZimV+m5YmZ29NFHe6zPJnGKapUqVTzW74TxPBWP\n6bPU5Zdf7rGmkZuZnXzyyR7HKdNIT69x8TOLPpd06dLFY00vNwvPPy2ZYmY2evToEn9WErASBwAA\nAAAAIAF4iQMAAAAAAJAAeZdOpcuRd9ppJ4+bNm0azNOlq3379g3GdEkl1o0uddttt92CMT02G2+8\nccrP0DFd3h8vN9ZljemqyWscL7HTpc1a0d7MbM899/RY/5biqvPaPWDGjBkpPz/f6e/ZLHUHsrfe\neivlPJRdvLR6+fLlHtetWzcY23333T3WJajPPvtsME+7bWh3ovjc1qXDXbt2Dcb03ylN8TELu3KQ\nYvc3Xd4bX190Sblea0qbJhqnTOn1Nu4ap+l5eu2Nu/IU0jUvm+K0Cu1uo/Frr70WzEvVJQkVg55/\nes+sWrVqME+v2fF5Gm8ju8p6TdNnmzjN8e677/ZY/ybOO++8YJ6WJdD0H7M1O/Xks/gY6PPDwIED\ngzF9Rtfvft27dw/maSqOHqt098W4dEPc4bGkn2u25vMxykbLpJiZXXHFFR7XqlXL4zgtSsukDB06\nNBhLWgqV4k4AAAAAAACQALzEAQAAAAAASABe4gAAAAAAACRA3tXEqVy5ssda66ZGjRrBvOHDh3us\n7cXMkp0fV5HENS9q167tseaRxjnAWn9G84gXL14czNt555091naNZmHbZG1rrH8fZmGeqs4zS50H\nu++++wbzdthhB48vu+yyYExrF+S7OnXqBNt77LGHx5q7HbfE5XzLjLi20KBBgzz+5z//GYxpvQ39\nmz3ooIOCeZqH3qxZM4+rVasWzNPzOW4/rubPn+9x586dg7FZs2al/Hf4U1wXoCz1pFK1ODYLr3Px\nMdbjr+1YC+kal0txK1u9P+m99d133w3mcT2t2LRu4Lbbbutxhw4dgnl6/4xbEut5Sg2qZIiP03ff\nfefxbbfd5vHBBx8czNPzvm3btsHY66+/nvLz853+79X6f2Zmn3zyicefffaZx3Gdt9NOO83j7bff\n3mP9DmIW3u/i66tua0v0sWPHBvO0viDWjT5TnnTSScGY1nfUa2vcdl6/Z2p9v6RjJQ4AAAAAAEAC\n8BIHAAAAAAAgARKfThW3e9N2fLo8bs6cOcG8a665xmNacmaOLu/v3bt3MPbyyy97rK0S41Sohg0b\nehwfX6XLzdO13NSlc3H7eE3RGjNmTDCmSzQ//PBDj7VVnVn4t1Vo7bL1937dddcFY40aNfL4iy++\n8DhutYnsePjhhz3W652Z2dZbb+2xpkJts802wbxU51/833Vpc9zqXNtgn3jiiR5PnTo15b4jN+Lj\nqOmm5557bjCmLVP1eHP/zI44tXGrrbbyeOnSpR5zPU2WTTfd1GM9xscee2wwT1M43n///ezvGMqN\nppv369cvGLv++us9bteuXTCmpSDyKUVkfaV6HpkyZUowT88rLfcQ3xe17EKcTqXpxJrGdfXVVwfz\nNNUKa6fHQI/NBRdcEMzT74H6/atPnz7BvDglNV+wEgcAAAAAACABeIkDAAAAAACQALzEAQAAAAAA\nSIDE18TRPHEzs2uvvdZjzamL2xrPnj07uzuGNfK4Tz/9dI81t1fbHZuZNWjQwOOqVat6HLcH1+24\nDofWYNEaNs8//3wwT1u1xp+hCq19Y2lpTRxt+W4Wnn9vvvmmx6tWrcr+jiHIAT7rrLOCsSFDhnis\nNXHi2lKpWtmmywt/6623grFLL73U4+nTp5f4eagY9H7avn37YGzjjTf2WNulLlmyJPs7ViD0fIvb\n3OqYtiemxXuy6HHs2LGjx7vttlvKeXq8zcJnH9qNJ58etzfeeCMY0+80cZ0ybaP8yCOPeBzfn/Gn\nlStXBtsjR470WOupaA0cM7PmzZuXOM/M7JVXXvH40Ucf9fjbb79dr30tdPq80aNHD4/r1KmT8t9M\nnDjR40GDBmVnxyoYVuIAAAAAAAAkAC9xAAAAAAAAEiCR6VS6lPSmm24Kxlq0aOGxLjMeMWJEMC9d\n6gwyI17a+9xzz3msaU3x0sVU7fzStRGP2/dp21uWGGePHp84fU7TLG6++WaPC60Ne0Xw4osvBtu6\nJLV169Ye9+rVK5inbW7nzJnjcdyqUz9fW4qbca2tyOJro7apjY+bXlPHjBnj8aJFi7K0d4VHj4em\nBJuZtWrVyuP//d//9ZjWtcmi6cR6j9T0AbOwFXlcNkBTZXm+yS/z588Ptt99912PNa3ELExV1rIB\ncfodSrZ8+XKP9fvJa6+9FsyrW7eux3E5AC3J8NNPP3nMebl+GjZs6LGmEcbfFxcvXuxxt27dPI5T\n5/IVK3EAAAAAAAASgJc4AAAAAAAACZCYdKqNNvp7V7VrxpFHHhnM22STTTyeMWOGx3HFd5a6lS/9\n/cfLwVkenhyaTnXDDTcEY5qOUShLG5NCl+O//fbbJcYoPEuXLvU4TsHTzmIXXnihx5pmhfWj98UB\nAwYEY3o91WPDs0yy6PnSp08fj9u0aRPMa9y4sccDBw4MxugIl7/i87l///4ed+rUKRjTkhHa5ZV0\nqnWnaf4//PBDMKZdj5Ad2mXPzKx79+4e16xZ0+O4G+NVV13l8dy5c7O0dxUXK3EAAAAAAAASgJc4\nAAAAAAAACcBLHAAAAAAAgARITE0crXXTtWtXj6tXrx7M03zjr7/+2mNt/QYg87RdI4Dk0RbjN910\nUzC24YYbljgP2TF58uRgW3P/qRuXH+bNm+dxx44dg7EqVap4rG10zcJadMhv06ZN87ht27bB2AYb\n/P3/w2udOyBptO6tmdlBBx3ksX6v//TTT4N5gwcP9rgQ68OxEgcAAAAAACABeIkDAAAAAACQAIlJ\np9L2mp9//rnHX375ZTBv1apVHt9yyy0es/wYAIDSiVuH00o8t+Kl4aSw5beVK1em3UZh0uvA0qVL\ny3FPgOzRFu9m4ff3pk2bejx06NBgXqHfF1mJAwAAAAAAkAC8xAEAAAAAAEgAXuIAAAAAAAAkQGJq\n4hQVFXk8ZswYjydOnBjM09o5U6dOzf6OAQAAAECW6PegdAqx1TLyy0cffeTxJ5984vGKFSvKY3cq\nLFbiAAAAAAAAJAAvcQAAAAAAABJgXdOpFpvZrGzsyNpoG7Hp06eXxy6Up/oZ/KxyO4bgOOYBjmF+\n4DgmH8cwP3Ack49jmAM5SJPiOCZfIo/h6tWrg+2VK1fm4sdWZKU6jkXkTgIAAAAAAFR8pFMBAAAA\nAAAkAC9xAAAAAAAAEoCXOAAAAAAAAAnASxwAAAAAAIAE4CUOAAAAAABAAvASBwAAAAAAIAF4iQMA\nAAAAAJAAvMQBAAAAAABIAF7iAAAAAAAAJMD/Bxuza0QPkd4RAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "decoded_imgs_conv = autoencoder_cov.predict(x_test)\n", "\n", "n = 10 # 我們想展示圖像的數量\n", "plt.figure(figsize=(20, 4))\n", "\n", "for i in range(n):\n", " # 秀出原圖像\n", " ax = plt.subplot(2, n, i+1)\n", " plt.imshow(x_test[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", " # 秀出重建圖像\n", " ax = plt.subplot(2, n, i+1+n)\n", " plt.imshow(decoded_imgs_conv[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 應用於圖像去噪 (image denoising)\n", "\n", "讓我們把我們的卷積自動編碼器工作在一個圖像去噪問題。這很簡單:我們將訓練自動編碼器將噪聲數字圖像處理成清晰的數字圖像。\n", "\n", "以下是我們如何生成合成噪聲數字圖像:我們只是應用高斯噪聲矩陣,並在0和1之間剪切圖像。" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.datasets import mnist\n", "import numpy as np\n", "\n", "(x_train, _), (x_test, _) = mnist.load_data()\n", "\n", "x_train = x_train.astype('float32') / 255.\n", "x_test = x_test.astype('float32') / 255.\n", "\n", "x_train = np.reshape(x_train, (len(x_train), 28, 28, 1)) # 使用`channels_first`圖像數據格式\n", "x_test = np.reshape(x_test, (len(x_test), 28, 28, 1)) # 使用`channels_first`圖像數據格式\n", "\n", "noise_factor = 0.5 # 噪點因子\n", "x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) \n", "x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) \n", "\n", "x_train_noisy = np.clip(x_train_noisy, 0., 1.)\n", "x_test_noisy = np.clip(x_test_noisy, 0., 1.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "以下是有噪點的數字圖像:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABHEAAABzCAYAAAAfb55ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJztvWe8FuX1/b2kS1UQQYiCEqwxGkss\nqGisMfau6N+KvaLRBI0xBk2MNRHFgpogilhiwR4LxhiNvWMvNBEwoKAoovfzwt9crL0OM8w5ziHP\n4bO+r/bNNecuM1ebYa+9lqjVajDGGGOMMcYYY4wx//+m2f/6CxhjjDHGGGOMMcaYheOHOMYYY4wx\nxhhjjDFNAD/EMcYYY4wxxhhjjGkC+CGOMcYYY4wxxhhjTBPAD3GMMcYYY4wxxhhjmgB+iGOMMcYY\nY4wxxhjTBPBDHGOMMcYYY4wxxpgmgB/iGGOMMcYYY4wxxjQB/BDHGGOMMcYYY4wxpgnQoj4HL7HE\nErUsXnLJJUPbnDlzcv+uU6dOKf70009zj1trrbVS/NJLL4W2FVZYIcXjx49Pcffu3cNxU6ZMSfEP\nf/jDFL/zzjvhuKK2zp07p3jGjBkpbt68eThu3rx5KV522WVD22effZbiL7/8EmXQ9+/SpUt6rzlz\n5ixR6k0WAl9DpXXr1ilu165daPvvf/9b6v1btmyZ4h/84Aehjc8Xnx/tE127dk3xtGnTUty+fftw\n3OzZs0t9pzZt2qS4Q4cOoY0/e+7cuaFtmWWWSfH06dNLfVZ2zTI++eQTfjm9Vqt1RQU0a9aslvUX\nPq/K0ksvHV5zHyv6TR07dkzxEkvErsfnjPv98ssvH4577rnnct+/zOcC8bd98cUXpd6D+yAAfPvt\ntyn+5ptvSv1dixZxauT5rVarVT4Wuc8D8bd+/vnnue/BY6LseADy5+SF9N8Ejymg/BzHaN/kuVbh\nuYljHbP1+B6VjUW+jmussUZoe+2111Lcp0+f0Pbuu++mmMcR91egeJzyOszX9KuvvgrHFZ3bPHQM\nLLXUUinmvlZ0znVd5Pmcr79ex6K+vO666wIAPvjgA0yfPr3ysaj9ksd+Q/o5EM+drmMTJ05MMX92\n27Ztw3HdunVL8fPPP59inZ9rtdwlPtCzZ88U637uvffeSzH3KyC/L/EeDYhz2kLWgkW+Lvbq1Su8\n/vDDD1PM/b5Hjx7hOG7jc1QfeF/B87yubzwX583DALDqqqumWPdSH3300QI/Fyi/p2HWXHPN8PqV\nV15JcWOsiwqPAd1f5vUx7b98nr/++usGfcfVVlstxTyn6Tnl88XnCohzwsyZM3M/a/XVV0/x66+/\nHtpatWqVYp5D9dzwHKPIvVVlY7F169a1bA7TffeECRNy/y7vN+n9Ud++fVP8xhtvlHoPhfcxvHY3\nZO8KACuuuGKK33///Qa9B6Pr59SpU3OPzdaBWq22SMYik63JGWXPX1HfzkPvEfhesiw6Fy633HIp\n1nFaFl5Di56HMAu5py01Fuv1EIdZeeWVw2t96MJsuummKb777rtzj3vwwQdTzJM1AAwePDjFRx99\ndIoPPPDAcNx5552X4osuuijFO+20Uzjuz3/+c4p/8YtfhLaf//znKb7ttttSrJ2HB9SAAQNCG/8W\n3sgXoRc0e88bbrih1N9/X3ji33jjjUPb9ddfX+o9+LqdffbZoY03Io8++miK77zzznDc3nvvneKh\nQ4emWCeKxx57rNR36t27d4q33HLL0HbPPfek+IMPPghtu+yyS4qHDx9e6rO0n1133XX88kNURPPm\nzdPDxqKJfeuttw6v+SbhyiuvzP27fv36pVhv5saMGZPi/fbbL8UXX3xxOE5vLsrAnwvEDdKzzz5b\n6j30wW7RA8O8v9MbuZdffrnUZzeUvfbaK7zmRfCpp57K/bt11lknxf/85z9Lf17enLyQ/ptYaaWV\nwuuyCzCjffPmm2/OPZZvunijNGnSpHDcq6++WvbjKxuLDK8XQLzBuuCCC0LbrrvumuJ99903xfrQ\nrmjuWWWVVVK87bbbpphvSgHgpptuKvraC0Qf6O2www4pfvLJJ1NcdO11Xbz88stTzN+XbzYBYOzY\nsbnvmc0D6623Xu4x34etttoqvB43blyK69G/AptvvnmKN9lkk9B2yimnpHibbbZJMY9tABg0aFCK\nix44l70xPe6441LMm2kgXje+TkB+X+I9GgAcccQRKV7IWlDpupj1248//jj3uDPPPDO8PvTQQ1PM\n/f60004Lx/H+Zo899mjQd9x5551TzPtmXd94Ls6bh7WN9zMAMGTIkAV+LgBcc801Jb/xfHT/rg/D\nGpv9998/xTqf5vUxHW98zosebhRx4403pviKK65Ise6p+HroQ84tttgixbfffnupz1p77bVDG+/Z\n+aHiCSecEI775S9/mfv+PG6PPPLIysZi27Zt02/s379/aDvxxBNz/y7vN+nDOO73G220UWjjh6+6\nr2d4H8PjryF7VwA499xzU8xrekPheyEAuPTSS3OPzdaEhj6Y/D7o3FX2/I0ePTrF+oA4D703vf/+\n+0v9HaNzIa8HDZ3TeC/24osvlvqbhdzTlhqLS5T9XxsgPpXTJ738v0ZvvfVWqffTCY8XfZ14H3/8\n8RTzwvSb3/wm9/05K+f3v/99aLvssstyP4szffgBgN4k8YXXBxZHHXVUinmx14cIvGnT/92+6667\nUryon6xyphIQs5X4fwE32GCDcFwVEwg/POHvoYv2r3/96xT/4Q9/CG2cScSb/aIHPz/+8Y/Da34K\n/tBDDy3sawOo+0DwX//6V4o//fTT52q1WiV3HkXXkW+IdDHnG2UeU3xTD8TzqQ/Z+KECP4zj8QvE\nh4/rr79+inUsnnrqqSnmLAsg/g8L3xAXwf8LAwB77rnnAr8Tb6IA4JFHHklx0SK0KMbivffem+ID\nDjggtOX9r6z+Hn4Apjf1fJ75fw/1poXnSf5fgpNPPjkcx9kj+jCPM1A4+6Q+XHXVVSnm/0XhByFA\nvG6HH354aOPFfvz48ZWNxbXWWqt23333Aai7OeCbfs3iyJu/irIENttss9CW9+CO/5MCiA9F/v73\nv6e4qJ/rRvsvf/lLijVbiOG1T/8Dgsc+z02aNcEPJnSTlj00uuiiizBhwoRKxmLfvn1r2TnTm3Ne\n4/Th0v/7f/8vxSNGjEixPnjj68THNRT+n+1Zs2blHqfrMz+QKvs/mHxjAsSbvrfffjvF/IAOiHub\nP/7xj6GNM8WeeuqpysbiGmusURs1ahSAmC0B1F0X8uDvqg/9dZ/BHHnkkSnmGw3uIwDwwAMPpJjP\nUX1uHG+99dYUc3/VbIXddtstxbrGH3/88Qt8b56XgHhDov+hwFlZVa2LSy65ZC3bd+t+gNePspmn\nG264YXjND0z4f+CBuAfk/7jR+yS+VieddFKK+T9vgfL/gctolsDpp5+eYr7uQBxH/J8i2k/5PkbH\ngdyvNcoeVedNfqit8N6C/4OAfwMQ9y3aL4syfcqgfaboP9L4IRtneuu+bdiwYSnmNRKI/2nYkKxZ\npaqxuOyyy9ay+YW/PxCTDjh5AogPSnnvpnD2Pj+gBeJ9zBlnnJHiq6++OhzHn33wwQenWM8j/+ef\n7lEbAid7AEC2B1SKMs41WUX+46HUWHRNHGOMMcYYY4wxxpgmgB/iGGOMMcYYY4wxxjQB/BDHGGOM\nMcYYY4wxpglQr5o4Xbt2rWU1CFSXxvpa1s4rXF9D6wewXl5r3XDhz6ICmFz4q6i4EOtYuQAyELWX\nXI+gPpXC+byyfpbrkACxUFXR76pK49ihQ4daVjCxPoVQGda3FmlbtRAZ68u53s+PfvSjcJwWTS0D\na/2Bunr4DK29cNBBB6V45MiRoY01n6w7/+tf/1rv7/d/VKY37t69ey3TkKrGmYvpsQ4UqFvfJoO1\npEBxIUUmr58rXAtK6wax7lk/lzXG7B7QEK25onp7rlmyKGrirL322rWs1pK6UxWdV9b0c0V8deXS\n+ltl4HEJxCKv6paTBxe9BWLRQR47PPaAWKT+b3/7W6nPUrieltaPYW32G2+8UdlY7NSpUy37jerC\noTUMGC4GyLUx1AmQXUz0GvN6x/O5ulPxXMwFvN98881wHNcYKiq2yedW1xEuEqvFU7k/la0zpo4v\nWa2BJ554Ap9++mnl9al03eKinDo+GK7jU+SMpJSdQ8sex3OC1oXiWkms6Vc9P+/NdM/C6yTXdtD+\nooWZGe4Xhx56aGVjsWfPnrVjjjkGQKwlAsTC3OoGxL9x4MCBKS4qKq51N9hwg4v/azFSrgHHBaV1\nz8vuO+p6V3Yt5IK2uhfgmkh33HFHirX+B88x6rDHhdyrWhfbtGmTauLo/MT1DfV3cw0v7s9Zf8jg\n66uUdTXKQ++neHxwAWQgFgjn2oK6d+UaTVqLlPdOXA9J62TxvMt1rIC47p599tmVjcVWrVrVspof\nWmfskksuSbHWouRaRFyjT/cEXPNU4cLGkydPTrEWNOc5UIsjM3zvp/d97ELFY0zrkf3nP//JfX+m\naG3l/r/99tuHtqxm6Jdffolvvvmm8nVRaxJxwWgtHs3Hlq29qbW4eL4uMkRifvrTn6aY51mgfCF6\ndqfWvRjv53Qc8ffneff8888Px7GhQFGhargmjjHGGGOMMcYYY8zigx/iGGOMMcYYY4wxxjQBGmwx\nzqlOAHD99denWC21WC7DlqtFtn1qcc2pn5xerVannPa23377pZjT95RTTjklvGYra04f1VRGThlT\niU1euvPKK68cXpe1Y28MW+Mi6zO1c2a5EltkakoZp4o1FLY15hRlTW3jtDe1eOfrzX+n14VtAFWS\n9corr6SYzwfb5wHAlVdemWK1DpT+WVmq6lJLLVXL0i45dVtRm0P+TZzyz5bWQLRFVStPloGwvEPt\n5VkixFIDtg5UOMUYiDbZLLV64YUXwnGcCqvjmW1Wiyiy7c2sEKdMmYK5c+dWPhZVTsXzTpG9JaNz\nkMqVyrDPPvuE13w9eIxpWjL3M14LGopamPfs2TPFgwYNatB7sk3lkCFDGsVK9dhjjw1tQ4cOzf27\nvJTbIhtxtjEGYoo+H6fvwfB8seOOO+Ye97+Ex4NKdjOp2GOPPYaZM2dWMha7du1ay6R4vK4AMQX8\nd7/7XWhji1CWsfKaAESZmlqTPvfccyned999U7zuuuuG43heYykaSyUUlTjx9+DveMQRR+S+B0s9\ngChx5c9eYYUVwnHjx49Pse6dJk6cyC8rG4vNmjWrZZIYlRTy+dS5ktexVVZZJcV6rf71r3+luKzF\n9UJsZHP/nSUhHANRysXyP57jgDjHFMHS8b333ju08f5J+1Njr4u8FwSANm3apJhlmwqfB97PA1E2\nXQVFMke+R1DJCVsjs2xIYTnbLbfcEtp438Pzj0p56kGjrIv1geXDbNner1+/cBzL3fS8591zNpR3\n3nknxVou5Nprr00xS5U/+eSTcBxfR51Tf/vb36aY5WS63vM9mu7VmMa4X1R4v/ynP/0ptPG4LTr/\n/Hv0+rJUkOHzqO9fJGMeMGBAilWe+o9//CPFPP+rBJLnxhtuuCH3e/F30jG75557plglgdx/YDmV\nMcYYY4wxxhhjzOKDH+IYY4wxxhhjjDHGNAH8EMcYY4wxxhhjjDGmCVCvmjht27atZXoxtYVmjd+k\nSZNKvZ9a/LKGWa2Gt9tuuxSvv/76KRZtdbC3ZWs+tRtn63CFbdy4/kdRDZmGwvpKtuAG5n//OXPm\nNIplnMK6RrVnqwLua2Ix2qD3e++991KsGne2q+dzfPzxx4fj2JKYrQiBWIOA64Go/pOt/rTmEWsv\nb7/99kptjTfeeGMAdesNZDp1IGpt68M555yTYrVqZdjWUq3D2Y6XNf1aN0itVRnuM2wRyNamQLQX\nLap/VdamV+cL1rtWpTfu3LlzLaspwXp2INY0uf/++0Nb2d+QN48BQJcuXVKs2m1miy22SDHP8UXr\nRtF3Yh27Wlby2Bk7dmxo4/PB10L16fWgsrG45JJL1rIaRieddFJo4zocP/nJT3Lfg2vAsf5eUftr\ntjTlPstW0gBwwgknpLhZs/n/d8P1TRS9jkU2q0zR3MHzRdFn87zJ8xkw//xMmDABX375ZeXrotbg\n0b6YB9eP0ppdXP9Cxw7XfeN9T9naHXp+uO7NqFGjQhvXGOP9TH32Mmz1y/bE3K+AuE9Te12u/TNq\n1KjKxmK3bt1qWd0CnVMPO+ywFHM9ByDWirvqqqtSvMwyy4Tj+PUbb7xR6jupNTLXK+FzpPXgDjnk\nkBRrvZzPP/88xe3atSv1PRSuFcN7Hb2OWncyj8aow6E27rzH4NohQBy3//73v1OsVuF5vxuIY4fr\n/2j9C66vUTVquc318bQGJdcm5d+ltUG47w8fPjy0yb6/srHYq1ev2uDBgwHUrbHJ34fHABDnLK4Z\nqnvrhsB7IiCOTb6H0JopXF9QxzPPgcyGG24YXnNtQ55jAODwww9PMc+NuhZx7TLtg9xHG2Ms8h4C\niPdfOj89/fTTKV5uueVSrPUweX/EteGUPMt4IO4xuGaW3lfwfoZrmwHAz372sxRrLbWy8H0N19jh\nuQiI+yhFaku6Jo4xxhhjjDHGGGPM4oIf4hhjjDHGGGOMMcY0Aeolp1pvvfVqWVq+ylI4PUxtGTn1\nWlOL8hg4cGB4zenmbKtXZKXKFNmZa0olpzevtNJKC/wbIKa6cWoZENNuOU2M7bkBYNttt02x2khy\n2lhjpMepreh9992XYrYHLUJTVR977LEUb7311qGNr8EzzzyTYrazBmL6utpzMueee26Ks7TNBcHn\nVVPl1La8DBdddFF4zddUr6+kCy4S+0aWp7FsTSkr4WDLRwCYOXNmijn9n8cKAPTv3z/FnIqptqGc\nJnvppZeGNk7FZGkYS7WAeF05/RgA3n333RSzZaDaN66++uopVulLY6Sq9u7du5ZZdWu/4XGUZ0lb\nH4qsqTlFXWVkLI3l1PaHH344HMdW1WrRXCSvykPlF2ypzFatLCcC4jzAVo4AMH369BQ/+uijjTIW\niyS322yzTWj71a9+lWKWRDY0bXyTTTZJMacHA1EOWgTLllXGlwenggPAF198kWKVrQwbNmyB78Ey\nKyBKrbQ/8Zxd1Vhcaqmlatl8deedd4Y27r8qr+E+xai1M1vIK3mSxUwum8F7J5YF6BrM8zXbzgNx\nDWZJQ9E6UZbrr78+vGZZ3UKkR40yFnv27BnaimT+RVbQefA6CMTz/sgjj6RYxyLDex2VTjSEX//6\n1+H1H/7wh9xjDz744BTzOq7vwfOW9idek6saiy1btqxlY/6zzz4LbbxnGTduXGjjtaBoP8P7El5n\nFZa/qDQmD5ZRKGr/zmtcWXly27ZtQxvLNjNpNlD3GvI8LDbGuk+vbCyuvfbatex8aPkKlVAxLGXi\neU5lTFXA83neXA7Eufi4444LbbvvvnuK+b5J96H8d6NHjw5tPBfvt99+KdayJUV7qaytVqstEotx\nlv2ptJHhsaPXnccw7/EUvtfT9Y4tvF977bUUq4SvrPy1arT8Bpcq6dWrV2iTcWI5lTHGGGOMMcYY\nY8zigh/iGGOMMcYYY4wxxjQB6iWn4tQqdggBYho+O58AsVJ63759U6wyAZa9aDp9Hrfeemt4zQ42\nnJ7K8h0gVvfX1GeuSt+vX78Uq8SI06AzWcSC4NTOos/StPQHH3wQwHeyqq+++qry9DhOTQViOvSs\nWbNCG6e333zzzSnWavlc9ZvPMRDT80eMGJFiTWPs2LFjillOpQ5UV199dYo1FZn7GZ9jfm8gOkuV\nrUqusghO27722mtDm6Q/LhI5FV8TlkcAMW2ez5nKk/i1uhnkwQ4sQExf5/TR+siD8pyYVAp45ZVX\nln7PDJV9snOLurVkEsuLL74YEyZMqHwsaposS4F4vNWHCy+8MMUnn3xyaONU06I0U05dbdmyZYp1\nrLz55pspVvkLj1tO827RokXu5yosdeOUWZVMsMyX5UoLoLKx2KZNm1rmEKTp7jz+NK32jjvuSDG7\n5Ck8Z7EDCVB3zcjQ/qsyrwyVBy255JIpVmcYPu8sp1MXpVdffTX3e/Cc0KpVqxSzdAGIzpWalv76\n66+neFGkjbOz2/777x/aeOywZFTdwYoocpHLY5999kmxypF5TdP9HcsNt9xyyxSrPJLT13faaafQ\nxteKZafZfiXjrLPOWmCs7z948ODKxuLKK69cu/zyywHUlXPzfkf7Nu9bOOWfxwMQ5z2V4ev6l6Hy\nFV7/OJ1e0/9ZYsvuOECcU9mxTvfeLCVWeD/GcxFLbYG4NnGfAebLQO+++25Mnz69krG48sor1zLX\nQV2jGd1zs2SU1yMujwDEvl4fyR3D5RNYEseOYlXx97//Pbdtt912SzGfKy6NUE8qG4utWrWqZU48\nReeVnUWBYnfRPPQc8XlhimS79bkXZlgSxO+nUihG10x2VeJ7F72/KpJTZfLIu+66q7KxyOuiuiCO\nHDkyxewEDeT3P5Vj7rzzzinWfsBSzbISSEbl9CxV6tq1a2hjJ8PHH388xZtuumnu+xeVmSiS5/Kz\nEy1fwOd4woQJllMZY4wxxhhjjDHGLC74IY4xxhhjjDHGGGNME8APcYwxxhhjjDHGGGOaAPWqibP8\n8svXTjrpJAB1ayxk/w58VzeiDD/96U/Da7bgUw31BhtskGLWGt59993huIZoQYvsx1mPz9bNQNRu\nsi0eAHz00UcpZq3clClTwnE33nhjitlaDpivv95oo43w3HPPVaJxbNasWS2rRaCaQdY4KlwPg2sj\nqB0ua/peeuml0MZ1GdhSV/WybIfItXlU3816yldeeSW0NWs2//lkUR9ne8Dbbrst9zi2YWb95MIQ\nG89GqYmj+k6u7aLwNeB6FXoNWCteND4YPY6t2HW+yOOoo44Kr7P6BgDw9NNPp1jnB65TpN9PtbZl\n4JocwPzaTFOmTGmU+lQK20WzZTMQ66CwdbhqsLm2A1vIKly/g2vK1AeuP8G1QYBYF2aHHXZIMdtq\nAnXnozIUacu5/wHAoEGD+GVlY7FHjx61gQMHAqhr5c01Kj755JPc9+D1Q4/jNWO55ZYLbWyru+uu\nu6ZY63U0xOZd61FwPQGuA6B2tlxfQy2O11xzzRRfdtllKT7mmGPCcdxfeQ5VGqMmjtYV4euR1erI\nKDteuLZbfWqCNQS+bvfee29o4xo27du3T7Gurbx/UXtl1vjzXKR9n+u4aH08toVFhWOxQ4cOtXXW\nWQdA3foLzCqrrBJes30718tRa2Tec2gtIrZAnjp1aor52gPl65Fx/SuuIQjEWmVcN4NrcgBxTVZr\nXt6/nnbaaSnWujdse6/1kQ488EAA380377zzTiVjsXXr1rVsf8i1Z+rDZpttlmLtBzxPcr1EhddT\nravD+xTeNx9wwAG57zdmzJjw+r///W+Ks/O4IHhN0/WO4T3vSiutFNq4Thm/3wKodI+arTuTJ08O\nbbqOMTyn8nyr54/3g7///e/1s1PMtfH4b4BYH6noPoH3Uvoe3Ie4Fo/Wgxs2bFiKud4LENd47kM6\nf+fdmwJxDq9qXWzRokUtq/2iNVS5bq3W3uR6W0Xwe3Lt2IbC9VW13h/X0dTac/ya78N1PuX7W645\nCcSauVxfdoUVVgjHFc0RgmviGGOMMcYYY4wxxiwu+CGOMcYYY4wxxhhjTBOgXnKqDh061DJ7LLZk\nBGL6lKZW5aUSP/nkk+E4TdtlOA2bpTOcHgxESQxLDTTlm6U+ah3O6amcEszSGyCmmf7sZz8Lbaee\nemqK1Vq2IVSVHtezZ89alrrOKYJAPCdqhV4FnOLJabIsxQPy5XjaVz/99NMUv/XWW6GNUxfZ9rtI\nVqDyPk2bzIPTktdaa63Qxjb0WEQW40zRb2L71Dlz5uS+h8p0ODWXUet1tZzNg8czpxgDQCZTAeK4\nHDp0aDiO55jVVlsttLEUjiU1PH71e7CcAJifMl1l2jhfw3POOSe0sRWw9tk863C1gOTfk1l9ZrDF\nL7+HWqTy2OE5QeVxbEPPstgi1Lqer3URnCqvlqF6TRleD6644opFPhaV4447LsXPPPNMitVum9P/\n2Y4aiH2BJUmaXi7WlSnWFPUdd9wx97M45XjddddNsabKs1xErwfLb3XOzkP3E9m89eijj2LGjBmV\njMUuXbrUMmvuIlmxyqZ5XPFvVWtqTrPXvRNbjrJ9KsuwgXzJuqaNczq4Wp2zFIrHn84/LOFs27Yt\nGpnKxuLyyy9fy+Ym3VcUwfJDljEpLEVRaR2Pj3bt2qW4bHmB+lB2f1m0v2c56zXXXFPqc3W+zWy+\nr7zySkyaNKkyCUcmqdcxkJUCAOrKwxiWyehY3HjjjXP/jucktnougucLlWmwxEn7Ae9Z2KJZ50Xe\nV8l+MsASL97/Klo2QO5rKhuLq666ai2bY7baaqvQlpWKWBgtWrRI8bx58xr0PXgM8H0kEPc3PH+r\n1Jsltry+AcDs2bNTvO+++6ZYZTQs61J5aR76WTyfb7vttrl/1xgy4ypg+26g2MKb4ZIRuh/g/WDn\nzp1TnGczD9Rdg9kunO93br755nDcXnvtlWKW1gKxlAs/Dzn99NPDcTyvdOrUKbRxuYHtttvOcipj\njDHGGGOMMcaYxQU/xDHGGGOMMcYYY4xpAvghjjHGGGOMMcYYY0wToF41ccrq41588cXwmjXfrLlX\n+0C2B1Mbzt/97ncpznS4C+ORRx5JsdasYX0l6y6LeOGFF8JrrsejWkvWTrNOVusMsOYxz/rvjjvu\nwLRp0yrROHbq1KnWr18/AMV27HfddVd4zZrpO++8M/fvbrrpphTvs88+oY21jGyVOHbs2HAc13Fh\nGzuF7fe47onC1nJaB4gtUlU7zbrVHj16pFhrQHANkCFDhuR+DzRSTRyubwIAV111VYrZ+hkArr76\n6hSzXvvbb7/N/Sy2gweilpttAblGURFqS//mm2+mWK3DedwX8Zvf/CbFWg+E4RpXbCsLRC069xng\nO81/RpX2jXnaf7ZFZc0vEC28WSOt51/1tnnwGqCWivz+PMbUoreoJhrX3lCtOcPXhmt3ALFWSBFc\nB0jnZKFRxiLr3oFY64DnEKAncm+cAAAgAElEQVTuPJIH23RrbTe2BuaaRVrjgmtoFNUF47VVLaN5\nHpg4cWKK1ZL4oYceKvVZXLNE15TMJhoA/vGPf4Q27udVjcVll122tvfeewMotn3W38N1v7hN64hx\nXSPuE0Cso8ZWw2w7C8TzUFSvjWsN6nvwNeS1MPvtGWxdn+0XMngP11CkpkujjEWd/7jfaD2JBx54\nIMVse8tzLRDnSq5p9X+fneIbbrghxQMGDAjH8f6G9xwbbbRROI77iY4xrvnC8PwHxH6oluhsg9u7\nd+8U69zL+3fd2zNVjcUVVlihltUo0vPP6L6E56Q77rgj9zjeg2tdHa67t/rqq+d+Ntc+YWt5rtkD\nAOedd16Kue4GEPeKo0ePXuB3B+I+97XXXsv9TmXR8/Hcc8+luFu3bo1Sn+rEE08MbVyXberUqaGN\nrw/XE+FrA8RzoXUa+b6Kz7PaQj///PMpLqqxxGu1ruMM9xmtPcR7Hx2nvE/nv9Nahrx31rouTFVj\ncZlllqll+74RI0aENr5OWq+I7+3573bZZZfSn533bEJrlnE9M2annXYKr3nvpHMtw2shj8v6wGvB\nwQcfHNp4rlWrecE1cYwxxhhjjDHGGGMWF/wQxxhjjDHGGGOMMaYJ0GA5laY/s92WWulx2nRZCUcR\n/P7jxo0LbZz+VCTv4BQnTU1lyQnLBNQS97PPPktxUdo4p/apDIHRc5pJRIYPH47JkydXbhmnaZt7\n7LFHijU9ji1lWd6h6bX7779/itUumtP9WbrSsmXLcBynchf1T5beaDqlpjJ+X/LsXRWVoXHa+Btv\nvNEoaePap1iepJS1FS+Cr0lRv2c4lZTHDVA+ZbHos7hvqc0nW0fOmjUrxZmUKePdd99NcZ8+fUJb\nln7/5JNP4tNPP618LKpdIc8FKnVgGSSfS7ZhBICf//znKdZUWLZ6ZNlRkQSrSL7IEgSeR4AoC+C+\no3JalpBpCuqGG26YYrXgzkMtgI8//nh+2ShjsUhyyzIKIKbeF6VGs+3kjBkzQhvLptiKVscK222W\ntTxWOez48eNTzNK3l19+ORzH0iE9H3mpzwpf/+uuuy60ZZbaM2fOxNdff13JWFxvvfVq2byh443l\nSbfcckto435ZFp6DgDiWeAyoFXL79u1TzDIupWjN5DmPrXEV3uvo+sI2x3w9VSbGv+uee+4JbTyX\nbL/99o0yFsU6OewJiuZbRs8l71W+/vpr/ewF/p1Kgnh+ZLmE2gmXlWmznFrlljyv6HhmqfJHH32U\nYpYmK3pOM8nCb3/7W7z//vuVjMWOHTvWNthgAwBx7AHF1szHHntsinlPMW3atNKfzdeNpTe63q22\n2mop5r4ka0wo46BS5VtvvTXFvFapzJt/19ChQ3O/O+9ZeC8DRPmg3u+wROf111+vbCyuueaatWxc\n6X6qCL4Gm2++eYo7duwYjrvxxhtTzHMjEGXNLGkrolevXinWfrbffvulmCXmQJwPWSam9zVFMl2e\nB1iuVSRfVLIyAsOGDcOkSZMq36OuscYaoa2stI/3lEX35GrJfvTRR6eYZeNF8PrMMmUglplQWd0m\nm2ySYp4zeQ8NxHWL7wmBOI54bdD5f6uttkoxS88XgOVUxhhjjDHGGGOMMYsLfohjjDHGGGOMMcYY\n0wSol5xqySWXrGVp8ypf4VRadejI0p+BmNbHFfwXBn9PTlHkyvlATBUfNmxYio866qhwnLgj5H4u\nywRUasCyDU1f5+/L6XbqxMQpauqOxO9fVbXxIoexIpkMp31xOphKBDi9fyHuMImePXuG1+zmwOmU\n6iz1+uuvp7h///6578/fSVPzuZo8S+eA6FDEVfLVnYNT7DjFE4jnqkuXLpWlqjZr1qyWuZnttdde\noY3dEjQdmauyc/V2lYExKndSuUEeZWVXfJymj15yySUpZgkBp38vDE7FbNu2bYoXUhk+sPzyywP4\nzu1l7ty5jT4WGXasAaJjGzty6BhgKY86do0cOTLFLIFUWCrDqfTsSqaoTI3lI+x8op/LEi9OpQWA\nzp07p/icc84p9dkqW+Hz+Le//a1SCUfz5s0B1JWhMjpubr755hRzur7Kk3g+ZKcqIMqkWL7avXv3\ncByn7nO/0D7D8/xLL720gF/xHZdeemmKOd0fiJIgnStZ/sfzvsqU2ElHHToyZ8M33ngDn3/+eeVj\n8fbbbw9tvC7r3obdNljey+41QHQj0b0Tw3OhOgvyteHjuA8AwN///vfc92dpFLu9FO0DWaYHxN9S\nn3m4gMrGYuvWrWuZHEFdlhh20QSi9IHnuaLzwpJCIDoYstOo7vl4X1ckL+T0fN0j8XjmuZGljEBd\nyTzDe3GWHLFjT32oao/avXv3WrY2qOyBUUkh7/1ZcqyyRJYrqfSczznvWYocd/l76Jhl9B6E70/K\nytJVvsnSYpYsqvPhwIEDS70/GklmrDI/Hlc6xlj+xPt13ksD8/dkQN0xNmjQoBQvt9xyKVZZZx7q\nFMxuugcccEBo23PPPVPM6yK7IwPxvlUdF/nv2PVOZeW8dqt0L5P1jR07FjNnzmz0PSq72+k5Of/8\n81PMpQ70O7M0Td2SWcrEeyKVSeVJ7fW+iPdbLJ8C4r5q0003TbE6/3I/VtkjzzNly6vwsxGgjqze\ncipjjDHGGGOMMcaYxQU/xDHGGGOMMcYYY4xpAvghjjHGGGOMMcYYY0wToEV9Dv7yyy9z9dysFWft\nGRC1aVOnTs19f9Ypq0X00ksvneKZM2emWOsvsJ6dbayVIqszrpNSZKPGFrGHH354aGMr9SJdddH7\ns61xVTRr1izVBamPxbvqUTOefvrp8Hr77bev93di+z4g1ihiPatqTLkej9ZG+uSTTxb4ndTSbZ11\n1kkxW9ABdevnZIwZMya85poQWvdC6xxVRa1WSxbhXAMHADJ7TqBuPRXWnfbt2zfFXCsGiHUoTj75\n5AZ9xzxd6Icffpj7N/pbuCaVtuVxxRVXhNesey9rN6lk+tyiehP1pVWrVql2Cc9vQKxHor+b9cFc\n70f13vya6+gAxZa1DGvLuQ4O9zF9f61Fw32pd+/eKS6aFy+//PLcNq47w+MXiGNd14ay/achZPax\n2ufXXXfdFLN2Hohabj7PatXM2nC1V+e18LHHHiv1XbkmB8cK14cA4jrOc4fWkOHrzzVwgLhO8nyr\ntX74PbTOUFGtk4byox/9KI1t/d1F5FnAqrU628t26dIltHEf4XoIulZxDbg8O+uFwXWT+O+45hsQ\nLY+19gjXjOF9mtZ3ueCCC1K81FJLhTbu+1qL7vvQsmXLZNGr1ugPPPBAitVum+eo1q1bp1jXC55v\ntV4L/x33ba71BeRbeHNtGyDuQ9kOHKi7XmSoTS+z2Wabhddcl2PcuHEp1vO23XbbpbjKa5XHxx9/\nXFgLJ0NrNXGNjvHjx6dY92Rct4atwoFoA851iNZbL5am4H7B34PrRQHfzSsZOld89dVXKc72ckDd\nPSPX4dB5klEbdIYtuGfPnh3auL7SHnvskfse3we1eR8+fHiKR40alft3XBNG6zby/KVrJtd10nuz\nMuhege8Xtb4g9zuuBaN1b/Q1w7Wr2J5abcq5Ns8ZZ5wR2p555hkA9VsPvg/cF7VOzWGHHZZiXhd0\nf8Q1cXQsMkX1+Xiu6NevX4p13WKk9kyovcnnT2tLFa27Zeta8Vxb9m+KcCaOMcYYY4wxxhhjTBPA\nD3GMMcYYY4wxxhhjmgD1shhfaaWVameffTaAutahmi6bB1tqTZ8+Pfc4tutc0Osyf1f2b9SKjNPZ\niuQTbEWm6VkMy3LUHpflLnlptkB19o0rrrhiLbNW5pRToH6Wyxl//etfw2u2TVQJR2aBB8QU+WOO\nOSYcx+nlnObMqXcAcOKJJ5b6jpzyrSmnaiVYhhkzZoTXeanNC6BR7BtPPfXU0MZytCLmzp2bYk3h\n5TS/IttktstjyQAQ08N//OMfp/jRRx/NfT9NL8yzXqyCbt26hdcff/xx7rFZ+v8rr7yC2bNnN7p9\nI6cR58n6gCgdO/LII3OPK5rnWXakqdYM93MdA2z3OWHChNz3YFQypRasDKe7cqqzyiJY1styBCDK\nUdBIY1Hh+UblbixRVelMHkWWuJzWzRbdSp6kScls0zNYYsOyAZ7zgdgPWWICxJT4KmRRVa2L6623\nXi2TlrG0DYjWxQr/Vh5HnFYPAO+//36KNW2c0/PZpprli0AcA7zfeuKJJ8JxRdeU9ym8nrKkQlF7\na57LWZ6rqf9s46p2rCwlQSONRZ3zWCakEnWWuLGEV9PpP//88xSr5EKly3nwHMsyl1tuuSUcp/JL\nhksW8P61ivR8lWyqrXUeVY1Fvob77rtvaCuS3pSF+wVL7IDYR7iPaokItnrme6Grr746HMd7LL1n\n4nIMmaz6+8ASZ917829eSB9ZJOsiSwxZwgYA/fv3TzHLaFSyw/d3KjdkWGbM763w/QmXcQDiPktt\nv/k6TpkyJcV33nlnOI5lfEXSqiJ69eqV4qKyBFWNxebNm9eyOUrvEXgPwPdpAPDuu++muE+fPrnv\nz+OqaL7bYostUqz3D7zXGTFiRO57cL/n6wTEe4Fdd901xSoVz3u/+sD3o7vttlto473HxRdfbItx\nY4wxxhhjjDHGmMUFP8QxxhhjjDHGGGOMaQLUy53q/fffxwEHHACgbmV4TrnUdMy8lPKDDjooHMdu\nSSrt4VR7Tn3SlKY8lxROWwWiFEpT1LmK/JlnnplilV1xajKnGAPRQYZTiTVFusgxJUtjLnL0qi8f\nfPBBnXTAjJVWWinF7733XmhjGRyntmm6q15T5qOPPkoxu3dpGjGnNbK0Ta9hWdj9StK4AxdddFF4\nza5M/H1ZOgJEyY86onFbY6GSP5blcfolEKvGcxroSSedFI7j9FFNOR46dGiK2R3n7bffDsexE8rY\nsWNzv//EiRNz2zjVlueYLbfcMhzH6bkq4chLXVX5FKeE7rLLLqGtSKLQUJo3b45OnToBqCv9PP74\n41PMLmxAdIRj6aHCVfCL4JRlTX3l/nPuueemmNNlgThPKtzneF48+uijw3HsdqDOC9zPeH5Whz2e\nt9RFgueqIulqfenbt2+ShmXrY8bGG2+cYpVT5Umo+NoD0XFLnZM47btjx46lvu8///nPFOs54vPC\nayQQ5ZEsodI1mK+duhXyby6b4t9QF4j68N5776X+odKfopR+dcLLY8UVV8xt4/HM+wNdZ0444YQU\n835I5yaer9lZCIhzKEuKis7ppEmTcl+zq4rKm3lfpesuS7T0/atCxwM7N6lDGKN7NIbHhzr88R5B\n5wGGJUE83+r+kr+vSifyJFS63rNkUed23rPydWS3TSCeR3Wba2zUYbAsvCdSyUJ95poMXd9YusrO\nqLzWAcA111yTYh3PDMsj9fupdJlhySJLG1Xiz3Oayt7ZPejuu+/O/az60qdPn+QcpOu5ri0Mz20s\nlVFHYd4zqYscuzgVSahY9pqVCgHq9nOW32gJCb6uXKJCZYgNlVAxfD+k3HDDDQDqnuvvQ7du3ZL8\nmvsyEPsRO2gCdeV8GboOsBxZHZD5fLGESveePJcXuUfx/YlK91lCW1ZCxffLQN175gyVofH35/EL\n1JVGl8GZOMYYY4wxxhhjjDFNAD/EMcYYY4wxxhhjjGkC+CGOMcYYY4wxxhhjTBOgXhbjRZZxVcBa\nfbXoHDNmzPd67wEDBoTXmX4QAB555JHQxvaBrFVl3TAQrchYrw5EHf1rr72WYtVis65QNdysy2wM\n+0bW8gLR+kz105tttlmK+Tc888wz4TiuV6S1kVq0mF+Cia0XVWvJNYC4bgnrkIFiO2Rm8803T7HW\nZtlhhx1SrHpg1vizvWsRa6yxRnjNNSd22223RWLfeNNNN6WY6wEBdWuIZDS07gT3Ga1jxTV3nnvu\nudz3OO2001Ks9uhsAc86Zx6/AHDttdem+OGHH17Y1wZQt/YF1y8pOh+NMRaLuPfee8NrrTOSoXW5\neA4q4pBDDkmx1g9QW9Q8uJ5QUQ0vrqWmtZaK9Mz7779/irm2DNfKUS677LLw+phjjuGXjTIW2UYU\niPV79Dquv/76C3w/tdrk66p1R7jOT0PqGbD9KhDrB+iaOXLkyAW+h9YjYJt3hWtGDB8+PMUXXHBB\nOI7rkWnNrB/84AcAgPXWWw/PPvtsJWNx+eWXr2V1wfizgTjH7b777lV8XKCs1TzbW7dt2zbFOlfz\n2NG6U2oHn1FW369w/QCueQcAxx13XIrVRliobCx26NChlu1ruGYhENdm3pMpRxxxRIp1LSmql/Oj\nH/0oxbyW8B4DAHbaaacU81jX2oCM1k7kfSnX3dP+w+sp9x8g2jJzbSeuQwIAq6++eop1/5DVxxs0\naBDefvvtRbouKl27dk3xtGnTco/j2m68bwBi3Yz7778/xVpbKm+t2mijjcJxPMf/5S9/yf1OfN20\nDtDo0aNTfPHFF+e+B6M1cYrq6vB912abbVbZWGzVqlUtq6WpcwPXdFJ79ay+HADMmzcvxdovuTZN\n0X61efPmue/xy1/+MsXcz7UGFdd1LZo7/vznP6dY7wnZvn7y5Mmhja2li+zSGa1ttOqqq6a4Mfao\nWoey7D67CK6lwzWdgDiuuM4P1x4D4vjgOUDryxQ96+B58tRTT00x9w+g7j6FKarDxfC+XPfsvDaM\nGTPGFuPGGGOMMcYYY4wxiwt+iGOMMcYYY4wxxhjTBGiwnEqlOJy2qymKKqvJ0NRwtnhj+Q4AfPHF\nFynm1F+1/OQUyLJyAj0HbH+nKbl5cCotALz66qspZvtmTYdkWYimOmdWj4MHD8a7775bSXpc9+7d\nawceeCCAupbdbKOosqCiFEKG0x85fRCIafdsNcfXHYgyF7bZ1HRglrOpLRxbmLIleo8ePcJxbB2o\nNrBl0xqLrHLZGm+LLbZYJHKqfv36pbjIsm7bbbdNsUpbisj7vUV2xfw3mpLet2/fUp/LY4zHV0Ph\n1EXgO3lGxqxZs0JbNk6nTZuGuXPnVjIWOfX/9ddfD20bbLBBijXNlNM9OQ107733DsdxmqnOcfya\nrTp1fuLzwFJETRdlO/kieGxr6jmPYR7bQJTyFNn38u/S8cx2u2gkOdVbb70V2tQSnGFbS76Oem6v\nu+66FKs0I0tXB6IMWGWjvF6zBFbT7Fm2lmcTCgB33XVXinfeeefQxmnp2nfZAvnGG29MMUsvAWCP\nPfZIsfbdbE2YMmVKZWORr6GuM+3atcv9O7bH5jWnCLaFB+K6yOn+ak3KkgSWgOv8yZIX3R8xLMNh\n6RNQLAvIk062bt06HMdrvNrtXnnllfwdF8m6yOuTpsWrfXEevJfYZZddQhv/Xp6jFd5bsWz9k08+\nCcdl9sxAXA+AOK5YXsvXFKh7XfPYZ599Uvz++++Htueffz7FapPNsrtFLTNWyu4PeD5p2bJlaGPp\nPVscZ7KxDL7fYemc9iOWvLBkDYjnlcdDkTRI91i8L+f7LFnrgmxF53VZuxtlLKoFta4LDFvc83nX\nPQHLVxReW1iqpvemZeH+xLIlIM6xvC7y+q6onXaRjLYsmV33bbfdhqlTp1YyFtu3b19bc801AQAH\nH3xwaGPZKd+nKZn8Gagrx+QSCSotGjFiRKnvyOeZ7y1YJggU29oPHjw4xX/4wx9yjyuSfzUCllMZ\nY4wxxhhjjDHGLC74IY4xxhhjjDHGGGNME8APcYwxxhhjjDHGGGOaAA2uiXPooYeGNrWJzoPrTqg9\ndVlb46IaJHmwFSsQ7WfnzJkT2rhWTKdOnVKs1n9aN6MMqosdMmRIitVKlWkMvbFq7lkXrfWEWL9b\nFq1zwJpx5oUXXgivWYvM9tMK225mdX4Whmpz2fpaayHw64MOOijFagXKx6lu92c/+1mKjzvuuEWi\n/b/jjjtSrPpn1ntyPSa1omVtt/ZZfn+uKcR2ygrXtFJdN38n1QbzsWyHrLUeyta/Yt281kVgG9G8\nOhhz5szBN998U8lY7N27d01t2TPY9lu1waeffnqKf/3rX6eYa+Doe6i1Jl9ftqvVWg5cq4Xts1Xv\nzXOjWk6zdppr4qgFONcn0PoQrH/n+hBal4LtSnW+5loUTz311CIZi0ymWc948sknU1zUf/lc6zrG\nmnK+Vmy/CsQ6QlwHR+uW6Xkvg1qlP/vssynWfpenc9fryHOMkq3/VVqMN2vWrJbVdOFzWhXdunVL\n8ccffxzauA4H1zJ6+eWXw3G8VnENAl0j+fw3lMMPPzzFV111Ve5xefUIgFgjiGsHLYBGGYtHHXVU\naOP1Q2uQ8XrC44PrOwHA9OnTU1z2PGvtDq55xfU1eB4GYp26jh07hra8fW///v3Da7ai1xoOXE+L\nf1cRWpuH9xdV7VFbtWpVy8ZL0Z5Y6yxxTZhzzjknxbxeArHelu5rucYPo9dw3XXXTTH3bV4jgVhT\nk2sEAsDdd9+dYr6n0VqMvDbo98jrB2qNfP755y/wuAXQKGNRx39R/TBeC3gd0PsHrsFVn/tYZtSo\nUSnmOUBr2/F34lpVQLxH5HtHvp8CYr+77bbbcr/TySefnGLeXwPxPGrtKrZFr2ostmvXrpbtmZ9+\n+unQxnsMrvsK5Fvaa301rr2m15Bt6O+8884U854XiNeK51OtuctzqJ47rrPL961c7wqINU7LPnso\nQmvNSi1a18QxxhhjjDHGGGOMWVzwQxxjjDHGGGOMMcaYJkCD5VT6d4MGDUqx2tQyf/nLX1J8/PHH\nhzaWOqjFNUsFOGXxwQcfDMdxChv/jVqgceqZwmlSnDbJ6cxAsayLU7K6dOmSYrYJBYDhw4en+LDD\nDgttu+++OwDg4YcfxowZMypJj2vdunUts3zT1NFtttkmxXpeG4Km0rP8iWVGarfH6a+cpqf2umxt\nO3v27NDGEg5Oq1PrSU7N03Twhsj2NIXypptu4peLRMLB6YWc6gnEtP4i8mxkFbbL1b7Nn8XXUdP/\neTyrnOree+9NMVupqgyE08g15ZhTxYtsdYvIJA/PPvssZs2aVclY7N69ey2TAb777ruhjW0/OYUT\niP2S7YW1/3JKOVsoAnEuY6vvr7/+OhzH6akTJkxI8R//+MdwHMuwWDqnzJ07N8Uqt2R07mBpCX8n\n/c2TJ09OsfZHTs+9+eabKxuLnTt3rmV9WKU4fF01dZbhfq/zIduD87gEouTi+uuvT7GeP+4zLJ0c\nNmxYOI7lziqjYXkKSzGLrFSLbKdZTqbXkSWrKp3MZHdXXHEFJk2aVMlYXHbZZWtZuvvll18e2vic\nDBgwILSx9JflKrp/Kbr2PL/y9R04cGA47owzzkhxkaVr2bWKzz/LboB4zlU6zzIclk6eddZZ4Th9\nzbAscNSoUZWNxQ4dOtTWWWcdAHUtZpktt9wyvOZzwfOX7nP53KpcS8dSGfg8sC2yvr9KZVmOUmSn\nzddV52WWNjz88MO578cyEJWXnX322SmuSsLRtWvXWiZLv/rqq3OP02vTpk2bFOdJ94G4v+Q1Urn9\n9ttT3KNHj9DG8qRbb701xbwfAuquQQzLKHWNZ371q1+lWKXKeRTJ3vieA6hz37HIZcZKr169Usz3\naSolZilU0Tjl+btr167hOLbN3nPPPVOs8kKe8xTuC7z35DlFv5OSZ109fvz4cByfD/6+wPxxOnr0\n6Mosxlu1alXL1iSV+XG/0fPPexaWUH/22WfhuCLbb14Led3V5wubbLJJivn867Xm+6KVV145tFUh\njeK+xFbzel/PY7h3796hjWVeSyyxhOVUxhhjjDHGGGOMMYsLfohjjDHGGGOMMcYY0wRoUZ+De/Xq\nlSqsq0yDnV0222yz0MZprZoOzrCDBqdpKpzCXJQGxamN6vTAcFqjohIqZr/99sttY+cblY0xnA6/\n0047hbaiCuYNZe7cuUlGxecbiOn4Sp8+fVJ87LHHplirkj/++OMp5jQ35ZFHHkkxS6uAfBmTOi1x\nCrDKB6688soUswuAVsnnFGa9nvzZnPLOsjAgOgGIfOp/gqYK5sHV5dl9C4hV2dUphsfLiiuumGJN\nB+fK+nxude7gc6aOaex6x85Db775ZjiuefPmKdZUWE5nZAkVOwkAUZLHVfMB4IMPPgBQ19Xk+zB7\n9uzkXsGuTUAcA9rfOMVWZSiMSiQYloly2inLkQBg3Lhxue/BcFromDFjQhtLuV555ZXc92A3rUzy\nmcHST5UWMJzur6ns2TWsmhkzZuDmm28GUHc+ZHmlzi88xvbee+8Uc18GgJkzZ6ZYHeDy1j+VerCD\nFLvq6DhimWImS8ngPvntt9+mWOVHLNe65JJLQhs7dPH5UPcdTqlXN7vse7Bjxfdl2rRpSQ5TJIth\nKR8QU99FrheO41Tr6667LrTxnojPMcuFgSjJ4phlpoq6JfL3ZRllEeyYBdSVfmaoi2ERRfvA78Ps\n2bPTflP3XSzl1zWS9xIszdXxxdeOrykQXRbVQSUPdjhV6QSvkypzZYk+Oxyq5KFI2sprHLsx6vy9\n44475r5H9j14jvq+zJo1K+wP89C+zRIqluqyhBeou9Yy7ASlMs48isZ2ETyuuP+p1I/lF/PmzQtt\nfI/Aa4jKye6///4U873aokJ/E/9elaCxSxvLh1g+peg47dy5c4p5r8P3BUCU6zMqn+KxrS6TvP/n\nWCXnzE9/+tPwWp3jMopks8rQoUNLH1uWXr16JfkSy/oUHSssm+I2lV2x1E3d/vieiyVULO8EoqOm\nSqgYnvOLni8w6nCl+xkmb+yrBJLLxujepiGyLmfiGGOMMcYYY4wxxjQB/BDHGGOMMcYYY4wxpgng\nhzjGGGOMMcYYY4wxTYB6WYx37Nixlmn5WBOvFNnlNRSuw8FaUrWpZf1r0W9jXWy/fv1yj2NtPts6\n6ntwfRGgbo2RPFj3rrpI+S2VWMax7Z/WzPj8889TrDr7xx57LMVFOmtGzz/XvmHNM9dVAaLNGmvB\nM2vZDNZdcn0JINYXysp5WhwAABhrSURBVOo4AXVrrowcOTLFqjfm7886zA4dOiAPtb7m83jJJZc0\nin2jfh+uUaF1j5hmzeY/wy0azwrXGuCaTlrDIc8OU/WoPP7UXpktA994440Uq2V2WbifFNWhUW1q\nVlNrn332wWuvvVb5WLzoootC26BBg1Ks9ULUpjGPohoN06ZNSzHrv//0pz+F49jCnOsecO0rII7t\n/fffP/c78XlVXfjTTz+d+3esI2YL3CJrUYVtL1988cXKxmKzZs1qLVp8V15Oa1dw3Qm29AWAww8/\nPMXc79U69Jlnnkkx1/cC4lji92DL8vrAn6010tQuPEPPedE4Yg081+/473//G45jLbrWIGBb4MZY\nF0899dTQduGFF6b4m2++CW1cP4Rrh+h447Go8G/lGghaXykP7kdArBlVdq4oYttttw2vuSYe/2at\n6cc2qwuhsrHYvHnzWmY1vdtuu4U2Pi8693PNEK61pHUaeH7kujRAtGK/6qqrUqy1DXnN5H2F1uHg\n2kxac4JrPPIccOaZZ+L7UlTTUslqRFx44YUYP358JWOxc+fOta233hpArJMGxL6n9eCuvfbaFOvf\nfV/0vPI55/sCrUWj9fmYH/7whynmmmVaW5Dr+HENJSDWDeH9l86Z9WCRWIzzGqHjg+sO8hg75phj\ncj9rhx12CK91nSzzPbiOnNZF4xpnXPsMyLcHV3ifzvUXgbif4vsfrfXJ6H77448/BvBd3cHZs2dX\nvi5qbUauO6R1s/h+mOu+aD01nvN0rGy44YYpfuqpp1J86aWXhuN4TiiiaG+Yt2d5++23w3E8X6s9\nOD8rWHPNNVM8cODA3Pe45ZZbQhvv27beemtbjBtjjDHGGGOMMcYsLvghjjHGGGOMMcYYY0wToF5y\nKk6t2mabbULbaaedluIHH3wwtLGsglNsNf2WLU05NQkAbr/99lLfMc9mUOH307Rbtrir0joRQB3r\nRLXXzmNRpI0XpQqzjVsR3bp1S7FKCzhNko/TNDfuP1la7YIoSnFkmdSXX36ZYra9BoAzzjgjxZy2\nCkTZHl8nttAF6kqoGJaAzZs3r7JU1WWWWab2i1/8AkC0NQRiKl8RLNPgdF4gys7YmhWI6YFvvfVW\nill6A8R0Z5bMZdKTDJaBTJgwIbSxdI/biuxjFe5fLC8bMWJE7t+wVTUQ+25VY3H55ZevZRIbvYbD\nhw9PMVukF3HEEUeE12ynqZbHbKPLdr9PPvlkOI7HzhZbbJH72ZwerNbtLN3iz8pkDwv6LE1n5lTn\nIltKhuWCQDzH5513XmVjsWfPnrUs1Vv7lFp4M2znPmDAgBSrHJnlDUXSBkalLNzvP/3001LvoVbD\nLHdjOUFRmjLbuwLAc889t8DjVA7L1+5f//pX7vs3xrrIshgAuOaaa6r4iMTSSy8dXnNaOu+r1Lo9\nj6Lzryn3Vdiy8zXNu55AsTxBqGwstmnTpvaDH/wAQN3z/Pzzz6e4PvJhhiUdaunL16Hsb2cpgMqM\ni/ZSnMrPayHLcIFoHc5yeeWUU05J8RprrBHa2EJb9/28V2uMsaj7AZbNqNRhv/32SzGvnz169AjH\n8bxbFpbzAlHSy2say5uUJ554IrxmGTnbH2t5AZb6qR33nDlzUszzuq7jvLfXeymW6r300kuVjcVO\nnTrVst+o+0ue388666zQxlKwK664Ivf9ec+v+5s81FKcr4HK1hneK6sM/KOPPkrxaqutlmK9d+T9\nzj333BPa2IKd54ROnTqF41hKrLIivn9pjLGoFuNsoc7nB6h7vTNY0g4AL774YorLSuN5Lw7Ec84s\nv/zy4fXEiRNTXFS+gFFZupZ7KEN2n5Zx+umnp1jlVGyljpLrojNxjDHGGGOMMcYYY5oAfohjjDHG\nGGOMMcYY0wTwQxxjjDHGGGOMMcaYJkC9auKsssoqtcw6US212QqtqM4L19pgPWdDKfr+XB+Ha6QA\n5etMFFFkVzx+/PgUs8W1Wn6yhbLWMhEr3co1jgrrFdVOfbvttkvxZZddlmK2fV4YXGuAa5io1Tnr\nFVmrqOeO6z6orTGfS9YzswYTKP7+XDOI9daq6+T353MDRA39q6++WpneuGXLlrVM88+1T4BY40lr\nS7H1qVrHMvwb1eqW7XL5t6u+k+uksM2g1iNgTavWgWAd/7hx41Kselm2PzzwwANDG+tMuSbVSiut\nFI7j76V64w022ADAd2OyMewbFZ7X2MISiBr5snDtImC+HSUAbLLJJqXeg2uTcB0AoLguVFnybMQV\nrs2j9WM++OCDFGv9D+6Pp59+emVjsUePHrXM5ln7DWvdtU4Ba7R5Htpll13CcWXnWF7TuCYEEC2v\ni+yumb333ju85voBXJdI62TwedZ+wX2tqNbMTTfdlGI+T8D82ka1Wq3SdTGbU9TunGur7LrrrqFt\n1VVXTXHZ86r15S644IIUswWrzs9cN4nru2g9Ia6bwHVVgNhHJk2alGJd7xuC1jjkug9qzS40iq0x\n11gE4jk7//zzQ5vWJMsoqtOgNRcGDx6cYl5z+vTpE47jccV20nqt2GqYLYiBOAfus88+KWabbSDW\nseK9NxD333l2vkAc9/qbs33/8ccfj7fffrvR18XrrrsuxVyrB4jXqmvXrinWGmBc80f3g3monTCv\nM9dff32KufYYUHyPwHDf5L0mEGt0Xn311aGN1z+ujVT0fZVs7QKAq666qlHG4o9//OPQ9vLLL6dY\n92HvvfdeqffnuVfXSK5JxbWI2OYbAD788MMU8zpTdF954YUXhtebbrppirleju7beA78xz/+kfv+\n/NkrrLBCaOMaUVpfNZs/9tprL7z66quVjMXVVlutlt3r8xwBxLlL+yzX9dHaYXnonJztuYFYJyqr\neZbBaxrXVbzhhhvCcbfeemuK//Of/+R+dtlaS7o/4uvLdafmzZsXjuM1ROsrcb2uiRMnuiaOMcYY\nY4wxxhhjzOKCH+IYY4wxxhhjjDHGNAHqJadaeumla1kaJ8uAAKB79+4pZgtiIFr8qT0zwym9nOpb\nhNpCs00jp+Wp1WkRnKbJ6ZsqOyiyPi1L0fnntKvGkFOpleRrr71W6j1YGsNSMaD8NWSZwcMPP5x7\nHMuBOFUOAJZZZpkUH3LIIaHt5JNPTjGn5qu8iK0XH3vssdz3VzkKw6mrRWmrqDBtvGvXrrVMdqFj\ngNNC1d6uKAWVYRs8PS9sK8sp2XyegZhuyPJCtkwGYkqrwlINvgYqyeL31/mHU5BZFqjXlKVw+p0y\n+d97772HOXPmVDIW27VrV8ukZGrVy3PQD3/4w9DGMhSe4ziFGIjWtmwhC0QJR5E8KW9+UktGlkCq\n1I1TRHkt0NRznjvUnpNTUrl/q+xKpTcFVDYWmzdvXsvsQ9kuWr+PWlez9TrPXyqnYmmASmfyLKP1\nGvD7s4RA+x2ngKsdK8MSy0suuSS0sfTjzDPPDG3cv1iapNIhtplVunTpAuC7PjJv3rxKxiLvbTjV\nH4gSpyL4NzzwwAOlPztPjqHy1D322GOBf9+3b9/w+oQTTkixppSrVCZj+vTp4TVLaFiWDsTxzNJV\ntbVnyWaRRTMqHIvt27evZVLqvN8K1JV3sFRX7byZHXfcMcVjxozJPY7XQpY7AcCoUaNSzONZ5eL8\nPX7yk5+ENt57spxDYQmnyhdVcpmhcz7vGd58883cz2qMPar2ebY033zzzUMb9z+W0PB+FYj9QteZ\nPHi/CsQ9K8v2WBa1MHhvw+dcpTYHHXRQilkWC0Rrcr5OOmbZ3lrlKCLrbRQ5VRG6RvA9HEtItewC\nj7FZs2aFNr4v4bWQ37sI3TfzfMiyySJ0HLVo0SLFKi/lPd4777yT+55sMc/W5sD8/d+tt96KqVOn\nVjIW27RpU8sklPq9pk6dmmLtU3Pnzq33Z+n9NUtBeW5s3bp17nuw7Goh92K58LhUaR+fAy3bwCUd\nWFav8juWvGrpGbmXtJzKGGOMMcYYY4wxZnHBD3GMMcYYY4wxxhhjmgD1klOxg4P+HctSXnnlldB2\n2223pfiLL75IcbNm8RkSu0D86le/Cm3sHsDVzDXVmWUW/P6aXs7p4JqSzpW2WTb2+uuvo2o4pZwr\nWgPz01/PPvtsfPDBB41e+Z854ogjwusRI0ak+LzzzksxV8QHYpqpppRzH+H06iw9PoPlNpwKq9Xe\n77vvvvwfQLBsjNMRAeChhx5KMaemAlFuw/1d+xLDabxATMNEI7lwKJx+qy5yeXAqLhBTr1XewTKQ\n9u3bp1j7L7sqsNRAU+v/+c9/5n6vvPR1dlQAouuWuh3wHHHuueemmCVjQJwHdt5559zvtCic4tj9\nh91+gPJuRVz5nlNTAaBTp04pZvcO7Qf8WTwGdGyzTK3IBYXnC3aoA+L8r9IC7tPcN1XWy85sivSl\nysZix44da9n1kvGOIUOG5P4dp9my/LOhcLq2OiIwfP5U4lUEuy9xWv/WW28djuOUZl43gDhfsAxB\n+1PRHJvJDY4++mi89dZblYzF1q1b1zKpn6Zh8xqkaeLctu+++6b4rLPOCsexS5c6pKgUoAy8fxk9\nenRo69ixY4rVTausg1aR7JYdUtiVVKWYnGJ/2mmnhTaRAFcqM85+szr5lIUdYVimq6jckF0i82SO\nCruf6D6I5Wjq/pKH7su5H06ZMiW08fdlJ07epwHF8vlMpvPVV1/h22+/rWQsrr322rVsjOv8wdJN\n3l8A8fz1798/xSqh2X333VPMsmIgupryWNF5UqU9eRS5fjEsuVMZJUtvVCbVqlWrBb5f0fy5EBpl\nj6p7d3Y5472bUtbNWK/H+uuvn2KeD4skkLznUhmNOhbmwXOx3kPxXKl7n9/+9rcpHjt2bIq1lAGj\njrzZsVOmTMHcuXMrGYtLLbVULZMt6pxWVDqD95QcawkPli7zvgGI6yKvmTrH8XVjeTj/OwA8++yz\nyCNvvStyJyySJXJpEnXR0714AZZTGWOMMcYYY4wxxiwu+CGOMcYYY4wxxhhjTBPAD3GMMcYYY4wx\nxhhjmgD1romTxayhBWItgmeeeSa0qQVyRlH9ELbhAqJFKuu8tSYCW4KzTk/1wGwnrPp11l6yrfWf\n//znuj/i/2DNO5Bvxci21UDUX6s9YXZt1ltvPTz77LOLtCZOWdjOFCg+R3n6YNV2jhw5coF/rzpf\n7rtcIwAALr744hSzfaqef0a1uVp3pQyqg2V74CFDhlSmN27VqlUt+y1qNcioHR/b2XKdqRkzZoTj\ntCZJHlzPRq3Dy9qxci0iHTd8zV944YUUqzXyYYcdVur7FsH9Sev7ZFatI0aMwJQpUyofi2odynp8\n1Xvzb88syoFY5waIOmu1BG8IrGfW/sJ1iNj+Foi1ybhmmdbTYp249luuBcAaY57vFa3ldMcdd/DL\nysZiu3btaquvvjqAurrrHXbYIcU697DVN8dsnQrEeglqYX700UenmLXcWp/kk08+WeB3b968eXjN\nNQi03kJeXQCuBQNEC2W2TgWK7VMZ/myes4D5tTCOPfbYymri8Fhcd911QxuPN63V98c//nGB78dr\nHRDXO7VNvueee1JcVPchj8waPYOvvdan6tWrV4qLamtl/RmoWwuQa6JxnQetUcK/S9eTrbbaKsUP\nPfTQIqkV165duxSrxS/v87i/6fXlWgcK93W+xnl9BIhz9O9+97vc45S8OVBrbXBNmQ022CC0vfTS\nSynm+hZaZ5LHrNZv4vO4KGrFcT09sakPtWR4Xzp58uTczyqqeVEE1z5hq3a1B+d9qO5R8+pw7Lnn\nnuE4rZHD8JrP+9Xzzz8/HMd7PW2TGlCL3GJcKVuTii2pdc/BaxLvVe6///5wHO/PeV5T23Mem2xB\nDcRrzvWjuPYSEOdU3Stzzb8rrrgixVoTR+dzpjEsxqu4X+T9K9fEVXivBMS9Ldfp0jHK9955990L\n+6yZM2emmPuS1szienlbbrllaOOahHzvo3DN4BtvvDG0Sc0618QxxhhjjDHGGGOMWVzwQxxjjDHG\nGGOMMcaYJkC95FR9+vSpZWlNmhLcENSaVFMRGU5TO+OMM1JcJLE58sgjU6yWcZtuummKNXWOZTWc\nlskWuECUaxWlYXLKLKdeAsDf/va3FGuKL9syV5Wq2rZt21rfvn0BAKecckpo49Ro5e23305x9vdA\ntHwEgBNPPLHe3+nSSy8Nr/Pkd0WoNTLboH7++ee5f8d9kP8GAMaNG5fiouvL0r9zzjkntG200UYp\nHjlyZKOkqnJqOgA8/vjjKeY08f/7uxSzBSunvgNReqISjjxZBdt3A8DgwYNT3Lt37xSrhW/Lli1T\nfNFFF4U2tlll2YCmMpaF5wdOfwSiLbOmnu+1114AvuvvEyZMqDxVVec+7pdFUkFm4MCB4TWfI5bk\nKPfdd1+K1UKZbcqXW2653Pdg1NaeU4WZ+qSyc2oy92lNbea+qjbbYvXYKGNR+y/L2Dj9G4hpu2zR\nzmndQJTzsJwAiOdW5/M8eD3i6wsAxxxzTIp1nHKKOkumVJLVp0+fFHO6OjDfkhiI16fISrWIqtbF\nvn371jIpyvbbbx/aeI3jsQJEa3SWYancsyyXX355ilkqBwC/+MUvUqzzNcMSGl3TN9544xT/+9//\nzn0PljR8+OGHoS1vnK699trhNUsEdazzfDR69OjKxmKXLl1q2b6J+6iiske2o+V9I0sbGgMeH5mV\nbwbvP9Zaa63QdsMNN5R6f95LqeU6z6Msy2FpARCvN0vSgPlr0zXXXIPJkydXvi6q3TmXceD9MRD3\n4yq1Ytq3b5/i2bNnhzZeP8raSjNFUiiVorHFO8/dulbvtNNOKS6ymmcbZv2sevA/l1OxnJHPi+4/\neH4pgvelvCetD7wH43s2IL+f6JzH9vVF/ZMRCXiwZlfZr3x25WOxf//+oY2tslUWxFL2on1dkSQu\n23MDUb5Y9H4777xzitUSna9H0XvwXkR/c95nAbEsCM8DOofxnoFLDQBxbrr99tstpzLGGGOMMcYY\nY4xZXPBDHGOMMcYYY4wxxpgmgB/iGGOMMcYYY4wxxjQBWiz8kPl89NFHoTYNw1p3rcORZwV91113\n5X6WWqm9/PLLKS7Ss3Eba/PVNpHfT2GrPrYfVytyrn+gNTTYlrPIOvKAAw5IsVpFP/zwwwDmW8dV\nwZw5c9JvV7036+xVb8p1cLguA59jRa8h1xri363fo1u3bilmzSDbYAJR1652qVy/gfWUbHEMRB2m\n2rtyX/r5z3++wO8EAIcccgjy0H5XFUsuuWS6Jg899FDucUVjhcelam+Zstpw1Rvn9VueK4BY46Wo\nHtKQIUNy27jeCdcSAKK97913351irUFVdK5Y/1sVnTt3Trp+rQ/GYyyvBg4QrdW15oG+zoNrY6il\np9qAZ2RzU8ahhx6aYq2BwzWauBaZ1lxh9HyMHTs2xWyXrbVBuL6W1ucqW1OkvnTo0CHVlrn55ptz\nj9N6BlwLiq1P1caYrd3VopuvF8+PajvN/YnnPK45BQATJ05MsdbC4hoju+66a4pvv/32cNxPfvKT\nFPPcCwBPPvlkinn9VOtRtiVdFLzzzjupFg7X7wJiX2c9u1K2Do7WCeIaSEX7Eu6zPGa5zg2QbycP\nAE888USKeS1U7T/3Ea7rBkSb9WeeeSbFXEcHiHsInVu571dJs2bNQm0Qhr+DWscyXbp0yW3j2jkc\nA3Efw3brWmNmwIABKe7YseMC/waI9VTK1tDQvstjmC3QgVjDaOTIkSnmOVrR+oJZX9b6ct+H3r17\npz3zTTfdFNquueaaFGvNEV4Li+A6OFpriG3X8yzAi1Bbab6G2i/5enMdGP6NQNzL6hqSV6dM12C2\nPNY1nef8shbrZeD9TVF9KoXvDXgs6j3Jddddl+IXXnghtGX1zYA4f2udPK5rwntIrfnK76f1GB98\n8MEU8/2xnkuuP6fXh+uYsQU114ACivct2XzE955VonXruH6e1pzV+rF5TJ8+PcV6Xvl6lO2XG264\nYYr1vnvo0KEpXmeddUIbr9283uk9zLBhw1L86KOPhjatJ5nB971ArNGk+2iuk1UWZ+IYY4wxxhhj\njDHGNAH8EMcYY4wxxhhjjDGmCVAvi/ElllhiGoAPF3qgqZpetVqt68IPWzi+hv9TfB2bPr6Giwe+\njk0fX8PFA1/Hpo+v4eKBr2PTx9dw8aDUdazXQxxjjDHGGGOMMcYY87/BcipjjDHGGGOMMcaYJoAf\n4hhjjDHGGGOMMcY0AfwQxxhjjDHGGGOMMaYJ4Ic4xhhjjDHGGGOMMU0AP8QxxhhjjDHGGGOMaQL4\nIY4xxhhjjDHGGGNME8APcYwxxhhjjDHGGGOaAH6IY4wxxhhjjDHGGNME8EMcY4wxxhhjjDHGmCbA\n/wcYbS+RCh5kKgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n = 10\n", "plt.figure(figsize=(20, 2))\n", "\n", "for i in range(n):\n", " ax = plt.subplot(1, n, i+1)\n", " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果你瞇起眼睛,你仍然勉強可以認出他們。我們的自動編碼器能學會如何恢復原始數字圖像嗎?讓我們試試看。\n", "\n", "與上一個的捲積自動編碼器相比,為了提高重建質量,我們將使用稍微不同的模型,每層有更多的濾波器:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input_5 (InputLayer) (None, 28, 28, 1) 0 \n", "_________________________________________________________________\n", "conv2d_8 (Conv2D) (None, 28, 28, 32) 320 \n", "_________________________________________________________________\n", "max_pooling2d_4 (MaxPooling2 (None, 14, 14, 32) 0 \n", "_________________________________________________________________\n", "conv2d_9 (Conv2D) (None, 14, 14, 32) 9248 \n", "_________________________________________________________________\n", "max_pooling2d_5 (MaxPooling2 (None, 7, 7, 32) 0 \n", "_________________________________________________________________\n", "conv2d_10 (Conv2D) (None, 7, 7, 32) 9248 \n", "_________________________________________________________________\n", "up_sampling2d_4 (UpSampling2 (None, 14, 14, 32) 0 \n", "_________________________________________________________________\n", "conv2d_11 (Conv2D) (None, 14, 14, 32) 9248 \n", "_________________________________________________________________\n", "up_sampling2d_5 (UpSampling2 (None, 28, 28, 32) 0 \n", "_________________________________________________________________\n", "conv2d_12 (Conv2D) (None, 28, 28, 1) 289 \n", "=================================================================\n", "Total params: 28,353\n", "Trainable params: 28,353\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "input_img_conv2 = Input(shape=(28, 28, 1))\n", "\n", "x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img_conv2)\n", "x = MaxPool2D((2, 2), padding='same')(x)\n", "x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)\n", "encoded_conv2 = MaxPool2D((2, 2), padding='same')(x)\n", "\n", "# 到這個節點的編碼表示的結構是 (7, 7, 32)\n", "\n", "x = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded_conv2)\n", "x = UpSampling2D((2, 2))(x)\n", "x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)\n", "x = UpSampling2D((2, 2))(x)\n", "decoded_conv2= Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)\n", "\n", "# 串接編碼(encoded)與解碼(decoded)的模型\n", "autoencoder_conv2 = Model(input_img_conv2, decoded_conv2)\n", "\n", "# 模型參數設定\n", "autoencoder_conv2.compile(optimizer='adadelta', loss='binary_crossentropy')\n", "\n", "# 模型參數設定\n", "autoencoder_conv2.summary()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "讓我們訓練它100個循環:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 60000 samples, validate on 10000 samples\n", "Epoch 1/100\n", "60000/60000 [==============================] - 6s 97us/step - loss: 0.2192 - val_loss: 0.1322\n", "Epoch 2/100\n", "60000/60000 [==============================] - 5s 85us/step - loss: 0.1264 - val_loss: 0.1170\n", "Epoch 3/100\n", "60000/60000 [==============================] - 5s 88us/step - loss: 0.1162 - val_loss: 0.1110\n", "Epoch 4/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.1113 - val_loss: 0.1074\n", "Epoch 5/100\n", "60000/60000 [==============================] - 6s 98us/step - loss: 0.1085 - val_loss: 0.1062\n", "Epoch 6/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.1065 - val_loss: 0.1035\n", "Epoch 7/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.1049 - val_loss: 0.1023\n", "Epoch 8/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.1039 - val_loss: 0.1021\n", "Epoch 9/100\n", "60000/60000 [==============================] - 6s 97us/step - loss: 0.1029 - val_loss: 0.1033\n", "Epoch 10/100\n", "60000/60000 [==============================] - 6s 98us/step - loss: 0.1022 - val_loss: 0.1016\n", "Epoch 11/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.1016 - val_loss: 0.1008\n", "Epoch 12/100\n", "60000/60000 [==============================] - 5s 89us/step - loss: 0.1012 - val_loss: 0.0993\n", "Epoch 13/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.1007 - val_loss: 0.0990\n", "Epoch 14/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.1002 - val_loss: 0.0998\n", "Epoch 15/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.1000 - val_loss: 0.0983\n", "Epoch 16/100\n", "60000/60000 [==============================] - 6s 97us/step - loss: 0.0997 - val_loss: 0.0985\n", "Epoch 17/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0994 - val_loss: 0.0982\n", "Epoch 18/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0991 - val_loss: 0.0976\n", "Epoch 19/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0988 - val_loss: 0.0984\n", "Epoch 20/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.0988 - val_loss: 0.0976\n", "Epoch 21/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0985 - val_loss: 0.0981\n", "Epoch 22/100\n", "60000/60000 [==============================] - 5s 89us/step - loss: 0.0984 - val_loss: 0.0984\n", "Epoch 23/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0982 - val_loss: 0.0969\n", "Epoch 24/100\n", "60000/60000 [==============================] - 5s 88us/step - loss: 0.0980 - val_loss: 0.0977\n", "Epoch 25/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0979 - val_loss: 0.0969\n", "Epoch 26/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0978 - val_loss: 0.0967\n", "Epoch 27/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0975 - val_loss: 0.0973\n", "Epoch 28/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0974 - val_loss: 0.0967\n", "Epoch 29/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0973 - val_loss: 0.0970\n", "Epoch 30/100\n", "60000/60000 [==============================] - 5s 88us/step - loss: 0.0972 - val_loss: 0.0961\n", "Epoch 31/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0971 - val_loss: 0.0965\n", "Epoch 32/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0970 - val_loss: 0.0960\n", "Epoch 33/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0969 - val_loss: 0.0959\n", "Epoch 34/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0969 - val_loss: 0.0960\n", "Epoch 35/100\n", "60000/60000 [==============================] - 6s 102us/step - loss: 0.0968 - val_loss: 0.0960\n", "Epoch 36/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0966 - val_loss: 0.0955\n", "Epoch 37/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0965 - val_loss: 0.0956\n", "Epoch 38/100\n", "60000/60000 [==============================] - 6s 97us/step - loss: 0.0965 - val_loss: 0.0965\n", "Epoch 39/100\n", "60000/60000 [==============================] - 6s 98us/step - loss: 0.0964 - val_loss: 0.0959\n", "Epoch 40/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0963 - val_loss: 0.0952\n", "Epoch 41/100\n", "60000/60000 [==============================] - 5s 89us/step - loss: 0.0963 - val_loss: 0.0954\n", "Epoch 42/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.0961 - val_loss: 0.0951\n", "Epoch 43/100\n", "60000/60000 [==============================] - 5s 90us/step - loss: 0.0961 - val_loss: 0.0951\n", "Epoch 44/100\n", "60000/60000 [==============================] - 5s 88us/step - loss: 0.0960 - val_loss: 0.0950\n", "Epoch 45/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0960 - val_loss: 0.0951\n", "Epoch 46/100\n", "60000/60000 [==============================] - 6s 102us/step - loss: 0.0959 - val_loss: 0.0963\n", "Epoch 47/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0958 - val_loss: 0.0956\n", "Epoch 48/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0958 - val_loss: 0.0949\n", "Epoch 49/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0958 - val_loss: 0.0950\n", "Epoch 50/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0957 - val_loss: 0.0948\n", "Epoch 51/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0956 - val_loss: 0.0967\n", "Epoch 52/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0956 - val_loss: 0.0950\n", "Epoch 53/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.0955 - val_loss: 0.0956\n", "Epoch 54/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0955 - val_loss: 0.0948\n", "Epoch 55/100\n", "60000/60000 [==============================] - 5s 90us/step - loss: 0.0955 - val_loss: 0.0946\n", "Epoch 56/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0954 - val_loss: 0.0950\n", "Epoch 57/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0953 - val_loss: 0.0950\n", "Epoch 58/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0953 - val_loss: 0.0947\n", "Epoch 59/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0953 - val_loss: 0.0947\n", "Epoch 60/100\n", "60000/60000 [==============================] - 6s 97us/step - loss: 0.0952 - val_loss: 0.0952\n", "Epoch 61/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.0952 - val_loss: 0.0945\n", "Epoch 62/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0952 - val_loss: 0.0944\n", "Epoch 63/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.0951 - val_loss: 0.0944\n", "Epoch 64/100\n", "60000/60000 [==============================] - 5s 87us/step - loss: 0.0950 - val_loss: 0.0945\n", "Epoch 65/100\n", "60000/60000 [==============================] - 5s 90us/step - loss: 0.0950 - val_loss: 0.0948\n", "Epoch 66/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0951 - val_loss: 0.0949\n", "Epoch 67/100\n", "60000/60000 [==============================] - 6s 99us/step - loss: 0.0949 - val_loss: 0.0950\n", "Epoch 68/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0950 - val_loss: 0.0949\n", "Epoch 69/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0949 - val_loss: 0.0945\n", "Epoch 70/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0948 - val_loss: 0.0948\n", "Epoch 71/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0949 - val_loss: 0.0947\n", "Epoch 72/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0948 - val_loss: 0.0945\n", "Epoch 73/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0948 - val_loss: 0.0943\n", "Epoch 74/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0947 - val_loss: 0.0947\n", "Epoch 75/100\n", "60000/60000 [==============================] - 6s 98us/step - loss: 0.0948 - val_loss: 0.0942\n", "Epoch 76/100\n", "60000/60000 [==============================] - 6s 98us/step - loss: 0.0946 - val_loss: 0.0942\n", "Epoch 77/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0947 - val_loss: 0.0946\n", "Epoch 78/100\n", "60000/60000 [==============================] - 5s 90us/step - loss: 0.0946 - val_loss: 0.0952\n", "Epoch 79/100\n", "60000/60000 [==============================] - 5s 92us/step - loss: 0.0946 - val_loss: 0.0948\n", "Epoch 80/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0946 - val_loss: 0.0939\n", "Epoch 81/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0945 - val_loss: 0.0940\n", "Epoch 82/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0945 - val_loss: 0.0938\n", "Epoch 83/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0946 - val_loss: 0.0939\n", "Epoch 84/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0945 - val_loss: 0.0943\n", "Epoch 85/100\n", "60000/60000 [==============================] - 6s 95us/step - loss: 0.0945 - val_loss: 0.0940\n", "Epoch 86/100\n", "60000/60000 [==============================] - 5s 90us/step - loss: 0.0945 - val_loss: 0.0938\n", "Epoch 87/100\n", "60000/60000 [==============================] - 5s 90us/step - loss: 0.0944 - val_loss: 0.0943\n", "Epoch 88/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0944 - val_loss: 0.0937\n", "Epoch 89/100\n", "60000/60000 [==============================] - 5s 88us/step - loss: 0.0944 - val_loss: 0.0938\n", "Epoch 90/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.0943 - val_loss: 0.0947\n", "Epoch 91/100\n", "60000/60000 [==============================] - 6s 94us/step - loss: 0.0943 - val_loss: 0.0944\n", "Epoch 92/100\n", "60000/60000 [==============================] - 6s 100us/step - loss: 0.0944 - val_loss: 0.0937\n", "Epoch 93/100\n", "60000/60000 [==============================] - 6s 101us/step - loss: 0.0943 - val_loss: 0.0938\n", "Epoch 94/100\n", "60000/60000 [==============================] - 6s 98us/step - loss: 0.0943 - val_loss: 0.0940\n", "Epoch 95/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0943 - val_loss: 0.0940\n", "Epoch 96/100\n", "60000/60000 [==============================] - 6s 92us/step - loss: 0.0942 - val_loss: 0.0945\n", "Epoch 97/100\n", "60000/60000 [==============================] - 6s 98us/step - loss: 0.0942 - val_loss: 0.0941\n", "Epoch 98/100\n", "60000/60000 [==============================] - 6s 93us/step - loss: 0.0942 - val_loss: 0.0940\n", "Epoch 99/100\n", "60000/60000 [==============================] - 5s 91us/step - loss: 0.0943 - val_loss: 0.0936\n", "Epoch 100/100\n", "60000/60000 [==============================] - 6s 96us/step - loss: 0.0941 - val_loss: 0.0936\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "autoencoder_conv2.fit(x_train_noisy, x_train,\n", " epochs=100,\n", " batch_size=128,\n", " shuffle=True,\n", " validation_data=(x_test_noisy, x_test))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABHEAAADqCAYAAAAlBtnSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzsnXWgVWXaxZek0oIIggiC2N2Njt2d\n6NjdmIOOow46OnYXNiqgjoE9BtgjdncAIgIKCogier4//PbLetZlb869noseXL+/nsO774m939qb\nZz1rrlKpBGOMMcYYY4wxxhjzx6bB7/0FjDHGGGOMMcYYY8ys8UMcY4wxxhhjjDHGmCrAD3GMMcYY\nY4wxxhhjqgA/xDHGGGOMMcYYY4ypAvwQxxhjjDHGGGOMMaYK8EMcY4wxxhhjjDHGmCrAD3GMMcYY\nY4wxxhhjqgA/xDHGGGOMMcYYY4ypAvwQxxhjjDHGGGOMMaYKaFSbg+eaa65SFs8zzzyhberUqbl/\n17p16xR/++23ucctt9xyKX799ddD20ILLZTiESNGpLhjx47huDFjxqR4kUUWSfFHH30Ujitqa9u2\nbYonTJiQ4oYNG4bjpk+fnuL5558/tH333Xcp/uGHH1AO+v7t2rVL7zV16tS5ynqTWcDXUGnatGmK\nmzdvHtq++eabst6/cePGKV5wwQVDG58vPj/aJ9q3b5/icePGpbhFixbhuMmTJ5f1neaee+4Ut2zZ\nMrTxZ0+bNi20zTfffCkeP358WZ+VXbOMr7/+ml+OL5VK7VEBGjRoUMr6C59XZd555w2vuY8V/aZW\nrVqleK65Ytfjc8b9vkuXLuG4l19+Off9y/lcIP6277//vqz34D4IAL/88kuKf/7557L+rlGjODXy\n/FYqlSo+FrnPA/G3TpkyJfc9eEyUOx6A/Dl5Fv03wWMKKH+OY7Rv8lyr8NzEsY7ZWnyPio1Fvo5L\nLbVUaHv77bdT3KNHj9D28ccfp5jHEfdXoHic8jrM1/THH38MxxWd2zx0DLRp0ybF3NeKzrmuizyf\n8/XX61jUl1daaSUAwGeffYbx48dXfCxqv+SxX5d+DsRzp+vYqFGjUsyf3axZs3Bchw4dUvzKK6+k\nWOfnUil3iQ907tw5xbqf++STT1LM/QrI70u8RwPinDaLtWC2r4tdu3YNrz///PMUc7/v1KlTOI7b\n+BzVBt5X8Dyv6xvPxXnzMAAsvvjiKda91JdffjnTzwXK39MwyyyzTHj95ptvprg+1kWFx4DuL/P6\nmPZfPs8//fRTnb7jEksskWKe0/Sc8vnicwXEOWHixIm5n7Xkkkum+J133gltTZo0STHPoXpueI5R\n5N6qYmOxadOmpWwO0333yJEjc/8u7zfp/VHPnj1T/N5775X1HgrvY3jtrsveFQAWXnjhFH/66ad1\neg9G18+xY8fmHputA6VSabaMRSZbkzPKPX9FfTsPvUfge8ly0blwgQUWSLGO03LhNbToeQgzi3va\nssZirR7iMIsuumh4rQ9dmHXWWSfF999/f+5xjz76aIp5sgaAvn37pvjQQw9N8V577RWOO+ecc1J8\nwQUXpHjrrbcOx1188cUp3mKLLULbZpttluK77rorxdp5eED17t07tPFv4Y18EXpBs/e89dZby/r7\n3wpP/GuuuWZou+WWW8p6D75uZ5xxRmjjjciTTz6Z4nvvvTcct8suu6T4sssuS7FOFMOGDSvrO3Xr\n1i3FG2ywQWh74IEHUvzZZ5+Ftm233TbF/fv3L+uztJ/dcMMN/PJzVIiGDRumh41FE/tGG20UXvNN\nwtVXX537d2uttVaK9WZuyJAhKd59991TfOGFF4bj9OaiHPhzgbhBeumll8p6D32wW/TAMO/v9Ebu\njTfeKOuz68rOO+8cXvMi+MILL+T+3Yorrpjip556quzPy5uTZ9F/E927dw+vy12AGe2bgwcPzj2W\nb7p4o/TFF1+E4956661yP75iY5Hh9QKIN1jnnXdeaNtuu+1SvNtuu6VYH9oVzT2LLbZYijfZZJMU\n800pAAwcOLDoa88UfaC35ZZbpvj5559PcdG113XxiiuuSDF/X77ZBIChQ4fmvmc2D6y88sq5x/wW\nNtxww/D63XffTXEt+ldgvfXWS/Haa68d2o477rgUb7zxxinmsQ0Affr0SXHRA+dyb0yPOOKIFPNm\nGojXja8TkN+XeI8GAAcddFCKZ7EWVHRdzPrtV199lXvcqaeeGl7vt99+KeZ+f+KJJ4bjeH+z4447\n1uk7brPNNinmfbOubzwX583D2sb7GQDo16/fTD8XAK677royv/EMdP+uD8Pqmz322CPFOp/m9TEd\nb3zOix5uFHHbbbel+Kqrrkqx7qn4euhDzvXXXz/Fd999d1mftfzyy4c23rPzQ8WjjjoqHHf88cfn\n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\nOnd++MPN/5ib74P08fJZZQceeKDHembdgw8+GPrdfffdHuezymp9HL+V/89K/N963p++DwYOHBj6\n6T1RLlN+zjnneKzn4BRhXNiJAwAAAAAAUAB8iQMAAAAAAFAAVVVivNJ0G92NN94Y2rSkX95S/pOf\n/MTjeijpV0n6mvfu3Tu07bTTTh5r6k1Or9E23QKXt76W2+rWlG1wOR2osYqw5a4l6PZWs1iuU7en\n5i3HWo41jwGvbePltUpf5/322y+0aTrUkUce6fHrr78e+ul4aIlj3X5qZtazZ0+PtRynWSwvr2XE\ny6V/TZgwIbS9+OKLHtdb+oCWgP/5z38e2rSMpqav5rmo1zgtiTpjxozQb926dR4PHTo0tB1xxBEe\n6/Uzp8WtWbPG43JrqrY1xzbrotC1ca+99vI4pyXqtVXn+vTp00O/om0Hr2eaYp7nm6YJPPbYY6Et\np5uiMjT9SdP8H3nkkZK/o+mkOQVV5evzqFGjPB4wYIDHu+22W+jXr18/jx9++OGyj1nLcgrML3/5\nS49zuviPfvQjj0844QSP+/fvH/ppGrjeE+V1U8c1p1rpZ5Q999zT47POOiv0e/zxxz3O6VRoOi0r\n/oc//MHjfA+kx7Xo3DMzW7hwocdFu2ayEwcAAAAAAKAA+BIHAAAAAACgAGounUq3aOsWf916l+kW\nLDOz//znP5V/YnVCt3x37949tOnY6KnzGpuZnXTSSR5/+eWXHmu1ADOzJUuWlHwM3f6o1cc0ncMs\nnjq/++67h7ZcgedbmnJgZrZo0SKP85ZPfR5F26bXGKXSbczMOnfu7LG+DtOmTQv9Nm7c6HEtvkYt\nJW+tfvXVVz3u06dPaNP3/eWXX+5x3ubbpUsXj3XL9+GHHx76acqUpk2alU6J1PlrZvarX/3KY61G\nZRZT7mr9PZL/P/3ftXKfWVwTdS7mNCbdSlxuy7+OVd6OrGu7xnl7eWNTqPT3NidVttboa66pjTr3\nzOLrpSkcOZ1Kr5moPjqOuo7mlFe9p8ljXE/zY2vRdVLvUSpF07U0rTVXWtJjCZ5++unQpveb5db1\nWpDf8zomOUVfK4Hlzw1K06lUvpcqd4+6ww47eKzXt1xtmfvcytA0U7N4VEq+ZqoFCxZ4PH78+NBW\n5BR9duIAAAAAAAAUAF/iAAAAAAAAFABf4gAAAAAAABRAzZ2JoyU6n3jiCY9zfr+WFBs7dmxoI1+x\n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\nABTA/wMpr4g9W1+rQAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "decoded_imgs_conv2 = autoencoder_conv2.predict(x_test_noisy)\n", "\n", "n = 10 # 我們想展示圖像的數量\n", "plt.figure(figsize=(20, 4))\n", "\n", "for i in range(n):\n", " # 秀出原圖像\n", " ax = plt.subplot(2, n, i+1)\n", " plt.imshow(x_test_noisy[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", " # 秀出重建圖像\n", " ax = plt.subplot(2, n, i+1+n)\n", " plt.imshow(decoded_imgs_conv2[i].reshape(28, 28))\n", " plt.gray()\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", " \n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "現在我們來看看結果。第一行展現的是有噪點的數字圖像,以及第二行由網絡重建的數字圖像。\n", "它似乎效果很好。如果您將此過程擴展為更大的卷積網絡,那麼就可以開始構建文檔去噪或音頻去噪的模型。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 總結 (Conclusion)\n", "\n", "在這篇文章中有一些個人學習到的一些有趣的重點:\n", "* Autoencoder的概念在深度學習有很多的應用, 不管是在圖像、語音甚至自然語言的處理上\n", "* 了解autoencoder的構建可以做為學習構建更複雜的深度學習的網絡結構" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "參考:\n", "* [Building Autoencoders in Keras](https://blog.keras.io/building-autoencoders-in-keras.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MIT License\n", "\n", "Copyright (c) 2017 François Chollet\n", "\n", "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n", "\n", "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n", "\n", "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.3" } }, "nbformat": 4, "nbformat_minor": 2 }