【深度學習代碼例】典型的Keras框架

Keras是一種高度模塊化,使用簡單上手快,合適深度學習初學者使用的深度學習框架。Keras由純Python編寫而成並以Tensorflow、Theano以及CNTK爲後端。Keras爲支持實驗而生,能夠把你的idea迅速轉換爲結果。 對於深度學習的初學者,或者覺得Tensorflow,Caffe等框架學習困難難以上手的人,可以考慮學習Keras。

keras套路

序貫模型是多個網絡層的線性堆疊。Sequential的第一層需要接受一個關於輸入數據shape的參數,
後面的各個層則可以自動的推導出中間數據的shape,因此不需要爲每個層都指定這個參數

指定模型Sequential( )
---->堆疊模塊 .add( )
---->編譯模型 .compile( )
---->在訓練數據上迭代 .fit( )
---->評估 .evaluate( )
---->對新數據的預測 .predict( )

# 序列模型
# 序列模型屬於通用模型的一種,因爲很常見,所以這裏單獨列出來進行介紹,這種模型各層之間
# 是依次順序的線性關係,在第k層和第k+1層之間可以加上各種元素來構造神經網絡
# 這些元素可以通過一個列表來制定,然後作爲參數傳遞給序列模型來生成相應的模型

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation

# Dense相當於構建一個全連接層,32指的是全連接層上面神經元的個數
layers = [Dense(32, input_shape=(784,)),
          Activation('relu'),
          Dense(10),
          Activation('softmax')]
model = Sequential(layers)
model.summary()
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation


model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))
model.summary()

import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D


# ---------先讀入數據------------
(X_train, y_train), (X_test, y_test) = mnist.load_data("../test_data_home")
# 看一下數據集的樣子
print(X_train[0].shape)
print(y_train[0])

# 下面把訓練集中的手寫黑白字體變成標準的四維張量形式,即(樣本數量,長,寬,1)
# 並把像素值變成浮點格式
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')

# 由於每個像素值都介於0到255,所以這裏統一除以255,把像素值控制在0-1範圍
X_train /= 255
X_test /= 255


# 由於輸入層需要10個節點,所以最好把目標數字0-9做成One Hot編碼的形式
def tran_y(y):
    y_ohe = np.zeros(10)
    y_ohe[y] = 1
    return y_ohe


# 把標籤用One Hot編碼重新表示一下
y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))])
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])

# -------------搭建卷積神經網絡-----------------
model = Sequential()
# 添加一層卷積層,構造64個過濾器,每個過濾器覆蓋範圍是3*3*1
# 過濾器步長爲1,圖像四周補一圈0,並用relu進行非線性變化
model.add(Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='same',
                 input_shape=(28, 28, 1), activation='relu'))
# 添加一層最大池化層
model.add(MaxPooling2D(pool_size=(2, 2)))
# 設立Dropout層,Dropout的概率爲0.5
model.add(Dropout(0.5))

# 重複構造,搭建深度網絡
model.add(Conv2D(128, kernel_size=(3, 3), strides=(1, 1), padding='same',
                 activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Conv2D(256, kernel_size=(3, 3), strides=(1, 1), padding='same',
                 activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))

# 把當前層節點展平
model.add(Flatten())

# 構造全連接層神經網絡層
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(10, activation='softmax'))

# -----------定義損失函數--------------
# 一般來說分類問題的損失函數都選擇採用交叉熵
model.compile(loss='categorical_crossentropy', optimizer='adagrad', metrics=['accuracy'])

# ----------放入批量樣本,進行訓練------------
model.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe)
          , epochs=20, batch_size=128)

# ----------在測試集上評價模型的準確率---------------
# verbose : 進度表示方式。0表示不顯示數據,1表示顯示進度條
scores = model.evaluate(X_test, y_test_ohe, verbose=0)

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

# 使用遷移學習的思想,以VGG16作爲模板搭建模型,訓練識別手寫字體
# 引入VGG16模塊
from keras.applications.vgg16 import VGG16

# 其次加載其他模塊
from keras.layers import Input
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.models import Model
from keras.optimizers import SGD

# 加載字體庫作爲訓練樣本
from keras.datasets import mnist

# 加載OpenCV(在命令行中窗口中輸入pip install opencv-python),這裏爲了後期對圖像的處理,
# 大家使用pip install C:\Users\28542\Downloads\opencv_python-3.4.1+contrib-cp35-cp35m-win_amd64.whl
# 比如尺寸變化和Channel變化。這些變化是爲了使圖像滿足VGG16所需要的輸入格式
import cv2
import h5py as h5py
import numpy as np

# 建立一個模型,其類型是Keras的Model類對象,我們構建的模型會將VGG16頂層去掉,只保留其餘的網絡
# 結構。這裏用include_top = False表明我們遷移除頂層以外的其餘網絡結構到自己的模型中
# VGG模型對於輸入圖像數據要求高寬至少爲48個像素點,由於硬件配置限制,我們選用48個像素點而不是原來
# VGG16所採用的224個像素點。即使這樣仍然需要24GB以上的內存,或者使用數據生成器
model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(48, 48, 3))
for layer in model_vgg.layers:
    layer.trainable = False
model = Flatten(name='flatten')(model_vgg.output)
model = Dense(4096, activation='relu', name='fc1')(model)
model = Dense(4096, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(10, activation='softmax')(model)
model_vgg_mnist = Model(inputs=model_vgg.input, outputs=model, name='vgg16')

# 打印模型結構,包括所需要的參數
model_vgg_mnist.summary()

model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
for layer in model_vgg.layers:
    layer.trainable = False
model = Flatten()(model_vgg.output)
model = Dense(4096, activation='relu', name='fc1')(model)
model = Dense(4096, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(10, activation='softmax', name='prediction')(model)
model_vgg_mnist_pretrain = Model(model_vgg.input, model, name='vgg16_pretrain')

model_vgg_mnist_pretrain.summary()

# 新的模型不需要訓練原有卷積結構裏面的1471萬個參數,但是注意參數還是來自於最後輸出層前的兩個
# 全連接層,一共有1.2億個參數需要訓練
sgd = SGD(lr=0.05, decay=1e-5)
model_vgg_mnist.compile(loss='categorical_crossentropy',
                                 optimizer=sgd, metrics=['accuracy'])

# 因爲VGG16對網絡輸入層的要求,我們用OpenCV把圖像從32*32變成224*224,把黑白圖像轉成RGB圖像
# 並把訓練數據轉化成張量形式,供keras輸入
(X_train, y_train), (X_test, y_test) = mnist.load_data("../test_data_home")
X_train, y_train = X_train[:10000], y_train[:10000]
X_test, y_test = X_test[:1000], y_test[:1000]
X_train = [cv2.cvtColor(cv2.resize(i, (48, 48)), cv2.COLOR_GRAY2RGB)
           for i in X_train]
X_train = np.concatenate([arr[np.newaxis] for arr in X_train]).astype('float32')
X_test = [cv2.cvtColor(cv2.resize(i, (48, 48)), cv2.COLOR_GRAY2RGB)
          for i in X_test]
X_test = np.concatenate([arr[np.newaxis] for arr in X_test]).astype('float32')

print(X_train.shape)
print(X_test.shape)

X_train = X_train / 255
X_test = X_test / 255


def tran_y(y):
    y_ohe = np.zeros(10)
    y_ohe[y] = 1
    return y_ohe


y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))])
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])

model_vgg_mnist.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe),
                             epochs=100, batch_size=50)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章