官术网_书友最值得收藏!

1.4 Karas

Keras是一個高級別的Python神經網絡框架,能在TensorFlow或者Theano上運行。Keras的作者、谷歌AI研究員Francois Chollet宣布了一條激動人心的消息,Keras將會成為第一個被添加到TensorFlow核心中的高級別框架,這將會使Keras變成Tensorflow的默認API。

Keras的特點是:

? 可以快速簡單地設計出原型。

? 同時支持卷積網絡和循環網絡,以及兩者的組合。

? 支持任意的連接方案(包括多輸入和多輸出)。

Keras的在線文檔內容非常豐富,地址為:

        https://keras.io/

1.安裝

Keras的安裝非常簡便,使用pip工具即可:

        pip install keras

如果需要使用源碼安裝,可以直接從GitHub上下載對應源碼:

        https://github.com/fchollet/keras

然后進入Keras目錄安裝即可:

        python setup.py install

2.使用舉例

以識別MNIST數據集為例,關于MNIST數據集的詳細介紹請參考本書第5章。本章主要是給大家概要介紹如何使用Keras。

Keras自帶了MNIST數據集,使用mnist.load_data()加載即可:

        # the data, shuffled and split between train and test sets
        (x_train, y_train), (x_test, y_test) = mnist.load_data()

MNIST中的圖片大小為28× 28的矩陣,為了處理方便,把28× 28的矩陣轉換成長度為784的向量:

        x_train = x_train.reshape(60000, 784)
        x_test = x_test.reshape(10000, 784)
        x_train = x_train.astype('float32')
        x_test = x_test.astype('float32')
        x_train /= 255
        x_test /= 255

圖片識別的結果是0~9這10個數字。通常神經網絡算法在處理時,習慣將輸出以獨熱編碼的形式展現,即所謂One-Hot編碼,又稱“一位有效編碼”。其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都有它獨立的寄存器位,并且在任意時候,其中只有一位有效。比如以二分類問題為例,結果為真表示為1,反之為0;使用獨熱編碼,結果為真表示為10,反之為01。在Karas中可以使用keras.utils.to_categorical很方便地進行轉換:

        # convert class vectors to binary class matrices
        y_train = keras.utils.to_categorical(y_train, num_classes)
        y_test = keras.utils.to_categorical(y_test, num_classes)

下面是整個環節的重點,構造一個隱藏層為2層,每層節點數分別為512、512,輸出層節點數為10的多層感知機,使用Dense函數即可完成構造全連接網絡的工作,其中第一層需要定義輸入數據的形狀,具體定義方式在input_shape屬性指定。為了避免過擬合,每層之間使用Dropout函數進行部分丟失處理,適度的丟失數據不會影響分類識別效果,就好比識別一張照片時適度遮住一部分,不會影響分類識別結果:

        model = Sequential()
        model.add(Dense(512, activation='relu', input_shape=(784, )))
        model.add(Dropout(0.2))
        model.add(Dense(512, activation='relu'))
        model.add(Dropout(0.2))
        model.add(Dense(10, activation='softmax'))

完成多層感知機的結構定義后,就可以使用compile函數“編譯”整個網絡,讓其工作:

        model.summary()
        model.compile(loss='categorical_crossentropy',
                      optimizer=RMSprop(),
                      metrics=['accuracy'])

整個訓練過程需要定義訓練數據集和測試數據集,同時定義訓練的輪數,通常認為訓練輪數為5~20比較合適,輪數太少訓練不充分,輪數太多則訓練時間過長:

        history = model.fit(x_train, y_train,
                        batch_size=batch_size,
                        epochs=epochs,
                        verbose=1,
                        validation_data=(x_test, y_test))

最后評估整個訓練的效果,經過20輪訓練,準確率為98.12%:

        score = model.evaluate(x_test, y_test, verbose=0)
        print('Test loss:', score[0])
        print('Test accuracy:', score[1])

輸出結果為:

        Epoch 20/20
        60000/60000 [==============================] -11s - loss: 0.0201- acc: 0.9950-
            val_loss: 0.1224- val_acc: 0.9812
        ('Test loss:', 0.12236141463853964)
        ('Test accuracy:', 0.98119999999999996)
主站蜘蛛池模板: 临潭县| 白河县| 颍上县| 瑞安市| 乃东县| 长葛市| 朝阳区| 海宁市| 壤塘县| 会泽县| 航空| 黄平县| 温宿县| 本溪市| 雷州市| 黎平县| 仁化县| 石林| 钟祥市| 涿鹿县| 金溪县| 阜新市| 哈密市| 雷山县| 禹城市| 桦川县| 吴旗县| 工布江达县| 高尔夫| 昌都县| 阳西县| 循化| 玉山县| 海淀区| 资兴市| 集安市| 汝南县| 香格里拉县| 德安县| 砚山县| 云霄县|