介绍
人类从小就在日常活动中成长和学习。人类通过学习一项任务来获取知识。通过使用相同的知识,我们倾向于解决相关的任务。
在实时场景中
- 知道如何骑自行车⮫学习如何骑摩托车
- 知道如何弹奏古典钢琴⮫学习如何弹奏爵士钢琴
- 了解数学和统计学⮫学习机器学习
机器学习中的迁移学习
传统的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