模型介绍参看:博文
VGG16
迁移模型
先看看标准答案
import tensorflow as tf
from tensorflow import keras
base_model = keras.applications.VGG16(weights='imagenet')
base_model.summary()
自建模型
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models, Input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout
def VGG16(nb_classes, input_shape):
input_tensor = Input(shape=input_shape)
# 1st block
x = Conv2D(64, (3,3), activation='relu', padding='same',name='conv1a')(input_tensor)
x = Conv2D(64, (3,3), activation='relu', padding='same',name='conv1b')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool1')(x)
# 2nd block
x = Conv2D(128, (3,3), activation='relu', padding='same',name='conv2a')(x)
x = Conv2D(128, (3,3), activation='relu', padding='same',name='conv2b')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool2')(x)
# 3rd block
x = Conv2D(256, (3,3), activation='relu', padding='same',name='conv3a')(x)
x = Conv2D(256, (3,3), activation='relu', padding='same',name='conv3b')(x)
x = Conv2D(256, (3,3), activation='relu', padding='same',name='conv3c')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool3')(x)
# 4th block
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv4a')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv4b')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv4c')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool4')(x)
# 5th block
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv5a')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv5b')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv5c')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool5')(x)
# full connection
x = Flatten()(x)
x = Dense(4096, activation='relu', name='fc6')(x)
# x = Dropout(0.5)(x)
x = Dense(4096, activation='relu', name='fc7')(x)
# x = Dropout(0.5)(x)
output_tensor = Dense(nb_classes, activation='softmax', name='fc8')(x)
model = Model(input_tensor, output_tensor)
return model
model=VGG16(1000, (224, 224, 3))
model.summary()
VGG19
相比VGG16在3-5block分别增加了一层卷积层
迁移模型
import tensorflow as tf
from tensorflow import keras
base_model = keras.applications.VGG19(weights='imagenet')
base_model.summary()
自建模型
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, models, Input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout
def VGG19(nb_classes, input_shape):
input_tensor = Input(shape=input_shape)
# 1st block
x = Conv2D(64, (3,3), activation='relu', padding='same',name='conv1a')(input_tensor)
x = Conv2D(64, (3,3), activation='relu', padding='same',name='conv1b')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool1')(x)
# 2nd block
x = Conv2D(128, (3,3), activation='relu', padding='same',name='conv2a')(x)
x = Conv2D(128, (3,3), activation='relu', padding='same',name='conv2b')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool2')(x)
# 3rd block
x = Conv2D(256, (3,3), activation='relu', padding='same',name='conv3a')(x)
x = Conv2D(256, (3,3), activation='relu', padding='same',name='conv3b')(x)
x = Conv2D(256, (3,3), activation='relu', padding='same',name='conv3c')(x)
x = Conv2D(256, (3,3), activation='relu', padding='same',name='conv3d')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool3')(x)
# 4th block
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv4a')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv4b')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv4c')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv4d')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool4')(x)
# 5th block
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv5a')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv5b')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv5c')(x)
x = Conv2D(512, (3,3), activation='relu', padding='same',name='conv5d')(x)
x = MaxPooling2D((2,2), strides=(2,2), name = 'pool5')(x)
# full connection
x = Flatten()(x)
x = Dense(4096, activation='relu', name='fc6')(x)
# x = Dropout(0.5)(x)
x = Dense(4096, activation='relu', name='fc7')(x)
# x = Dropout(0.5)(x)
output_tensor = Dense(nb_classes, activation='softmax', name='fc8')(x)
model = Model(input_tensor, output_tensor)
return model
model=VGG19(1000, (224, 224, 3))
model.summary()