{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 如何使用Keras函數式API進行深度學習" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Keras使得創建深度學習模型變得快速而簡單。\n", "\n", "序貫(sequential)API允許您為大多數問題逐層堆疊創建模型。雖然說對很多的應用來說, 這樣的一個手法很簡單也解決\n", "了很多深度學習網絡結構的構建,但是它也有限制 - 它不允許你創建模型有共享層或有多個輸入或輸出的網絡。\n", "\n", "Keras中的函數式(functional)API是創建網絡模型的另一種方式,它提供了更多的靈活性,包括創建更複雜的模型。\n", "\n", "在這個文章中,您將了解如何使用Keras中更靈活的函數式(functional)API來定義深度學習模型。\n", "\n", "完成這個文章的相關範例, 您將知道:\n", "* Sequential和Functional API之間的區別。\n", "* 如何使用功能性(functional)API定義簡單的多層感知器(MLP),卷積神經網絡(CNN)和遞歸神經網絡(RNN)模型。\n", "* 如何用共享層和多個輸入輸出來定義更複雜的模型。\n", "\n", "![network topology](https://www.codeproject.com/KB/AI/1215045/Popular-Neural-Network-Architecture.jpg)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Platform: Windows-7-6.1.7601-SP1\n", "Tensorflow version: 1.4.0\n", "Keras version: 2.1.1\n" ] } ], "source": [ "# 這個Jupyter Notebook的環境\n", "import platform\n", "import tensorflow\n", "import keras\n", "print(\"Platform: {}\".format(platform.platform()))\n", "print(\"Tensorflow version: {}\".format(tensorflow.__version__))\n", "print(\"Keras version: {}\".format(keras.__version__))\n", "\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import matplotlib.image as mpimg\n", "import numpy as np\n", "from IPython.display import Image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Keras 序貫模型 (Sequential Models)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Keras提供了一個Sequential模型API。\n", "\n", "它是創建深度學習模型的一種相對簡單的方法,我們透過創建Kears的Sequential類別實例(instance), 然後創建模型圖層\n", "並添加到其中。\n", "\n", "例如,可以定義多個圖層並將以陣列的方式一次做為參數傳遞給Sequential:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.models import Sequential\n", "from keras.layers import Dense\n", "\n", "# 構建模型\n", "model = Sequential([Dense(2, input_shape=(1,)), Dense(1)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "當然我們也可以一層一層也分段添加上去:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.models import Sequential\n", "from keras.layers import Dense\n", "\n", "# 構建模型\n", "model = Sequential()\n", "model.add(Dense(2, input_shape=(1,)))\n", "model.add(Dense(1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sequential模型API對於在大多數情況下非常有用與方便,但也有一些局限性。\n", "例如,網絡拓撲結構可能具有多個不同輸入,產生多個輸出或重複使用共享圖層的複雜模型。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Keras 函數式(functional)API構建模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Keras函數式(functional)API為構建網絡模型提供了更為靈活的方式。\n", "\n", "它允許您定義多個輸入或輸出模型以及共享圖層的模型。除此之外,它允許您定義動態(ad-hoc)的非週期性(acyclic)網絡圖。\n", "\n", "模型是通過創建層的實例(layer instances)並將它們直接相互連接成對來定義的,然後定義一個模型(model)來指定那些層是要作為\n", "這個模型的輸入和輸出。\n", "\n", "讓我們依次看看Keras功能(functional)API的三個獨特特性:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 定義輸入" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "與Sequential模型不同,您必須創建獨立的Input層物件的instance並定義輸入數據張量的維度形狀(tensor shape)。\n", "\n", "輸入層採用一個張量形狀參數(tensor shape),它是一個tuple,用於宣吿輸入張量的維度。\n", "\n", "例如: 我們要把MNIST的每張圖像(28x28)打平成一個一維(784)的張量做為一個多層感知器(MLP)的Input" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.layers import Input\n", "\n", "mnist_input = Input(shape=(784,))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 連接不同的網絡層" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "模型中的神經層是成對連接的,就像是一個樂高積木一樣有一面是凸一面是凹, 一個神經層的輸出會接到另一個神經層的輸入。\n", "\n", "這是通過在定義每個新神經層時指定輸入的來源來完成的。使用括號表示法,以便在創建圖層之後,指定作為輸入的神經層。\n", "\n", "我們用一個簡短的例子來說明這一點。我們可以像上面那樣創建輸入層,然後創建一個隱藏層作為密集層,它接收來自輸入層的輸入。" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.layers import Input\n", "from keras.layers import Dense\n", "\n", "mnist_input = Input(shape=(784,))\n", "hidden = Dense(512)(mnist_input)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "正是這種逐層連接的方式賦予功能性(functional)API靈活性。您可以看到開始一些動態的神經網絡是多麼容易。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 創建模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在創建所有模型圖層並將它們連接在一起之後,您必須定義一個模型(Model)物件的instance。\n", "\n", "與Sequential API一樣,這個模型是您可以用於總結(summarize),擬合(fit),評估(evaluate)和預測(predict)。\n", "\n", "Keras提供了一個Model類別,您可以使用它從創建的圖層創建模型的instance。它會要求您只指定整個模型的第一個輸入層和最後一個的輸出層。例如:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.layers import Input\n", "from keras.layers import Dense\n", "from keras.models import Model\n", "\n", "mnist_input = Input(shape=(784,))\n", "hidden = Dense(512)(mnist_input)\n", "\n", "model = Model(inputs=mnist_input, outputs=hidden)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "現在我們已經知道了Keras函數式API的所有關鍵部分,讓我們通過定義一系列不同的模型來開展工作。\n", "\n", "每個範例都是可以執行的,並打印網絡結構及產生網絡圖表。我建議你為自己的模型做這個事情,以明確你所定義的是什麼樣的網絡結構。\n", "\n", "我希望這些範例能夠在將來使用函數式API定義自己的模型時為您提供模板。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.標準網絡模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在開始使用函數式API時,最好先看一些標準的神經網絡模型是如何定義的。\n", "\n", "在本節中,我們將著眼於定義一個簡單的多層感知器(MLP),卷積神經網絡(CNN)和遞歸神經網絡(RNN)。\n", "\n", "這些範例將為以後了解更複雜的網絡構建提供基礎。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 多層感知器(Multilayer Perceptron)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "讓我們來定義了一個多類別分類(multi-class classification)的多層感知器(MLP)模型。\n", "\n", "該模型有784個輸入,3個隱藏層,512,216和128個隱藏神經元,輸出層有10個輸出。\n", "\n", "在每個隱藏層中使用`relu`激活函數,並且在輸出層中使用`softmax`激活函數進行多類別分類。" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input (InputLayer) (None, 784) 0 \n", "_________________________________________________________________\n", "hidden1 (Dense) (None, 512) 401920 \n", "_________________________________________________________________\n", "hidden2 (Dense) (None, 216) 110808 \n", "_________________________________________________________________\n", "hidden3 (Dense) (None, 128) 27776 \n", "_________________________________________________________________\n", "output (Dense) (None, 10) 1290 \n", "=================================================================\n", "Total params: 541,794\n", "Trainable params: 541,794\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 多層感知器(MLP)模型\n", "from keras.models import Model\n", "from keras.layers import Input, Dense\n", "from keras.utils import plot_model\n", "\n", "mnist_input = Input(shape=(784,), name='input')\n", "hidden1 = Dense(512, activation='relu', name='hidden1')(mnist_input)\n", "hidden2 = Dense(216, activation='relu', name='hidden2')(hidden1)\n", "hidden3 = Dense(128, activation='relu', name='hidden3')(hidden2)\n", "output = Dense(10, activation='softmax', name='output')(hidden3)\n", "\n", "model = Model(inputs=mnist_input, outputs=output)\n", "\n", "# 打印網絡結構\n", "model.summary()\n", "\n", "# 產生網絡拓撲圖\n", "plot_model(model, to_file='multilayer_perceptron_graph.png')\n", "\n", "# 秀出網絡拓撲圖\n", "Image('multilayer_perceptron_graph.png')" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 3.2 卷積神經網絡(CNN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我們將定義一個用於圖像分類的卷積神經網絡(convolutional neural network)。\n", "\n", "該模型接收灰階的28×28圖像作為輸入,然後有一個作為特徵提取器的兩個卷積和池化層的序列,\n", "然後是一個完全連接層來解釋特徵,並且具有用於10類預測的`softmax`激活的輸出層。" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input (InputLayer) (None, 28, 28, 1) 0 \n", "_________________________________________________________________\n", "conv1 (Conv2D) (None, 25, 25, 128) 2176 \n", "_________________________________________________________________\n", "pool1 (MaxPooling2D) (None, 12, 12, 128) 0 \n", "_________________________________________________________________\n", "conv2 (Conv2D) (None, 9, 9, 64) 131136 \n", "_________________________________________________________________\n", "pool2 (MaxPooling2D) (None, 4, 4, 64) 0 \n", "_________________________________________________________________\n", "hidden1 (Dense) (None, 4, 4, 64) 4160 \n", "_________________________________________________________________\n", "output (Dense) (None, 4, 4, 10) 650 \n", "=================================================================\n", "Total params: 138,122\n", "Trainable params: 138,122\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 卷積神經網絡(CNN)\n", "from keras.models import Model\n", "from keras.layers import Input, Dense\n", "from keras.layers.convolutional import Conv2D\n", "from keras.layers.pooling import MaxPool2D\n", "from keras.utils import plot_model\n", "\n", "mnist_input = Input(shape=(28, 28, 1), name='input')\n", "\n", "conv1 = Conv2D(128, kernel_size=4, activation='relu', name='conv1')(mnist_input)\n", "pool1 = MaxPool2D(pool_size=(2, 2), name='pool1')(conv1)\n", "\n", "conv2 = Conv2D(64, kernel_size=4, activation='relu', name='conv2')(pool1)\n", "pool2 = MaxPool2D(pool_size=(2, 2), name='pool2')(conv2)\n", "\n", "hidden1 = Dense(64, activation='relu', name='hidden1')(pool2)\n", "output = Dense(10, activation='softmax', name='output')(hidden1)\n", "model = Model(inputs=mnist_input, outputs=output)\n", "\n", "# 打印網絡結構\n", "model.summary()\n", "\n", "# 產生網絡拓撲圖\n", "plot_model(model, to_file='convolutional_neural_network.png')\n", "\n", "# 秀出網絡拓撲圖\n", "Image('convolutional_neural_network.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 遞歸神經網絡(RNN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我們將定義一個長期短期記憶(LSTM)遞歸神經網絡用於圖像分類。\n", "\n", "該模型預期一個特徵的784個時間步驟作為輸入。該模型具有單個LSTM隱藏層以從序列中提取特徵,\n", "接著是完全連接的層來解釋LSTM輸出,接著是用於進行10類別預測的輸出層。" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "input (InputLayer) (None, 784, 1) 0 \n", "_________________________________________________________________\n", "lstm1 (LSTM) (None, 128) 66560 \n", "_________________________________________________________________\n", "hidden1 (Dense) (None, 128) 16512 \n", "_________________________________________________________________\n", "output (Dense) (None, 10) 1290 \n", "=================================================================\n", "Total params: 84,362\n", "Trainable params: 84,362\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] }, { "data": { "image/png": "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\nJFEMIIn6H5I63SEBe48EAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 遞歸神經網絡(RNN)\n", "from keras.models import Model\n", "from keras.layers import Input, Dense\n", "from keras.layers.recurrent import LSTM\n", "from keras.utils import plot_model\n", "\n", "mnist_input = Input(shape=(784, 1), name='input') # 把每一個像素想成是一序列有前後關係的time_steps\n", "lstm1 = LSTM(128, name='lstm1')(mnist_input)\n", "hidden1 = Dense(128, activation='relu', name='hidden1')(lstm1)\n", "output = Dense(10, activation='softmax', name='output')(hidden1)\n", "model = Model(inputs=mnist_input, outputs=output)\n", "\n", "# 打印網絡結構\n", "model.summary()\n", "\n", "# 產生網絡拓撲圖\n", "plot_model(model, to_file='recurrent_neural_network.png')\n", "\n", "# 秀出網絡拓撲圖\n", "Image('recurrent_neural_network.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.共享層模型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "多個神經層可以共享一個神經層的輸出來當成輸入。\n", "\n", "例如,一個輸入可能可以有多個不同的特徵提取層,或者多個神經層用於解釋特徵提取層的輸出。\n", "\n", "我們來看這兩個例子。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1 共享輸入層 (Shared Input Layer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我們定義具有不同大小的內核的多個卷積層來解釋圖像輸入。\n", "\n", "該模型使用28×28像素的灰階圖像。有兩個CNN特徵提取子模型共享這個輸入;第一個具有4的內核大小和第二個8的內核大小。\n", "這些特徵提取子模型的輸出被平坦化(flatten)為向量(vector),並且被串連成一個長向量, 然後被傳遞到完全連接的層以\n", "用於在最終輸出層之前進行10類別預測。" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input (InputLayer) (None, 28, 28, 1) 0 \n", "__________________________________________________________________________________________________\n", "conv1 (Conv2D) (None, 25, 25, 32) 544 input[0][0] \n", "__________________________________________________________________________________________________\n", "conv2 (Conv2D) (None, 21, 21, 16) 1040 input[0][0] \n", "__________________________________________________________________________________________________\n", "pool1 (MaxPooling2D) (None, 12, 12, 32) 0 conv1[0][0] \n", "__________________________________________________________________________________________________\n", "pool2 (MaxPooling2D) (None, 10, 10, 16) 0 conv2[0][0] \n", "__________________________________________________________________________________________________\n", "flatten_9 (Flatten) (None, 4608) 0 pool1[0][0] \n", "__________________________________________________________________________________________________\n", "flatten_10 (Flatten) (None, 1600) 0 pool2[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_5 (Concatenate) (None, 6208) 0 flatten_9[0][0] \n", " flatten_10[0][0] \n", "__________________________________________________________________________________________________\n", "hidden1 (Dense) (None, 64) 397376 concatenate_5[0][0] \n", "__________________________________________________________________________________________________\n", "output (Dense) (None, 10) 650 hidden1[0][0] \n", "==================================================================================================\n", "Total params: 399,610\n", "Trainable params: 399,610\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] }, { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 共享輸入層 \n", "from keras.models import Model\n", "from keras.layers import Input, Dense, Flatten\n", "from keras.layers.convolutional import Conv2D\n", "from keras.layers.pooling import MaxPool2D\n", "from keras.layers.merge import concatenate\n", "from keras.utils import plot_model\n", "\n", "# 輸入層\n", "mnist_input = Input(shape=(28, 28, 1), name='input')\n", "\n", "# 第一個特徵提取層\n", "conv1 = Conv2D(32, kernel_size=4, activation='relu', name='conv1')(mnist_input) # <-- 看這裡\n", "pool1 = MaxPool2D(pool_size=(2, 2), name='pool1')(conv1)\n", "flat1 = Flatten()(pool1)\n", "\n", "# 第二個特徵提取層\n", "conv2 = Conv2D(16, kernel_size=8, activation='relu', name='conv2')(mnist_input) # <-- 看這裡\n", "pool2 = MaxPool2D(pool_size=(2, 2), name='pool2')(conv2)\n", "flat2 = Flatten()(pool2)\n", "\n", "# 把兩個特徵提取層的結果併起來\n", "merge = concatenate([flat1, flat2])\n", "\n", "# 進行全連結層\n", "hidden1 = Dense(64, activation='relu', name='hidden1')(merge)\n", "\n", "# 輸出層\n", "output = Dense(10, activation='softmax', name='output')(hidden1)\n", "\n", "# 以Model來組合整個網絡\n", "model = Model(inputs=mnist_input, outputs=output)\n", "\n", "# 打印網絡結構\n", "model.summary()\n", "\n", "# plot graph\n", "plot_model(model, to_file='shared_input_layer.png')\n", "\n", "# 秀出網絡拓撲圖\n", "Image('shared_input_layer.png')" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 4.2 共享特徵提取層 (Shared Feature Extraction Layer)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "我們將使用兩個並行子模型來解釋用於序列分類的LSTM特徵提取器的輸出。\n", "\n", "該模型的輸入是1個特徵的784個時間步長。具有10個存儲單元的LSTM層解釋這個序列。第一種解釋模型是淺層單連通層,\n", "第二層是深層3層模型。兩個解釋模型的輸出連接成一個長向量,傳遞給用於進行10類別分類預測的輸出層。" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input (InputLayer) (None, 784, 1) 0 \n", "__________________________________________________________________________________________________\n", "lstm1 (LSTM) (None, 128) 66560 input[0][0] \n", "__________________________________________________________________________________________________\n", "interp21 (Dense) (None, 64) 8256 lstm1[0][0] \n", "__________________________________________________________________________________________________\n", "interp22 (Dense) (None, 32) 2080 interp21[0][0] \n", "__________________________________________________________________________________________________\n", "interp1 (Dense) (None, 10) 1290 lstm1[0][0] \n", "__________________________________________________________________________________________________\n", "interp23 (Dense) (None, 16) 528 interp22[0][0] \n", "__________________________________________________________________________________________________\n", "merge (Concatenate) (None, 26) 0 interp1[0][0] \n", " interp23[0][0] \n", "__________________________________________________________________________________________________\n", "output (Dense) (None, 10) 270 merge[0][0] \n", "==================================================================================================\n", "Total params: 78,984\n", "Trainable params: 78,984\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from keras.models import Model\n", "from keras.layers import Input, Dense\n", "from keras.layers.recurrent import LSTM\n", "from keras.layers.merge import concatenate\n", "from keras.utils import plot_model\n", "# 輸入層\n", "mnist_input = Input(shape=(784, 1), name='input') # 把每一個像素想成是一序列有前後關係的time_steps\n", "\n", "# 特徵提取層\n", "extract1 = LSTM(128, name='lstm1')(mnist_input)\n", "\n", "# 第一個解釋層\n", "interp1 = Dense(10, activation='relu', name='interp1')(extract1) # <-- 看這裡\n", "\n", "# 第二個解釋層\n", "interp21 = Dense(64, activation='relu', name='interp21')(extract1) # <-- 看這裡\n", "interp22 = Dense(32, activation='relu', name='interp22')(interp21)\n", "interp23 = Dense(16, activation='relu', name='interp23')(interp22)\n", "\n", "# 把兩個特徵提取層的結果併起來\n", "merge = concatenate([interp1, interp23], name='merge')\n", "\n", "# 輸出層\n", "output = Dense(10, activation='softmax', name='output')(merge)\n", "\n", "# 以Model來組合整個網絡\n", "model = Model(inputs=mnist_input, outputs=output)\n", "\n", "# 打印網絡結構\n", "model.summary()\n", "\n", "# plot graph\n", "plot_model(model, to_file='shared_feature_extractor.png')\n", "\n", "# 秀出網絡拓撲圖\n", "Image('shared_feature_extractor.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.多種輸入和輸出模型" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "函數式(functional)API也可用於開發具有多個輸入或多個輸出的模型的更複雜的模型。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 多輸入模型\n", "\n", "我們將開發一個圖像分類模型,將圖像的兩個版本作為輸入,每個圖像的大小不同。特別是一個灰階的64×64版本和一個32×32的彩色版本。分離的特徵提取CNN模型對每個模型進行操作,然後將兩個模型的結果連接起來進行解釋和最終預測。\n", "\n", "請注意,在創建Model()實例(instance)時,我們將兩個輸入圖層定義為一個數組(array)。" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "img_gray_bigsize (InputLayer) (None, 64, 64, 1) 0 \n", "__________________________________________________________________________________________________\n", "img_rgb_smallsize (InputLayer) (None, 32, 32, 3) 0 \n", "__________________________________________________________________________________________________\n", "conv11 (Conv2D) (None, 61, 61, 32) 544 img_gray_bigsize[0][0] \n", "__________________________________________________________________________________________________\n", "conv21 (Conv2D) (None, 29, 29, 32) 1568 img_rgb_smallsize[0][0] \n", "__________________________________________________________________________________________________\n", "pool11 (MaxPooling2D) (None, 30, 30, 32) 0 conv11[0][0] \n", "__________________________________________________________________________________________________\n", "pool21 (MaxPooling2D) (None, 14, 14, 32) 0 conv21[0][0] \n", "__________________________________________________________________________________________________\n", "conv12 (Conv2D) (None, 27, 27, 16) 8208 pool11[0][0] \n", "__________________________________________________________________________________________________\n", "conv22 (Conv2D) (None, 11, 11, 16) 8208 pool21[0][0] \n", "__________________________________________________________________________________________________\n", "pool12 (MaxPooling2D) (None, 13, 13, 16) 0 conv12[0][0] \n", "__________________________________________________________________________________________________\n", "pool22 (MaxPooling2D) (None, 5, 5, 16) 0 conv22[0][0] \n", "__________________________________________________________________________________________________\n", "flatten_11 (Flatten) (None, 2704) 0 pool12[0][0] \n", "__________________________________________________________________________________________________\n", "flatten_12 (Flatten) (None, 400) 0 pool22[0][0] \n", "__________________________________________________________________________________________________\n", "concatenate_6 (Concatenate) (None, 3104) 0 flatten_11[0][0] \n", " flatten_12[0][0] \n", "__________________________________________________________________________________________________\n", "hidden1 (Dense) (None, 128) 397440 concatenate_6[0][0] \n", "__________________________________________________________________________________________________\n", "hidden2 (Dense) (None, 64) 8256 hidden1[0][0] \n", "__________________________________________________________________________________________________\n", "output (Dense) (None, 10) 650 hidden2[0][0] \n", "==================================================================================================\n", "Total params: 424,874\n", "Trainable params: 424,874\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 多輸入模型\n", "from keras.models import Model\n", "from keras.layers import Input, Dense, Flatten\n", "from keras.layers.convolutional import Conv2D\n", "from keras.layers.pooling import MaxPool2D\n", "from keras.layers.merge import concatenate\n", "from keras.utils import plot_model\n", "\n", "# 第一個輸入層\n", "img_gray_bigsize = Input(shape=(64, 64, 1), name='img_gray_bigsize')\n", "conv11 = Conv2D(32, kernel_size=4, activation='relu', name='conv11')(img_gray_bigsize)\n", "pool11 = MaxPool2D(pool_size=(2, 2), name='pool11')(conv11)\n", "conv12 = Conv2D(16, kernel_size=4, activation='relu', name='conv12')(pool11)\n", "pool12 = MaxPool2D(pool_size=(2, 2), name='pool12')(conv12)\n", "flat1 = Flatten()(pool12)\n", "\n", "# 第二個輸入層\n", "img_rgb_smallsize = Input(shape=(32, 32, 3), name='img_rgb_smallsize')\n", "conv21 = Conv2D(32, kernel_size=4, activation='relu', name='conv21')(img_rgb_smallsize)\n", "pool21 = MaxPool2D(pool_size=(2, 2), name='pool21')(conv21)\n", "conv22 = Conv2D(16, kernel_size=4, activation='relu', name='conv22')(pool21)\n", "pool22 = MaxPool2D(pool_size=(2, 2), name='pool22')(conv22)\n", "flat2 = Flatten()(pool22)\n", "\n", "# 把兩個特徵提取層的結果併起來\n", "merge = concatenate([flat1, flat2])\n", "\n", "# 用隱藏的全連結層來解釋特徵\n", "hidden1 = Dense(128, activation='relu', name='hidden1')(merge)\n", "hidden2 = Dense(64, activation='relu', name='hidden2')(hidden1)\n", "\n", "# 輸出層\n", "output = Dense(10, activation='softmax', name='output')(hidden2)\n", "\n", "# 以Model來組合整個網絡\n", "model = Model(inputs=[img_gray_bigsize, img_rgb_smallsize], outputs=output)\n", "\n", "# 打印網絡結構\n", "model.summary()\n", "\n", "# plot graph\n", "plot_model(model, to_file='multiple_inputs.png')\n", "\n", "# 秀出網絡拓撲圖\n", "Image('multiple_inputs.png')" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### 5.2 多輸出模型\n", "\n", "我們將開發一個模型,進行兩種不同類型的預測。給定一個特徵的784個時間步長的輸入序列,該模型將對該序列進行分類並輸出具有相同長度的新序列。\n", "\n", "LSTM層解釋輸入序列並返回每個時間步的隱藏狀態。第一個輸出模型創建一個堆疊的LSTM,解釋這些特徵,並進行多類別預測。第二個輸出模型使用相同的輸出層對每個輸入時間步進行多類別預測。" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input (InputLayer) (None, 784, 1) 0 \n", "__________________________________________________________________________________________________\n", "extract (LSTM) (None, 784, 64) 16896 input[0][0] \n", "__________________________________________________________________________________________________\n", "class11 (LSTM) (None, 32) 12416 extract[0][0] \n", "__________________________________________________________________________________________________\n", "class12 (Dense) (None, 32) 1056 class11[0][0] \n", "__________________________________________________________________________________________________\n", "output1 (Dense) (None, 10) 330 class12[0][0] \n", "__________________________________________________________________________________________________\n", "output2 (TimeDistributed) (None, 784, 10) 650 extract[0][0] \n", "==================================================================================================\n", "Total params: 31,348\n", "Trainable params: 31,348\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] }, { "data": { "image/png": "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\nQkAAAAAWAgIAALAQEAAAgIWAAAAALJO9LgBjU29vr6f97927V0cccYSnNXjpwIEDOnjwoKZMmeJZ\nDb29vWpoaPCsfwDlRUBASWbNmiVJWrZsmceVoBp88pOf9LoEAGXCJQaUZO7cuTLGePLYsWOHTjrp\nJH384x/Xgw8+6Fkd1fB48cUXNW/ePB111FHavHmzDh486EkdGzdu9HqTBFAmBARUvYMHD+q2227T\nOeecoxNOOEG7d+/WF7/4Ra/L8tQ//MM/6Oc//7muv/56rVu3TpdccolisZjXZQEYR3zGGON1EUAu\ne/bs0erVqzU4OKiNGzfqmmuu0aRJ5NpUTz/9tFauXKl3331Xd999t5YsWeJ1SQDGAd5pUbV6enpU\nV1enN954Q4ODg7ruuusIB1mcffbZikQiOv/883XJJZfo6quv1nvvved1WQDGON5tUXXefvttrV69\nWo2NjWpqatLOnTv1mc98xuuyqtpHP/pRbd26Vd3d3erq6tJnP/tZRSIRr8sCMIYREFBVnn76aZ1+\n+un62c9+pocfflibN2/WUUcd5XVZY8by5cs1NDSkY489VvPmzVN7e7u4ighgJAgIqAr79+/X+vXr\ntWDBAp188snavXs319JH6IQTTtC2bdt044036lvf+pYuuOACvfbaa16XBWCMYZAiPPfSSy9p5cqV\nGhoa0ve//33967/+q3w+n9dljQvPPPOMVq5cqT//+c/q6OiY8Hd/ACgeZxDgqXvvvVdnnHGG3n//\nfe3cuVNf+9rXCAej6KyzztKuXbv0xS9+UZdddpmam5v1l7/8xeuyAIwBBAR44q233tIVV1yhK6+8\nUs3NzRocHNSpp57qdVnj0tFHH62Ojg795Cc/0UMPPaQzzzxTzzzzjNdlAahyBARU3JNPPqm6ujr9\n4he/0OOPP6729vYJ/b0KlXLppZdq9+7dOuGEE3TOOedo06ZNOnDggNdlAahSBARUzL59+3TDDTdo\n8eLFOuuss7R7924tXrzY67ImlOOOO06PP/64brvtNt18881auHChotGo12UBqEIEBFTE8PCw5s+f\nr82bN6ujo0MPPvigPv7xj3td1oTk8/l0zTXXaMeOHXrzzTdVV1ennp4er8sCUGUICCi7//qv/9IZ\nZ5yhSZMmadeuXfryl7/sdUmQNGfOHO3cuVMrV65UY2OjVq1apbffftvrsgBUCW5zRNm88cYbam5u\n1iOPPKJvfvObuummmzRlyhSvy0IWjz76qK666iodddRRuv/++3XOOed4XRIAj3EGAWXx+OOPa86c\nORoaGtKTTz6pW265hXBQxZYsWaLdu3frU5/6lBYsWKDW1lbt37/f67IAeIiAgFH1/vvv6xvf+IYu\nvPBCff7zn1ckEtG5557rdVkoQm1trfr6+nTHHXeovb1d5557rl566SWvywLgEQICRs2vf/1rzZ07\nV3fffbfuu+8+hUIhTZ8+3euyUAKfz6eWlhbt3LlT77//vk4//XTdc889XpcFwAMEBBw2Y4x++MMf\nau7cufroRz+qoaEhrVy50uuycBhOPfVUDQ4O6qtf/aqam5vV0NCgN9980+uyAFQQgxRxWF5//XVd\neeWVeuKJJ3TjjTfq29/+tmpqarwuC6Oov79fX/rSlyRJ9913nxYuXOhtQQAqgjMIGLG+vj7NmTNH\nf/jDH/Tzn/9cra2thINx6LzzztPQ0JDmzp2rxYsX65vf/KY++OADr8sCUGYEBJTs3XffVSAQ0NKl\nS3XJJZfoueee07x587wuC2V0zDHH6MEHH1RHR4d+/OMfa/78+frd737ndVkAyoiAgJLs2rVLZ555\npnp7e9Xb26u7775bH/nIR7wuCxXy5S9/Wc8995wmT56sz372s9qyZYvXJQEoEwICinLw4EF973vf\n0/z58/X3f//3ikQiuvzyy70uCx6YNWuWfvnLX+qaa67R17/+dS1dulRvvPGG12UBGGUMUkRBr7zy\nitasWaNf/vKX2rBhg6677jpNmkS2hPTzn/9cq1at0t69e3XPPffowgsv9LokAKOEd3nk1dvbq7q6\nOr3++usaGBjQv//7vxMO4Dr33HM1NDSkRYsWacmSJfq3f/s3vf/++16XBWAU8E6PrN555x1dddVV\nWrZsma644grt3LlTZ5xxhtdloQpNmzZNXV1duv/++3Xffffps5/9rH796197XRaAw0RAgGVwcFCn\nn366Hn74Yf3P//yPtmzZog996ENel4Uq19jYqKGhIU2fPl1z587VD37wA3EFExi7CAhw7d+/Xzff\nfLPOPfdc/eM//qN2796t+vp6r8vCGPL//t//01NPPaXvfOc7uv7663XhhRfqf//3f70uC8AIMEgR\nkqSXX35ZK1eu1LPPPqvvfe97uvrqq+Xz+bwuC2PYjh071NTUpEQioc7OTl166aVelwSgBJxBgO6/\n/37V1dXp7bff1o4dO/T1r3+dcIDDNnfuXD333HNaunSpvvCFLygQCOjdd9/1uiwARSIgTGCJREIr\nVqzQ6tWrddVVV2nHjh369Kc/7XVZGEc+/OEP66677nL/sNYZZ5yhZ5991uuyABSBgDBBbd++XXV1\ndXrqqaf005/+VP/xH/+hI4880uuyME5dfvnlGhoa0ic+8QnNnz9ft912mw4ePOh1WQDyICBMMPv2\n7dN3vvMdLVq0SKeffrp2796tCy64wOuyMAF84hOf0OOPP65Nmzbppptu0qJFi/TKK694XRaAHBik\nOIG88MILWrlypZ5//nndfvvt+upXv+p1SZignnvuOTU1Nen111/XnXfeqWXLlnldEoAMnEGYIDo7\nO3XGGWfo4MGD2rVrF+EAnjr99NO1c+dOLV++XMuXL9eXvvQlvf32216XBSAFAWGM++CDD7Rhwwa9\n/PLLWef/+c9/1mWXXaZAIKCvf/3rGhgY0OzZsytbJJDFhz70If34xz9WX1+fHnvsMZ1++ul6+umn\nsy574MAB3XLLLRoeHq5wlcDERUAY41pbW3XjjTfqX/7lX/TBBx+kzXviiSc0Z84cPfPMM+rv79et\nt96qKVOmeFQpkN0ll1yi3bt3a/bs2VqwYIFuvvlm7d+/P22Z2267TcFgUAsWLNB7773nUaXAxEJA\nGMOefPJJff/735ckvfTSS1q/fr0kae/evbr22mt1wQUX6HOf+5yGhob0+c9/3sNKgfxmzJihRx55\nRLfffrtuvfVWLViwQH/84x8lSb/61a904403Sjp0Ruz666/3slRgwmCQ4hj11ltv6dRTT9Ubb7yh\nAwcOSJImTZqku+++W7fffrtefvll/ehHP9KaNWs8rhQozfPPP6/Gxka9/PLLamtr0y233KJXX33V\nPavg8/n08MMPa8mSJR5XCoxvBIQxatmyZXrooYe0b98+d1pNTY2mT5+u2bNna+vWrTrxxBM9rBAY\nub179+rb3/62+vv79fzzz6ddcpg0aZKmT5+u3/72t5oxY4aHVQLjG5cYxqB7771Xvb29aeFAOjSQ\n6+2339bMmTMJBxjTjjjiCM2fP19DQ0PWeISDBw/qnXfe0ZVXXsm3RQJlxBmEMeaPf/yjPv3pTxf8\nm/b//d//zeUFjFmvvvqqTj31VL3zzjs5Q4DP59N//ud/qqWlpcLVARMDAWEMOXDggObPn69IJGKd\nPch01FFH6Te/+Q1nEjDmHDx4UIsWLdLTTz9dcDs/4ogj9Nxzz+mUU06pUHXAxMElhjHklltu0a5d\nuwq+afp8Pr333nu68sorK1QZMHqefPJJPfXUU9alhWwOHjyohoYG6xZfAIev5qabbrrJ6yJQ2MDA\ngNasWZPzC26mTJkiY4wmT56sz33uc/ra176mjRs36sMf/nCFKwUOz/HHH6/Zs2fryCOP1CuvvKL3\n339fU6dOde/WSXXw4EG9+eabeu+993T++ed7UC0wfnGJYQx45513dNppp+m1115z3yR9Pp8mT56s\nffv2qba2VvX19brooot0wQUXEAowbhw4cEA7duzQY489pr6+Pu3evVuTJk1y5zl8Pp/6+/u1cOFC\nr0oFxh0Cwhgwd+5cPfPMM6qpqdHBgwc1adIkzZ07V36/X0uWLFFdXZ3XJQIV8frrr+unP/2pHn30\nUT322GP6y1/+oqlTp7qXGOLxuI499liPqwTGBysg7NixQ//0T//kVT0YA6ZOnaq9e/eWpW22PwCo\nvF/96leaO3du2rTJmQu9+OKLkqQHHnigMlWhoEQioWnTpsnn83ldirq7u/XQQw+VrX22P4xUMpnU\n0UcfrcmTrbc1AHksW7ZML774YuGA4GhoaCh7URh79u3bV9aA4GD7AwBvcZsjAACwEBAAAICFgAAA\nACwEBAAAYCEgAAAACwEBAABYCAgAAMBCQAAAABYCAgAAsBAQAACAhYAAAAAsBAQAAGAhIAAAAAsB\nAQAAWCoSEOLxuHp6elRfX1+J7oBxLR6Pq729Pe/8ib6/tbe3K5lMVqy/1tZWtba2Vqy/UpSzttS2\nq3W7K1RXof2p2pVzW69IQFi/fr1WrFihcDhcie4kSclkUoODg+rs7My5YRSzTCE+ny/rI5/BwUG1\ntLTI5/OppaVF27ZtUzKZTHternaLfQwODubtv5R6J5LM30Ml2t+zZ4+1PeQSj8e1fv16+f3+nMt4\nsb+NpmL3y6GhobRtuKWlxZ23ePFirVq1SvF4vOT+S93XKiVfDe3t7QqHw6NyoBjpPjDa291o7Yv5\n6krdnyq1fkfb4WzrBZkMXV1dJsvkwyapLO3mEgwGTTAYzNtvMcsUIxaLuW0kEom8yw4MDBhJJhQK\nudMikYjx+/1pNWQu40zLrDMUCrnTotGou0wgEMhZQyAQcJeLxWJFv05jyrd9VKr9Qvr6+sraf2b7\niUTC9PX1uf93fp/OtFSJRML4/X4zMDBQsJ9K72+jqdj9sqOjw10m2zobGBgwfr+/4D6ZaST7XqXk\neq9x3kP8fn/J+3Smw9kHRnO7G819MVtd2fanSqzfchjptu6QZLq6uuzpmRPGS0Aopd/RqK3YNpyD\nc6ZIJGIFhGL6SCQS1vPa2tqMJBONRq02otGoO38kr3k8BwTnDaNc/WdrP1sQyPW7aWtrM8FgsKi+\nxnJAcBR6DdnWXaZAIGDa2tpK7reYWjL3vUrJtV5isZh7EBvpgeJw94HR2u5Ge1/MVleu/amc67ec\nRrKtO8oeEFI//UgyHR0dVgGZn5xSPwEEg0ErmTkHso6ODjfZlTI/W7/ZFHOWoZBidwxno49EIlnb\ncGQ7uOfqI3VZp+1sn4KMOfSpx5k/ngJCtu0vdXtK/aSZa1rqp9bUMyx9fX3G7/cbY/72qTUQCJjh\n4eHDbj+bbGeAnO27v78/72v3+/1meHg4a/uxWMzdZ/x+v9tWLBYzoVDIfY3OJze/329th4X2uVx9\njES+deScLQsGg3nPqPT397u/R0ehfbrUfS9z/eVan4FAwG3b+X2lTnMUWof51ovzep3wlFmLI9fv\nsdA+kEgkTCAQcN+vM9tOfY7TR+ZrPNx9pdD6KWZ/yLc/lbJ+C9VUyX0r27ZerLIHBL/fn7bTORtR\nagGp7TqfpGOxmLuzp74ptrW1uSswkUi4G0yx83P1m00lA0Lqwbmjo6OkJFrsazEm95kKZx2Pt4Dg\n9/vdUJot6aeeOnSkXpJx5Hvjcg5EzpukJDckjLT9TM6n0sw3IOeNJdvBy+/3m0Ag4L7W1KDkcNaJ\nExqdN5PUy1upr3Ek+2S+PkYi37py1ofzyHXq13kdqeuz2H262FpS11/mz85rdy4tBgKBvOu4mHWY\nrxZn+3HazKzNmMK/x8zlM7ePSCRiAoFA1rYztyPn9aQeuA5nXylm/RSzP+Tbn0pZv4VqquS+lW1b\nL1ZZA4LzC0jdQZ1rIqkFpLYbDAbTVlC2jSO1vcxEVWh+rnazGenBcqRtDA8Pp40DCIVCRQWFUgKC\nswGlfrqKRCJu6hxPASFbcs421iPbay7mTSnbNCfopZ7SG2n7ma8l2ynMXAHYeaNLPZvhvImlLp/t\nerkk90BZbO359rlCfZSqmDAViUTcdZN51tJZJvP3VI5aRrodlfp7Go1ainlvzVVn5nZZzOt2PsGn\n/n5Guq8UWj/F7g+59qdc/eabXy371uFs62UNCMVcK8q10nNdE3cOoLkOni9gwoIAABWTSURBVIXm\nF+q31GUKGUkbAwMDaUGhUPIrJSA4/08NYaW8yeRSjQEh29kSZ2fJF1KzTSv2jX2kzy203nMNQsz1\nvFxnijKXT/0kk/kotvZC+1yhPkpVynM7Ojqs0+gjaWektYxWQChmHR5uLYV+j6O9DxS7XDHLFFo/\nxe4P+dZhqeu3mvatkW7rUhkDQrEHrsxlnJ062zWi4eHhtJWSmYoKzT/c2kp1OG04Z1uk/CGh2Nfi\ncFJn6nXSw623GgNCud+Uyt2+IxQKZf0UXEoNI+m32NoL7XOjsR+NtL18AwYrsX+PdDsq9fdUaBln\nPeT7MDCS3+Phbmfl3hdHq85C84pZv8W0V659qyoDQr6Bd6kF5Dp4ZZvvcK535QoBheZXS0BIvfaf\nLSFmuwY3kjpT5ztthkIhEwqFsg4UKlU1BoTMa5wOSXkvY2WbVuqb42i0b4xxT5XnMloBIfXUa6F2\nSt0nC/VRqlK30Vy39o7FgJBvHearxbncljqAbaS/x2L6LCUgjOa+WMp2XEqdheblW7/VsG9VZUBI\nHdntHPyi0WjBMQaFfs68D7WU+bnazabcbyADAwPup/fMjSuzjVynSYutM3O+c61ttD7tVWNAcMJm\n6ql5J+kXeqMc6Ru7c9Yr9YzPSNt3Rienct4oHM5luMxw6ex7meE8sx9nuWAwmDZw0+m32Nrz7XOF\n+ihVKdtoIpHIu1+NdBxEsbWMVkAoZh3mqiV1cG6h2gq9t45mQMh2V9VI95VC66fY/SHX/pTvteZa\nv9W0b410Wy9rQEgdqeo8Um8DSx216nzKc5aPRqNplxic+c4LdT71OmMVUl9QvvnGpA9OyTVOodAy\nxYx4zjYq1+EMlnM2WGe5/v5+t7/U23JynYXJtg5zLZM639nQUtstpq1cqjEgOPdMp45kD4VC1ifK\nzDsPnN+Ns70ak342InMHd97gnFHGmW8UI2k/277jPFLDR65R185ZotTbppxPOan9pv7OUx/O5afM\nfSB1vyh2n8zXR6ny7ZehUCgtDESj0ZyX5kbjLoZC+0vm/GzrM1sbhaZlW4e51kuuP+STrY9Cv8ds\n22i297d87+upt/n5/X7rvXmk+2Kh9VPs/pBrfyp1/RaqqZL7VtXexWDMoRfgfFoNBoM57xF32nYO\nXM79tM5dDamXHFLv+8yWlArNz/YodZlCbya52sh8OBuH0/7w8LD1dyAKnaIq9bU4sp3JyddWPtUY\nEIw5tP2lrs9sg32i0ag11sO5dcjZUTO3S2P+ts5Sb1vKdovqSNpPHaSa+UjdHpw3iGwDGJ2zdc4b\nYOotUalvZtFo1N1HM/e1zG0h17R8+1y+PkpRaBtNvcUxGAzmvbTpHHhK+TsIpdSSb5li1me2Nov9\nPaU+2tra8g5uLeX3mLmNpj4/26DfzPqdO3Gc+rOd2Rnpvphv/aTOL7Q/ZNufRrJ+S/2djfR3Uszr\nzratF0vKHhB8f53p6u7uVlNTkzImA5LKv31U4/bn/D14r2tyvlDm2muv9bSOsaS1tVXTp09nncEy\n3vanw9nWfT6furq61NjYmDadr3sGxojm5mY99dRTeb+IC38zNDSkoaEhNTc3e10KqtB42p/Kta0T\nEIA8Ur8hrSzfllaCadOm6a677tKmTZs0NDTkaS3V7oUXXtCdd96pu+66S9OmTfO6HFSh8bI/lXNb\nJyAAecyYMSPr/71SW1urrVu36oknnvC6lJJU+quTw+Gwvvvd76q2tnbU2sT4M1b3p1Tl3NYnj3qL\nwDji9biDbKZNmzbmrptWej2OtfUD74zF/SlVOWvnDAIAALAQEAAAgIWAAAAALAQEAABgISAAAAAL\nAQEAAFgICAAAwEJAAAAAFgICAACwEBAAAICFgAAAACwEBAAAYCEgAAAAi/Vtjh/60IckaVS/ehUo\nFtsfAFSe896bymcyvod1//796uvr04EDBypWWDX7xS9+oR/96Ed64IEHvC6lanziE5/Q/Pnzy9I2\n2x8AVFZNTY3q6+s1eXL6OQMrICBdd3e3mpqaKv599gAAeIkxCAAAwEJAAAAAFgICAACwEBAAAICF\ngAAAACwEBAAAYCEgAAAACwEBAABYCAgAAMBCQAAAABYCAgAAsBAQAACAhYAAAAAsBAQAAGAhIAAA\nAAsBAQAAWAgIAADAQkAAAAAWAgIAALAQEAAAgIWAAAAALAQEAABgISAAAAALAQEAAFgICAAAwEJA\nAAAAFgICAACwEBAAAICFgAAAACwEBAAAYCEgAAAACwEBAABYJntdQLX54IMP9H//93/uz87/33rr\nrbTlPvaxj1W0LgAAKslnjDFeF1FNfD5fUctt2LBBwWCwzNUAAOANLjFkOO2004parra2tsyVAADg\nHQJChmuuuUY1NTV5l5k8ebIuv/zyClUEAEDlERAyfPGLX9SkSblXS01Njc4//3wdc8wxFawKAIDK\nIiBkmD59ui666CJNnpx9/KYxRitXrqxwVQAAVBYBIYtVq1bpwIEDWedNnTpVS5curXBFAABUFgEh\ni4svvlhHHnmkNX3KlCm69NJLdfTRR3tQFQAAlUNAyOKoo47SZZddpilTpqRN37dvn5qamjyqCgCA\nyiEg5NDU1KR9+/alTfvoRz+qCy64wKOKAACoHAJCDosXL077a4lTpkzRFVdcoalTp3pYFQAAlUFA\nyGHy5Mlavny5e5mBywsAgImEP7Wcxy9+8Qude+65kqQZM2botddey/s3EgAAGC842uVxzjnn6Ljj\njpN0aEwC4QAAMFHk/DbH119/Xd/4xjdy/j2AicIJBbt379ayZcs8rsZbs2bN0qZNm7wuAwBQATkv\nMXR3d6upqUkNDQ2VrqmqvPfee/rDH/6gOXPmeF2Kp3p7eyUd+kuSAIDxL+cZBMcDDzxQiTpQ5ZzA\nCACYGLioDgAALAQEAABgISAAAAALAQEAAFgICAAAwEJAAAAAFgICAACwEBAAAICFgAAAACwEBAAA\nYCEgAAAACwEBAABYCAgAAMBCQAAAAJaKBoR4PK6enh7V19dXslsAAFCiigaE9evXa8WKFQqHwxXr\nM5lManBwUJ2dnTmDyZ49e9TS0iKfz6eWlhZt27at5H58Pl/OR3t7u8LhsJLJ5OG+HAAAKqKiAWHL\nli2V7E6S1NbWpkceeURr167NGkySyaSGhoa0ZcsWJRIJLViwQOedd17JIcYYo1gs5v6cSCRkjJEx\nRosXL1ZnZ6dWrVqleDx+2K8JAIBy8xljTLYZ3d3dampqUo7ZI+/Q55OkUW93pP2Gw2H5/f6ilj2c\nfuLxuJqbmyVJW7du1bRp00pu20vl2h4AANVp1M8gJJNJ9fT0uKfXOzs7Cy7f2dnpLt/a2mp9ym5v\nb3fbisfj7kG42Pn5ZIYDRyAQSPu5tbVVra2tRbebqba2VuvWrVM4HNb27dvT5sXjcfc11NfXu5c4\nMsdshMNhd5k9e/aktVFoHeTqAwCAbEY9IKxatUrPP/+8e3p9165deQ+sN9xwg9auXatYLKZoNKqN\nGzdq/fr17vz29nY1NDTIGKNly5bpjjvuSHt+ofmlcsYJLFmy5LDayebMM8+UJD366KPuNOfMwsyZ\nM2WM0bp163TeeedpaGhIzc3N7piNwcFB+f1+RaNRhcNh3XrrrW4bhdZBvj4AAMjK5NDV1WXyzM4q\nFAoZSSYWi7nTBgYGjN/vd3+WlNZuMBg0gUAg5/zM9mKxWEnzc7WbS39/v/H7/SaRSBRcNptC/WTO\nd9ZZ5jLBYDBne6Wuo0J9FGMk2wMAYOwa1YDg9/sLPifXATQajZq2tjZrfiAQMJJMKBTKetAuNL9Q\nv9lew8DAQMHlRtpP5nxnnWV75Gqv1HVUqI9iEBAAYGIZ1YBQzEEn2zIdHR3G7/eb4eFha/7w8HDa\nAa6trS3tuYXml1JbKBQyHR0deZcpJF8/iUTC+uReaqDINq3QOig1DGRDQACAiaUsZxAikUjuDnOc\nYo9Go1nnOyKRiPtJOVsIKDS/0EEyEomUdMo9l3z99Pf3G0mmv7/fWn54eLjo9kpdR4X6KAYBAQAm\nllENCB0dHUaSCQQC7qnuaDRacIxBoZ9TT5tHIpGS5udqN1UsFrNChXOwLVWufmKxmPH7/WnjMYz5\n2zoLBoPu60itp9gxCPnWQaE+ikFAAICJZVQDgnMQTL3GHQgE3E+uzuC51EF1zvLRaDTtEoMz3zmw\nOWcYnLEK7gsoMN+Yv53azzyQ5qrZefT19bnLBYPBgmcYcvUTiUTccJA6mDBznaQ+otFo2jynvdQ+\nil1H+fooFgEBACaWUQ0Ixhw6GAWDQfeglXpaO9sAOefTbjAYdJ8bCATSLjk4n3ZzXV8vND/bw+Gc\nks/2SK29UEDI1YZTU76Bj9Fo1F1nma89s+Zc0/Ktg3x9FIuAAAATS8X/kiLGJrYHAJhY+LpnAABg\nISAAAAALAQEAAFgICAAAwEJAAAAAFgICAACwEBAAAICFgAAAACwEBAAAYCEgAAAACwEBAABYCAgA\nAMBCQAAAABYCAgAAsBAQAACAhYAAAAAsBAQAAGCZXGiBZcuWVaIOVLne3l6vSwAAVFDOgLBo0SIt\nX75cBw4cqGQ9VScej+v3v/+9/vmf/9nrUjzV0NCgWbNmeV0GAKBCfMYY43UR1ay7u1tNTU1iNQEA\nJhLGIAAAAAsBAQAAWAgIAADAQkAAAAAWAgIAALAQEAAAgIWAAAAALAQEAABgISAAAAALAQEAAFgI\nCAAAwEJAAAAAFgICAACwEBAAAICFgAAAACwEBAAAYCEgAAAACwEBAABYCAgAAMBCQAAAABYCAgAA\nsBAQAACAhYAAAAAsBAQAAGAhIAAAAAsBAQAAWAgIAADAQkAAAAAWAgIAALAQEAAAgIWAAAAALAQE\nAABgISAAAADLZK8LqDbNzc3auXOnpk+fLkn605/+pMmTJ+vzn/+8u8xrr72mH/7wh7rooos8qhIA\ngPLyGWOM10VUE5/PV9RyN954o7773e+WuRoAALzBJYYMN910k6ZMmVJwuSuuuKIC1QAA4A3OIGQY\nHh7WySefnHeZ0047Tb/5zW8qVBEAAJXHGYQMs2fP1pw5c3JeapgyZYpWrlxZ4aoAAKgsAkIWa9as\nUU1NTdZ5+/fv14oVKypcEQAAlcUlhixeffVVHX/88cpcNZMmTdJZZ52lwcFBjyoDAKAyOIOQxcyZ\nM3X22Wdr0qT01ePz+bRmzRqPqgIAoHIICDmsXr066ziEyy67zINqAACoLAJCDpdffnlaQKipqdHC\nhQtVW1vrYVUAAFQGASGHY445Rueff747WNEYo9WrV3tcFQAAlUFAyGPlypXuQMUpU6bo0ksv9bgi\nAAAqg4CQx9KlSzV16lRJ0sUXX6yPfOQjHlcEAEBlZP2ypldeeYVb+f7qxBNP1G9/+1udeOKJ6u3t\n9bocz9XU1Ki+vl6TJ/M9XwAwnmX9OwhXXXWV7rnnHi/qwRjwk5/8hMstADDOZf0YuHfvXjU2Nqqr\nq6vS9aDK+Xw+vfvuu16XAQAoM8YgAAAACwEBAABYCAgAAMBCQAAAABYCAgAAsBAQAACAhYAAAAAs\nBAQAAGAhIAAAAAsBAQAAWAgIAADAQkAAAAAWAgIAALAQEAAAgIWAAAAALFUZEJLJpHw+X0XbTyaT\nGhwcVGdnp+rr60fUrs/ny/lob29XOBxWMpkcjZcAAEBZVWVA2L59e8Xbb2tr0yOPPKK1a9cqHA6P\nqF1jjGKxmPtzIpGQMUbGGC1evFidnZ1atWqV4vH4iGsHAKASqi4gJJNJdXZ2Vrz9DRs2aMOGDYfd\nfm1trfv/adOmuf+vq6vTXXfdJUlqbm7mTAIAoKqNakBIJpPq6elxT6t3dnamfVpOPeWea1pbW5v7\nCd6ZHo/HFQ6H3VP/nZ2d8vl8amlp0QsvvHDY7RertbVVra2tpa4WV21trdatW6dwOGydxYjH42pv\nb5fP51N9fb22bdvmTu/p6XFfezgcdpfZs2dPWhvO8531nvnacvUBAECmUQ0Iq1at0jvvvOOeag+H\nw2mfllNPvzui0Wjaz6mf4p3T8zNmzFB9fb3C4bAGBwf1la98RYlEQpI0e/ZsNySMtP1KOvPMMyVJ\njz76qDstHo+rublZM2fOlDFG69at03nnnaehoSE1NzdrxYoV7mv3+/2KRqMKh8O69dZb3Tba29vV\n0NAgY4yWLVumO+64I63ffH0AAGAxWTQ2NprGxsZss3Lq7+83kkwsFnOnDQwMGEkmFAq50ySZzG4z\npxWzjDHGRCIRI8m0tbUddvvFzCtWoTYy54dCoaw1B4PBnO1le02p6z4Wi5XUR7Ekma6urpKeAwAY\ne0btDEJvb6+k9Gvwp5xyiiSpu7t7tLpJU1dXJ0m67rrrytJ+pTjrJ/NyyMaNG4tuIxAIaMaMGerp\n6VEymVRtbW3a2ZHR6AMAMHGMWkC48847rWnOIL2R3hUwHjmXW4LBoDvNWT/mr5c8Uh/F+sY3viG/\n368VK1Zo+vTpam9vT5s/Gn0AACaOUQsIfr9fkrLewhcIBEarm6zK3f5oevbZZyVJCxcutOalDrgs\n1UknnaS+vj5FIhEFAgFdd911Vkg43D4AABPHqAWExsZGSdIf//hHd5rzabmhoWG0uknjHOyWLFlS\nlvZHWzwe1w9+8AP5/X4tWrTInd7R0SFJ2rp1q7vOnDsOiuXz+ZRMJlVXV6ctW7YoEomkXXoZjT4A\nABPHqAWEiy66SH6/X5s2bXLPIjz22GMKBAJpB0Pn075zcB8cHHTntbS0SEo/G5F5AOvp6ZF0KHxs\n3bpVfr/fXf5w20/92wTZ/k5BMbc55mrDuSNBkvv3EBxLly6VdGg8wPTp0+Xz+TRjxgw1NDSknZFx\n2kttN3V+W1ube+vjxz72MbW1tRXVBwAAlmwjF0dyF4Mxh0bOd3R0uCPsQ6GQSSQSactEo1Hj9/uN\nJNPX12eMMcbv95tQKOSOwnfuTggGg+40p81IJOI+v6OjY9Tbz3ykCgaDeUf952pDf73TYmBgIOdz\no9GoCQaDRpIJBAImGo1mbTPftFgsZtra2qw7Owr1UQpxFwMATAg+Y+xRak1NTZKkrq6u0U0jh8EZ\ndZ+lXFSQz+dTV1eXe0kJADA+Vd2fWgYAAN4bEwEh9To7X3QEAED5jYmAMGPGjKz/BwAA5THZ6wKK\nwbgDAAAqa0ycQQAAAJVFQAAAABYCAgAAsBAQAACAhYAAAAAsBAQAAGAhIAAAAAsBAQAAWAgIAADA\nQkAAAAAWAgIAALAQEAAAgIWAAAAALDm/zbG3t1eXXnppJWsBAABVImtA+OQnP6l9+/Zp2bJlla4H\nY8CsWbO8LgEAUGY+Y4zxuggAAFBdGIMAAAAsBAQAAGAhIAAAAAsBAQAAWP4/1myh5abuTz8AAAAA\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 多輸出模型\n", "from keras.models import Model\n", "from keras.layers import Input, Dense\n", "from keras.layers.recurrent import LSTM\n", "from keras.layers.wrappers import TimeDistributed\n", "from keras.utils import plot_model\n", "\n", "# 輸入層\n", "mnist_input = Input(shape=(784, 1), name='input') # 把每一個像素想成是一序列有前後關係的time_steps\n", "\n", "# 特徵擷取層\n", "extract = LSTM(64, return_sequences=True, name='extract')(mnist_input)\n", "\n", "# 分類輸出\n", "class11 = LSTM(32, name='class11')(extract)\n", "class12 = Dense(32, activation='relu', name='class12')(class11)\n", "output1 = Dense(10, activation='softmax', name='output1')(class12)\n", "\n", "# 序列輸出\n", "output2 = TimeDistributed(Dense(10, activation='softmax'), name='output2')(extract)\n", "\n", "# 以Model來組合整個網絡\n", "model = Model(inputs=mnist_input, outputs=[output1, output2])\n", "\n", "# 打印網絡結構\n", "model.summary()\n", "\n", "# plot graph\n", "plot_model(model, to_file='multiple_outputs.png')\n", "\n", "# 秀出網絡拓撲圖\n", "Image('multiple_outputs.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6.最佳實踐\n", "以上有一些小技巧可以幫助你充分利用函數式API定義自己的模型。\n", "* **一致性的變量名稱命名** 對輸入(可見)和輸出神經層(輸出)使用相同的變量名,甚至可以使用隱藏層(hidden1,hidden2)。這將有助於正確地將許多的神經層連接在一起。\n", "* **檢查圖層摘要** 始終打印模型摘要並查看圖層輸出,以確保模型如您所期望的那樣連接在一起。\n", "* **查看網絡拓樸圖像** 總是儘可能地創建網絡拓樸圖像,並審查它,以確保一切按照你的意圖連接在一起。\n", "* **命名圖層** 您可以為圖層指定名稱,這些名稱可以讓你的模型圖形摘要和網絡拓樸圖像更容易被解讀。例如:Dense(1,name ='hidden1')。\n", "* **獨立子模型** 考慮分離出子模型的發展,並最終將子模型結合在一起。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 總結 (Conclusion)\n", "\n", "在這篇文章中有一些個人學習到的一些有趣的重點:\n", " \n", "* 使用Keras也可以很靈活地來建構複雜的深度學習網絡\n", "* 每一種深度學習網絡拓樸基本上都可以找的到一篇論文\n", "* 了解每種深度學習網絡拓樸架構的原理與應用的方向是強化內力的不二法門" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "參考: \n", "* [How to Use the Keras Functional API for Deep Learning](https://machinelearningmastery.com/keras-functional-api-deep-learning/)\n", "* [Keras官網](http://keras.io/)" ] }, { "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 }