迁移学习&domain adaption

本文介绍了迁移学习的基本概念,重点讨论了在卷积神经网络(CNN)中的应用方法。包括从头学习、特征提取及微调等技术,并提出了选择合适迁移学习方法的依据。同时,文章还提供了一些实用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



一 概念:


(1)learning from scratch  即学一个CNN网络with random initialization


  (2)  在新的学习任务中,可以利用现有训练好的imagenet网络提取特征,去掉最后一个分类的全连接层,在classifier层之前提取4096维的特征,这些特征称为CNN code


(3)在CNN网络结构中,前面的卷积层保留更多的普遍特征 generic features(edge detectors 或者corlor blob detectors),后面的卷积层包含更多的 task specific 特征


二 迁移学习的两种方法:


 (1)利用已有的model提取特征,后面再训练分类器,比如linear svm或者softmax classifier。


 (2)finetune 已有的model: 即在已训练好参数的CNN结构上,利用自己的数据进行back propagation, finetune网络已有的weights.


      (可以finetune 整个CNN ,也可以保持前面的一些层的参数不变,只finetune网络的高层部分,这样做可以防止过拟合)


三  迁移学习方法的选择:


    主要取决于数据集的大小,以及与之前预训练数据集的相关性


(1)数据集很小,与预训练数据集相似: 直接提特征,提最后一层的CNN code, 训练linear 分类器


 (2) 数据集很小,与预训练数据集不同: 在前面的网络层中提feature,训练线性分类器


(3)数据集很大,与预训练数据相似:finetune 整个网络层


(4)数据集很大,与预训练数据不同:可以learning from scratch,也可以在预训练的model上finetune


四 一些实用的建议:


(1)finetune的时候输入图片的大小不受限制,因为forward function的与输入的spatial 大小无关,只要stride能fit


(2)把需要finetune的网络层的学习率设低一点: 因为我们默认预训练的model的参数已经很好了,因此在finetune优化的时候采取小的学习率




迁移学习

CNN for Visual Rcognition --- Stanford 2015 (二)

迁移学习的相关概念

迁移学习论文杂读(门外汉级)


Sinno Jialin Pan, Qiang Yang, A Survey on Transfer Learning, IEEE Transactions on Knowledge and Data Engineering (IEEE TKDE)




此外在下面的这个链接中还有一些开源的软件和数据库:


http://www.cse.ust.hk/TL/index.html


迁移学习( Transfer Learning )




https://kwotsin.github.io/tech/2017/02/11/transfer-learning.html






以下是使用DANN(Domain Adaption Neural Network)进行风力发电预测的代码示例。该模型使用了迁移学习技术,将在一个领域(源域)训练的模型应用于另一个领域(目标域)中。这个例子中,我们将在一个地区收集的风力数据作为源域,然后将模型应用于另一个地区的风力数据作为目标域,以预测风力发电量。 首先,我们需要导入必要的库: ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from keras.models import Sequential, Model from keras.layers import Dense, Input, Concatenate from keras.optimizers import Adam from keras.callbacks import ModelCheckpoint ``` 然后我们可以读入源域和目标域的数据: ```python # 读入源域数据 source_data = pd.read_csv('source_data.csv') source_data = source_data.drop('date', axis=1) # 删除日期列 # 读入目标域数据 target_data = pd.read_csv('target_data.csv') target_data = target_data.drop('date', axis=1) # 删除日期列 ``` 接下来,我们需要将源域和目标域的数据进行预处理。在这个例子中,我们将使用标准化将数据缩放到相同的范围内: ```python # 将数据分为特征和目标 source_features = source_data.drop('power', axis=1) source_target = source_data['power'] target_features = target_data.drop('power', axis=1) target_target = target_data['power'] # 对特征进行标准化 scaler = StandardScaler() source_features = scaler.fit_transform(source_features) target_features = scaler.transform(target_features) ``` 然后,我们可以定义 DANN 模型。DANN 模型由三个部分组成:共享层,源域特定层和目标域特定层。共享层和源域特定层用于在源域数据上训练模型,而共享层和目标域特定层用于在目标域数据上进行预测。 ```python # 定义共享层 shared_layer = Sequential() shared_layer.add(Dense(32, input_dim=7, activation='relu')) shared_layer.add(Dense(16, activation='relu')) # 定义源域特定层 source_specific_layer = Sequential() source_specific_layer.add(Dense(8, input_dim=16, activation='relu')) source_specific_layer.add(Dense(1)) # 定义目标域特定层 target_specific_layer = Sequential() target_specific_layer.add(Dense(8, input_dim=16, activation='relu')) target_specific_layer.add(Dense(1)) # 定义DANN模型 input_layer = Input(shape=(7,)) shared = shared_layer(input_layer) source_specific = source_specific_layer(shared) target_specific = target_specific_layer(shared) output_layer = Concatenate()([source_specific, target_specific]) dann_model = Model(inputs=[input_layer], outputs=[output_layer]) ``` 接下来,我们需要定义损失函数。在 DANN 中,我们使用两个损失函数:源域损失和域分类损失。源域损失用于在源域数据上训练模型,而域分类损失用于在目标域数据上进行预测。 ```python # 源域损失 source_loss = 'mean_squared_error' # 域分类损失 def domain_loss(y_true, y_pred): # y_true: 1表示源域, 0表示目标域 # y_pred: 域分类器的预测 return K.mean(y_true * K.square(y_pred) + (1 - y_true) * K.square(1 - y_pred)) # 总损失 def total_loss(y_true, y_pred): return source_loss(y_true, y_pred[:, 0]) + domain_loss(y_true, y_pred[:, 1]) ``` 然后,我们可以编译模型,并在源域数据上训练模型: ```python # 编译模型 dann_model.compile(optimizer=Adam(lr=0.001), loss=total_loss, metrics=[source_loss, domain_loss]) # 训练模型 dann_model.fit(source_features, np.column_stack((source_target, np.zeros(len(source_target)))), epochs=100, batch_size=32) ``` 在模型训练完成后,我们可以使用目标域数据进行预测: ```python # 在目标域数据上进行预测 target_predictions = target_specific_layer.predict(target_features) ``` 然后,我们可以使用预测的目标值和实际目标值之间的均方误差来评估模型的性能: ```python # 计算目标域数据的均方误差 mse = np.mean(np.square(target_predictions - target_target)) print("目标域数据的均方误差为:", mse) ``` 这就是使用 DANN 进行风力发电预测的代码示例。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值