1. 程式人生 > >深度學習:keras學習

深度學習:keras學習

Keras TensorFlow教程 :如何從零開發一個複雜深度學習模型:https://segmentfault.com/a/1190000012645225

keras概念解釋:http://www.zhiding.cn/techwalker/documents/J9UpWRDfVYHE5TpbHCymkImFpP0OoHVVCrj3TSQuhA

1. Keras基礎知識

在Keras中主要的資料結構是 model ,該結構定義了一個完整的圖。你可以向已經存在的圖中加入任何的網路結構。

import keras

Keras 有兩種不同的建模方式:

  1. Sequential models:
    這種方法用於實現一些簡單的模型。你只需要向一些存在的模型中新增層就行了。
  2. Functional API:Keras的API是非常強大的,你可以利用這些API來構造更加複雜的模型,比如多輸出模型,有向無環圖等等。

1. 卷積層

這裡我們使用一個卷積層,64個卷積核,維度是3*3的,之後採用 relu 啟用函式進行啟用,輸入資料的維度是 100*100*32。注意,如果是第一個卷積層,那麼必須加上輸入資料的維度,後面幾個這個引數可以省略。

model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32)))

2. MaxPooling 層

指定圖層的型別,並且指定赤的大小,然後自動完成赤化操作,酷斃了!

model.add(MaxPooling2D(pool_size=(2,2)))

3. 全連線層

這個層在 Keras 中稱為被稱之為 Dense 層,我們只需要設定輸出層的維度,然後Keras就會幫助我們自動完成了。

model.add(Dense(256, activation='relu'))

4. Dropout

model.add(Dropout(0.5))

5. 扁平層

model.add(Flatten())

資料輸入

網路的第一層需要讀入訓練資料。因此我們需要去制定輸入資料的維度。因此,input_shape

引數被用於制定輸入資料的維度大小。

model.add(Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 3)))

在這個例子中,資料輸入的第一層是一個卷積層,輸入資料的大小是 224*224*3 。

以上操作就幫助你利用序列模型構建了一個模型。接下來,讓我們學習最重要的一個部分。一旦你指定了一個網路架構,你還需要指定優化器和損失函式。我們在Keras中使用compile函式來達到這個功能。比如,在下面的程式碼中,我們使用 rmsprop來作為優化器,binary_crossentropy 來作為損失函式值。

model.compile(loss='binary_crossentropy', optimizer='rmsprop')

如果你想要使用隨機梯度下降,那麼你需要選擇合適的初始值和超引數:

from keras.optimizers import SGD
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

現在,我們已經構建完了模型。接下來,讓我們向模型中輸入資料,在Keras中是通過 fit 函式來實現的。你也可以在該函式中指定 batch_size 和 epochs 來訓練。

model.fit(x_train, y_train, batch_size = 32, epochs = 10, validation_data(x_val, y_val))

最後,我們使用 evaluate 函式來測試模型的效能。

score = model.evaluate(x_test, y_test, batch_size = 32)

 

 

 

在本文的下一節中,我們將學習Keras的Sequential models 和 Functional API的理論和例項。

VGG-16  224*224*3 的輸入資料

img_input = Input(shape=input_shape)
# Block 1
x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)
x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

# Block 2
x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

# Block 3
x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)

# Block 4
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

# Block 5
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)

x = Flatten(name='flatten')(x)
x = Dense(4096, activation='relu', name='fc1')(x)
x = Dense(4096, activation='relu', name='fc2')(x)
x = Dense(classes, activation='softmax', name='predictions')(x)

或者

sequential 

def VGG_16(weights_path=None):
    model = Sequential()
    model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))
    model.add(Convolution2D(64, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(64, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(128, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(128, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(256, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(ZeroPadding2D((1,1)))
    model.add(Convolution2D(512, 3, 3, activation='relu'))
    model.add(MaxPooling2D((2,2), strides=(2,2)))

    model.add(Flatten())
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4096, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1000, activation='softmax'))

    if weights_path:
        model.load_weights(weights_path)

    return model