📜  keras 迁移学习 - Python (1)

📅  最后修改于: 2023-12-03 15:32:28.042000             🧑  作者: Mango

Keras 迁移学习 - Python

Keras 是一种高级深度学习框架,迁移学习(Transfer Learning)是一种机器学习技术,将一个已训练好的模型应用到一个新的、相关的问题中。在本文中,我们将探讨如何使用 Keras 进行迁移学习。

使用预训练模型

Keras 中已经实现了很多流行的深度学习模型,它们已经在大型数据集上进行了训练。我们可以利用这些预训练模型,通过微调(Fine-tuning)或特征提取(Feature Extraction)的方式,将其应用到我们自己的问题中。

微调

微调是指根据我们的具体问题,冻结已训练模型的一部分层次结构,只对冻结后的层次结构进行训练。这通常用于针对类似问题的扩展训练,以使模型具有更高的性能。

以下是使用预训练模型进行微调的示例代码:

from keras.applications import VGG16, imagenet_utils
from keras.layers import Input, Flatten, Dense
from keras.models import Model
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator

# 加载预训练模型
base_model = VGG16(weights='imagenet', include_top=False, input_tensor=Input(shape=(224, 224, 3)))

# 冻结预训练模型的部分层
for layer in base_model.layers[:-4]:
    layer.trainable = False

# 添加新的分类层
x = base_model.output
x = Flatten()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)

# 编译模型
sgd = SGD(lr=0.001)
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])

# 加载数据
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory('train', target_size=(224, 224), batch_size=32, class_mode='categorical')
test_generator = test_datagen.flow_from_directory('test', target_size=(224, 224), batch_size=32, class_mode='categorical')

# 训练模型
model.fit_generator(train_generator, epochs=10, validation_data=test_generator)
特征提取

特征提取是指使用已训练模型从新数据中提取特征向量,通过新的分类器进行分类。这通常用于针对类似问题的迁移训练,但使用的是分类器。

以下是使用预训练模型进行特征提取的示例代码:

from keras.applications import VGG16, imagenet_utils
from keras.layers import Input, Flatten, Dense
from keras.models import Model
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator

# 加载预训练模型
base_model = VGG16(weights='imagenet', include_top=False, input_tensor=Input(shape=(224, 224, 3)))

# 获取特征向量
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory('train', target_size=(224, 224), batch_size=32, class_mode=None, shuffle=False)
test_generator = test_datagen.flow_from_directory('test', target_size=(224, 224), batch_size=32, class_mode=None, shuffle=False)
train_features = base_model.predict_generator(train_generator, steps=train_generator.samples/train_generator.batch_size)
test_features = base_model.predict_generator(test_generator, steps=test_generator.samples/test_generator.batch_size)

# 将特征向量保存
import numpy as np
np.save('train_features.npy', train_features)
np.save('test_features.npy', test_features)

# 使用特征向量进行分类
train_data = np.load('train_features.npy')
train_labels = train_generator.classes
test_data = np.load('test_features.npy')
test_labels = test_generator.classes
train_labels = to_categorical(train_labels, num_classes=2)
test_labels = to_categorical(test_labels, num_classes=2)

# 添加新的分类层
x = Flatten()(train_data)
x = Dense(1024, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)

# 编译模型
sgd = SGD(lr=0.001)
model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型
model.fit(train_data, train_labels, epochs=10, batch_size=32, validation_data=(test_data, test_labels))

迁移学习已经成为深度学习领域的主要技术之一,它使得在小量数据上进行训练变得更加简单和高效。Keras 提供了许多优秀的预训练模型,可以在各种问题上实现迁移学习。