使用Keras来搭建VGG网络

上述VGG网络结构图

VGG网络是在Very Deep Convolutional Network For Large-Scale Image Recognition这篇论文中提出,VGG是2014年被提出的,与之前的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来搭建VGG网络

相关文章:

  • 2021-12-06
  • 2021-08-27
  • 2021-08-16
  • 2021-12-07
  • 2021-06-02
  • 2022-12-23
  • 2021-12-04
猜你喜欢
  • 2021-12-05
  • 2021-11-06
  • 2021-11-23
  • 2021-07-19
  • 2021-12-26
相关资源
相似解决方案