使用Keras來搭建VGG網路

2021-09-03 02:07:50 字數 3772 閱讀 3401

上述vgg網路結構圖

vgg網路是在very deep convolutional network for large-scale image recognition這篇**中提出,vgg是2023年被提出的,與之前的state-of-the-art的網路結構,錯誤率大幅下降,並取得了ilsvrc2014比賽分類專案的第二名和定位專案的第一名。同時,vgg的拓展性很強,遷移到其他資料上的泛化性非常好。vgg的結構簡潔,整個網路都使用同樣大小的卷積核尺寸(3x3)和最大池化尺寸(2x2)。到目前為止,vgg仍然被用來提取影象特徵。

記下來我們主要是通過keras深度學習框架來實現以下vgg網路

步驟一:匯入相應的庫

from keras import sequential

from keras.layers import conv2d,maxpooling2d,flatten,softmax,activation,dense

from keras.utils.np_utils import to_categorical

from keras.datasets import mnist

from sklearn.metrics import recall_score,f1_score,precision_score

步驟二:載入資料集
data=mnist.load_data()

(x_train,y_train),(x_test,y_test)=data

x_train=x_train.reshape(-1,28,28,1) #這裡我們使用的是黑白

x_test=x_test.reshape(-1,28,28,1)

y_train=to_categorical(y_train,num_classes=10)

y_test=to_categorical(y_test,num_classes=10)

步驟三:搭建模型
def vgg(x,y):

model=sequential()

#layer_1

model.add(conv2d(64,(3,3),strides=(1,1),input_shape=x.shape[1:],padding='same',data_format='channels_last',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(64,(3,3),strides=(1,1),padding='same',data_format='channels_last',kernel_initializer='uniform',activation='relu'))

model.add(maxpooling2d((2,2)))

#layer_2

model.add(conv2d(128,(3,3),strides=(1,1),padding='same',data_format='channels_last',activation='relu',kernel_initializer='uniform'))

model.add(conv2d(128,(2,2),strides=(1,1),padding='same',data_format='channels_last',activation='relu',kernel_initializer='uniform'))

model.add(maxpooling2d((2,2)))

#layer_3

model.add(conv2d(256,(3,3),strides=(1,1),padding='same',data_format='channels_last',activation='relu'))

model.add(conv2d(256,(3,3),strides=(1,1),padding='same',data_format='channels_last',activation='relu'))

model.add(conv2d(256, (1, 1), strides=(1, 1), padding='same', data_format='channels_last', activation='relu'))

model.add(maxpooling2d((2,2)))

#layer_4

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',data_format='channels_last',activation='relu'))

model.add(conv2d(512, (3, 3), strides=(1, 1), padding='same', data_format='channels_last', activation='relu'))

model.add(conv2d(512, (1,1), strides=(1, 1), padding='same', data_format='channels_last', activation='relu'))

model.add(maxpooling2d((2,2)))

#layer_5

model.add(conv2d(512,(3,3),strides=(1,1),padding='same',data_format='channels_last',activation='relu'))

model.add(conv2d(512, (3, 3), strides=(1, 1), padding='same', data_format='channels_last', activation='relu'))

model.add(conv2d(512, (1,1), strides=(1, 1), padding='same', data_format='channels_last', activation='relu'))

model.add(maxpooling2d((2,2)))

model.add(flatten()) #拉平

model.add(dense(4096,activation='relu'))

model.add(dense(4096,activation='relu'))

model.add(dense(1000,activation='relu'))

model.add(dense(10,activation='softmax'))

model.summary()

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

return model

步驟四:執行模型
if __name__=="__main__":

model=vgg(x_train,y_train)

model.fit(x_train,y_train,batch_size=128,epochs=10)

y_predict=model.predict(x_train)

print(y_predict)

loss,acc=model.evaluate(x_test,y_test)

print(loss,acc)

結果表明,vgg在分類和特徵提取方面有著很大的優勢,這是進行了10個epoch的結果。

使用Keras提供的VGG16來提取feature

直接上code import os import h5py from tqdm import tqdm import tensorflow as tf from tensorflow.keras.preprocessing import image from tensorflow.keras.mod...

使用 Keras 搭建 DNN

from keras.datasets import mnist import numpy as np x train,y train x test,y test mnist.load data print np.shape x train np.shape x test 60000,28,28 1...

Keras搭建神經網路 網路結構

layer.get weights 用於返回層的權重 layer.set weights weights 用於從numpy array中將權重載入到該層中,要求numpy array的形狀與layer.get weights 返回的形狀相同 layer.get config 用於返回當前層配置資訊的...