迁移学习简介

2021-07-01 11:07:22 浏览数 (1)

介绍

人类从小就在日常活动中成长和学习。人类通过学习一项任务来获取知识。通过使用相同的知识,我们倾向于解决相关的任务。

在实时场景中

  1. 知道如何骑自行车⮫学习如何骑摩托车
  2. 知道如何弹奏古典钢琴⮫学习如何弹奏爵士钢琴
  3. 了解数学和统计学⮫学习机器学习

机器学习中的迁移学习

传统的ML用于为提供的每个任务/域创建单独的模型。没有保存模型的知识库。迁移学习过去有一个知识库来存储针对特定任务/领域训练/利用的模型。此外,我们可以使用相同的知识来训练新模型。

为了更好地理解,请考虑将这两个可能的场景实现为

  • 在餐馆的限定区域内识别图像中的物体,例如T1
  • 从公园或café的图像中检测物体,例如T2

让我们使用传统的ML开始执行任务,我们需要创建两个模型,即Model A和Model B。其中Model A用于实现任务T1, Model B用于实现任务T2。最后,利用A和B各自的模型,可以根据业务需求检测出对象。

好吧! !如果我们采用迁移学习方法,下面的方法将会实现。如果我们开始执行任务T1,使用深度学习(TFOD, CV2等)来创建新模型,检测餐厅中的对象,最后将模型保存到知识库中。为了实现任务T2,我们不需要创建另一个新模型,而是从知识库中获取已保存的模型。从已保存的模型中,我们也可以将其用于任务T2。因此,我们可以选择迁移学习作为这一问题的最佳实现。如果任务有车道检测/交通灯检测手段,我们不能使用同一模型来训练数据。

让我们使用Python实现二元分类。这里我们使用Keras mnist数据集。用优化后的参数训练模型,最后保存模型。使用保存的模型进行二元分类。让我们看看在迁移学习的方法上是如何实现的。

代码语言:javascript复制
 import numpy as np 
 import tensorflow as tf 
 from matplotlib import pyplot as plt 
 import os 
 import time 
 import pandas as pd
 df = tf.keras.datasets.mnist
 (x_train_full,y_train_full),(x_test, y_test) = df.load_data()
 
 
 x_valid, x_train =  x_train_full[:5000]/255, x_train_full[5000:]/255
 y_valid, y_train =  y_train_full[:5000], y_train_full[5000:]
 
 x_test = x_test/255

创建模型

代码语言:javascript复制
 tf.random.set_seed(42)
 np.random.seed(42)
 
 LAYERS = [ tf.keras.layers.Flatten(input_shape=[28,28]),
           tf.keras.layers.Dense(300, kernel_initializer='he_normal'),
           tf.keras.layers.LeakyReLU(),
           tf.keras.layers.Dense(100, kernel_initializer='he_normal'),
           tf.keras.layers.LeakyReLU(),
           tf.keras.layers.Dense(10, activation='softmax')
     
 ]
 
 model = tf.keras.models.Sequential(LAYERS)
 model.compile(loss=tf.losses.sparse_categorical_crossentropy,
               optimizer=tf.keras.optimizers.SGD(0.02),
               metrics=['accuracy']
              )

训练

代码语言:javascript复制
 history = model.fit(x_train,y_train, epochs=10, validation_data=(x_valid,y_valid))
 model.save('pretrained_model_workout.h5')

迁移学习

代码语言:javascript复制
 pretrained_model = tf.keras.models.load_model('pretrained_model_workout.h5')
 pretrained_model.summary()
代码语言:javascript复制
 for layer in pretrained_model.layers[:-1]:
     layer.trainable = False
     print(f"{layer.name} - {layer.trainable}")
代码语言:javascript复制
 def updated_even_odd_labels(labels):
     for idx, label in enumerate(labels):
         labels[idx] = np.where(label % 2 == 0 , 1, 0)
     return labels

使用updated_even_odd_labels()应用训练和测试数据

代码语言:javascript复制
 y_train_bin, y_test_bin, y_valid_bin = updated_even_odd_labels([y_train, y_test, y_valid])

编译模型和训练

代码语言:javascript复制
 new_model.compile(loss=tf.losses.sparse_categorical_crossentropy,
               optimizer=tf.keras.optimizers.SGD(0.02),
               metrics=['accuracy']
              )
 new_history = new_model.fit(x_train,y_train_bin, epochs=10, validation_data=(x_valid,y_valid_bin))

验证模型

代码语言:javascript复制
 new_model.evaluate(x_test, y_test_bin)
 x_new_sample = x_test[:3]
 y_test[:3], y_test_bin[:3]
 np.argmax(new_model.predict(x_new_sample), axis=-1)

希望本文能让你对迁移学习有一个更好的认识。

感谢阅读这篇文章:)

作者:Antony Christopher

原文地址:https://antoblog.medium.com/transfer-learning-3fd39789301c

0 人点赞