深度學習:keras學習
Keras TensorFlow教程 :如何從零開發一個複雜深度學習模型:https://segmentfault.com/a/1190000012645225
keras概念解釋:http://www.zhiding.cn/techwalker/documents/J9UpWRDfVYHE5TpbHCymkImFpP0OoHVVCrj3TSQuhA
1. Keras基礎知識
在Keras中主要的資料結構是 model ,該結構定義了一個完整的圖。你可以向已經存在的圖中加入任何的網路結構。
import keras
Keras 有兩種不同的建模方式:
- Sequential models:
- 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