VGG16 结构 使用TensorFlows实现
def VGG16(input_shape=(224,224,3)): model = keras.Sequential([ keras.Input(shape=input_shape), layers.Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), #这里不same,则尺寸减半 layers.Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu'), layers.Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu'), layers.Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Flatten(),#展平 layers.Dense(units=4096, activation='relu'), layers.Dense(units=4096, activation='relu'), layers.Dense(units=4096, activation='softmax') ]) model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy'] ) return model 在猫、狗二分类数据集上进行训练,测试,这里我们使用的是内置的预训练好的VGG16,进行微调即可
我们去掉了预训练的输出层(3个全连接层)
原vgg16
处理后的vgg16
# 设置测试集,训练集目录 test_dir="../input/dogs-cats-images/dog vs cat/dataset/test_set"train_dir="../input/dogs-cats-images/dog vs cat/dataset/training_set" train_dir_cats = train_dir + '/cats' train_dir_dogs = train_dir + '/dogs' test_dir_cats = test_dir + '/cats' test_dir_dogs = test_dir + '/dogs' # Preview first few images展示前6张图片 preview_cats = ["/cat.1.jpg", "/cat.10.jpg", "/cat.100.jpg", "/cat.1000.jpg", "/cat.1001.jpg", "/cat.1002.jpg"] preview_dogs = ["/dog.1.jpg", "/dog.10.jpg", "/dog.100.jpg", "/dog.1000.jpg", "/dog.1001.jpg", "/dog.1002.jpg"] print('Cats') plt.figure(figsize=(10,8)) #10,8 英寸 for i in range(6): im_cat = load_img(train_dir_cats + preview_cats[i]) plt.subplot(2, 3, i+1) #展示几行 每行展示几列 i+1 为图所在的子网格位置 plt.imshow(im_cat) plt.axis('off') plt.show() print('Dogs') plt.figure(figsize=(10,8)) for i in range(6): im_dog = load_img(train_dir_dogs + preview_dogs[i]) ax = plt.subplot(1, 6, i+1) plt.imshow(im_dog) plt.axis('off')#关闭当前子图的坐标轴、刻度和标签 plt.show() 数据加载: ImageDataGenerator 配合 flow_from_directory 方法,自动完成了将 ‘Cat’ 和 ‘Dog’ 文件夹名称转换为数字标签 0 和 1 的过程。
...