迁移学习

http://c.biancheng.net/view/1934.html

  主要在这里大致了解了一下keras的使用。

  迁移学习,说实话还没有很好地掌握。

  这里使用了训练好的VGG网络,而且禁用了前面15层的网络的参数的训练。

迁移学习应该就是使用已有的训练好的神经网络来训练新的神经网络吧。

  还是看知乎:https://www.zhihu.com/question/345745588

 

 

本程序可以通过VGG16网络,来迁移学习实现区别猫狗的功能。

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import applications

from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import optimizers
from tensorflow.keras.models import Sequential,Model
from tensorflow.keras.layers import Dropout,Flatten,Dense


img_width ,img_height =256,256
batch_size=16
epochs=50

train_data_dir='data/dogs_and_cats/train'    #训练集目录
validation_data_dir='data/dogs_and_cats/validation'  #测试集目录

OUT_CATEGORIES = 1  # 分类数


#训练样本数和测试样本数是自己设定的

nb_train_samples=2000    #训练样本数
nb_validation_samples=200    #验证样本数
#https://blog.csdn.net/lly1122334/article/details/88660053

base_model = keras.applications.VGG16(weights="imagenet", include_top=False,
                                input_shape=(img_width, img_height, 3))

print(base_model.summary())


#冻结VGG16网络的前15层
keras.layers.trainable=False

#为了分类添加一组自定义的顶层
top_model=Sequential()  #keras中的sequential可以用来构建计算图

#flatten层,将类似(-1,3,32,64)的张量转变为(-1,6144) ,该过程不改变batch数量
#flatten 操作常用于卷积层到全连接层的过渡。
top_model.add(Flatten(input_shape=base_model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))  # 全连接层,输入像素256
top_model.add(Dropout(0.5))  # Dropout概率0.5
top_model.add(Dense(OUT_CATEGORIES, activation='sigmoid'))  # 输出层,二分类

# top_model.load_weights("")  # 单独训练的自定义网络

model = Model(inputs=base_model.input, outputs=top_model(base_model.output))  # 新网络=预训练网络+自定义网络

model.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(lr=0.0001, momentum=0.9),
              metrics=['accuracy'])  # 损失函数为二进制交叉熵,优化器为SGD

train_datagen = ImageDataGenerator(rescale=1. / 255, horizontal_flip=True)  # 训练数据预处理器,随机水平翻转
test_datagen = ImageDataGenerator(rescale=1. / 255)  # 测试数据预处理器
train_generator = train_datagen.flow_from_directory(
    train_data_dir, 
    target_size=(img_height, img_width),
    batch_size=batch_size, 
    class_mode='binary')  # 训练数据生成器
validation_generator = test_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(img_height, img_width),
    batch_size=batch_size, 
    class_mode='binary',
    shuffle=False)  # 验证数据生成器


checkpointer = keras.callbacks.ModelCheckpoint(filepath='dogcatmodel.h5', verbose=1, save_best_only=True)  # 保存最优模型

# 训练&评估
model.fit_generator(
    train_generator, 
    steps_per_epoch=nb_train_samples // batch_size, 
    epochs=epochs,
    validation_data=validation_generator, 
    validation_steps=nb_validation_samples // batch_size,
    verbose=2, workers=12, 
    callbacks=[checkpointer])  # 每轮一行输出结果,最大进程12

 

posted @ 2021-10-01 21:58  TheDa  阅读(60)  评论(0编辑  收藏  举报