当前位置:   article > 正文

Python深度学习10——Keras实现迁移学习_python使用keras迁移学习

python使用keras迁移学习

 参考书目:陈允杰.TensorFlow与Keras——Python深度学习应用实战.北京:中国水利水电出版社,2021

本系列基本不讲数学原理,只从代码角度去让读者们利用最简洁的Python代码实现深度学习方法。


迁移学习是指将那些别人研究训练好的厉害的网络拿来直接用,在自己的数据集上简单训练微调一下就可以用来做自己的数据集分类。下面展示两个网络ResNet50和MobileNet在Cifar-10上的迁移学习。都是图片分类的案例。文本类型的模型也有,但是较为复杂,以后再出。


ResNet50迁移学习

首先导入包和数据

  1. import numpy as np
  2. from keras.datasets import cifar10
  3. from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
  4. from tensorflow.keras.applications import MobileNet
  5. from keras.models import Sequential
  6. from keras.layers import Dense, Dropout, GlobalAveragePooling2D
  7. from tensorflow.keras.utils import to_categorical
  8. from PIL import Image
  9. # 指定乱数种子
  10. seed = 10
  11. np.random.seed(seed)
  12. # 载入数据集
  13. (X_train, Y_train), (X_test, Y_test) = cifar10.load_data()
  14. # 打乱 2 个 Numpy 阵列
  15. def randomize(a, b):
  16. permutation = list(np.random.permutation(a.shape[0]))
  17. shuffled_a = a[permutation]
  18. shuffled_b = b[permutation]
  19. return shuffled_a, shuffled_b

由于数据量太大,只取10%数据

  1. X_train, Y_train = randomize(X_train, Y_train)
  2. X_test, Y_test = randomize(X_test, Y_test)
  3. # 取出10%训练, 10%测试
  4. X_train = X_train[:5000]
  5. Y_train = Y_train[:5000]
  6. X_test = X_test[:1000]
  7. Y_test = Y_test[:1000]
  8. # One-hot编码
  9. Y_train = to_categorical(Y_train, 10)
  10. Y_test = to_categorical(Y_test, 10)

进行训练,将迁移模型对数据进行转化

  1. # 载入ResNet50 模型
  2. resnet_model = ResNet50(weights="imagenet",
  3. include_top=False,
  4. input_shape=(200, 200, 3))
  5. # 调整X_train的图片尺寸
  6. print("调整X_train的图片尺寸...")
  7. X_train_new = np.array(
  8. [np.asarray(Image.fromarray(X_train[i]).resize(
  9. (200, 200))) for i in range(0, len(X_train))])
  10. X_train_new = X_train_new.astype("float32")
  11. # 训练数据的数据前处理
  12. train_input = preprocess_input(X_train_new)
  13. # 使用 ResNet50 模型预测训练数据的特征数据
  14. print("使用 ResNet50 模型预测训练数据的特征数据 ...")
  15. train_features = resnet_model.predict(train_input)

测试集一样

  1. # 调整X_test的图片尺寸
  2. print("调整X_test的图片尺寸...")
  3. X_test_new = np.array([np.asarray(Image.fromarray(X_test[i]).resize((200, 200))) for i in range(0, len(X_test))])
  4. X_test_new = X_test_new.astype("float32")
  5. # 测试数据的数据前处理
  6. test_input = preprocess_input(X_test_new)
  7. # 使用 ResNet50 模型预测测试数据的特征数据
  8. print("使用 ResNet50 模型预测测试数据的特征数据 ...")
  9. test_features = resnet_model.predict(test_input)

构建并训练分类模型

  1. # 定义模型
  2. model = Sequential()
  3. model.add(GlobalAveragePooling2D(
  4. input_shape=train_features.shape[1:]))
  5. model.add(Dropout(0.5))
  6. model.add(Dense(10, activation="softmax"))
  7. #编译模型
  8. model.compile(loss="categorical_crossentropy", optimizer="adam",metrics=["accuracy"])
  9. #训练模型
  10. history = model.fit(train_features, Y_train,validation_data=(test_features, Y_test),
  11. epochs=14, batch_size=32, verbose=1)

评估

  1. # 评估模型
  2. print("\nTesting ...")
  3. loss, accuracy = model.evaluate(test_features, Y_test)
  4. print("测试数据集的准确度 = {:.2f}".format(accuracy))

画损失变化

  1. #显示图表来分析模型的训练过程
  2. import matplotlib.pyplot as plt
  3. # 显示训练和验证损失
  4. loss = history.history["loss"]
  5. epochs = range(1, len(loss)+1)
  6. val_loss = history.history["val_loss"]
  7. plt.plot(epochs, loss, "bo-", label="Training Loss")
  8. plt.plot(epochs, val_loss, "ro--", label="Validation Loss")
  9. plt.title("Training and Validation Loss")
  10. plt.xlabel("Epochs")
  11. plt.ylabel("Loss")
  12. plt.legend()
  13. plt.show()

画准确率变化

  1. # 显示训练和验证准确度
  2. acc = history.history["accuracy"]
  3. epochs = range(1, len(acc)+1)
  4. val_acc = history.history["val_accuracy"]
  5. plt.plot(epochs, acc, "bo-", label="Training Acc")
  6. plt.plot(epochs, val_acc, "ro--", label="Validation Acc")
  7. plt.title("Training and Validation Accuracy")
  8. plt.xlabel("Epochs")
  9. plt.ylabel("Accuracy")
  10. plt.legend()
  11. plt.show()

MobileNet迁移学习

前面预处理是一样的,就是模型预训练和定义不一样:

  1. mobilenet_model = MobileNet(weights="imagenet",
  2. include_top=False,
  3. input_shape=(224, 224, 3))
  4. #调整X_train的图片尺寸
  5. print("调整X_train的图片尺寸...")
  6. X_train_new = np.array(
  7. [np.asarray(Image.fromarray(X_train[i]).resize(
  8. (224, 224))) for i in range(0, len(X_train))])
  9. X_train_new = X_train_new.astype("float32")
  10. # 训练数据的数据前处理
  11. train_input = preprocess_input(X_train_new)
  12. # 调整X_test的图片尺寸
  13. print("调整X_test的图片尺寸...")
  14. X_test_new = np.array(
  15. [np.asarray(Image.fromarray(X_test[i]).resize(
  16. (224, 224))) for i in range(0, len(X_test))])
  17. X_test_new = X_test_new.astype("float32")
  18. # 测试数据的数据前处理
  19. test_input = preprocess_input(X_test_new)
  1. # 定义模型
  2. model = Sequential()
  3. model.add(mobilenet_model)
  4. model.add(Dropout(0.5))
  5. model.add(GlobalAveragePooling2D())
  6. model.add(Dropout(0.5))
  7. model.add(Dense(10, activation="softmax"))
  8. model.summary() # 示模型摘要资讯
  9. # 冻结上层模型
  10. mobilenet_model.trainable = False
  11. # 编译模型
  12. model.compile(loss="categorical_crossentropy", optimizer="adam",
  13. metrics=["accuracy"])

后面的评估也是一样的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/866112
推荐阅读
相关标签
  

闽ICP备14008679号