迁移学习简介

介绍

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

在实时场景中

  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数据集。用优化后的参数训练模型,最后保存模型。使用保存的模型进行二元分类。让我们看看在迁移学习的方法上是如何实现的。

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

创建模型

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']
             )

训练

history = model.fit(x_train,y_train, epochs=10, validation_data=(x_valid,y_valid))
model.save('pretrained_model_workout.h5')

迁移学习

pretrained_model = tf.keras.models.load_model('pretrained_model_workout.h5')
pretrained_model.summary()

for layer in pretrained_model.layers[:-1]:
    layer.trainable = False
    print(f"{layer.name} - {layer.trainable}")

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()应用训练和测试数据

y_train_bin, y_test_bin, y_valid_bin = updated_even_odd_labels([y_train, y_test, y_valid])

编译模型和训练

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))

验证模型

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

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值