当前位置:   article > 正文

迁移混合模型_混合迁移

混合迁移

迁移学习(transfer learning)

以已经训练好的模型A为起点,在新场景中,根据新数据建立模型B。

目的:将某个领域或任务上学习到的知识或模型,应用到不同但相关的领域或问题中

模型A存储了模型结构,权重系数(‘weights’),模型B基于新数据,实现了对模型A的部分结构或权重系数的更新

  • 迁移学习的具体方法有:
    • 1.特征提取:使用模型A,移除输出层,提取目标特征信息
    • 2.结构引用:使用模型A的结构,重新/二次训练权重系数参数
    • 3.部分训练:使用模型A的结构,重新训练部分层的权重系数参数

在方法的选择中,不要局限于某种方式:

在线学习(online learning)

给已经训练好的模型输入新的数据,模型将进行更新,适应新数据的趋势

目的:针对新数据,在不需要对全数据集进行再次训练的基础上,实现模型更新

适用场景:场景中有连续的数据流

特点:不改变模型结构,更新新数据跟新权重系数

新数据(x,y)输入后,对模型的系数更新(类似梯度下降):

temp_{\theta _{j}} = \theta _{j} - \alpha *(y_{predict} - y) * x_{j}

\theta _{j} = temp_{j}

半监督学习(Semi-Supervised Learning)

监督学习与无监督学习相结合的一种学习方法,它同时利用有标记样本与无标记样本进行学习

目的:在标记样本优先的情况下,尽可能识别出总样本的共同特性

  • 伪标签学习:用有标签数据训练一个分类器,然后用这个分类器对无标签数据进行分类,产生伪标签(pseudo label),按一定规则挑选出认为分类正确的无标签样本,将其与有标签样本作为数据分类器进行训练

  • 半监督学习不局限于某种特定的方式,实现监督+无监督的灵活运用!
  • 有标签数据提取的半监督学习:
    • 用有标签数据训练网络
    • 通过隐藏层提取特征,基于特征数据对无标签数据进行预测

机器学习+深度学习

当单一的学习模型无法有效解决问题时,我们采用混合模型,灵活运用

  • 监督学习+无监督学习+机器学习+深度学习

实战(一):基于新数据的迁移学习预测

任务:基于csv格式数据,建立mlp模型,再实现模型迁移学习:

1.实现x对y的预测,可视化结果

2.基于新数据csv,对前模型进行二次训练,对比模型训练次数少的情况下的表现

模型结构:mlp,两个隐藏层,每层50个神经元,激活函数relu,输出层激活函数linear,迭代次数:100次

  • 核心代码:
  1. #建立mlp模型:
  2. from keras.models import Sequential
  3. from keras.layers import Dense
  4. model = Sequential()
  5. model.add(Dense(units=50,input_dim = 1,activation = 'relu'))
  6. model.add(Dense(units=50,activation='relu'))
  7. model.add(Dense(units=1,activation='linear'))
  8. model.compile(optimizer='adam',loss='mean_squared_error')
  9. model.summary()
  10. #模型训练与二次训练
  11. model.fit(x,y)
  12. model.fit(x2,y2)

  1. #模型保存到本地
  2. from sklearn.externals import joblib
  3. joblib.dump(model,"model1.m")
  4. #加载本地模型:
  5. model2 = joblib.load("model1.m")

实战(二):寻找苹果与其他苹果

任务:根据数据样本,建立模型,对test_data的图片进行普通/其他苹果判断:

1.数据增强,扩充确认为普通苹果的样本数量

2.特征提取,使用VGG16模型提取图像特征

3.图片批量处理

4.Kmeans模型尝试普通,其他苹果聚类

5.基于标签数据矫正结果,并可视化

6.Meanshift模型提升模型表现

7.数据降维PCA处理,提升模型表现

  • 核心代码
  1. #单张图片载入
  2. from keras.preprocessing.image import load_img,img_to_load
  3. img_path = '1.jpg'
  4. img = load_img(img_path,target_size=(224,224))
  5. img = img_to_array(img)
  6. #单张图片可视化:
  7. %matplotlib inline
  8. from matplotlib inline
  9. from matplotlib import pyplot as plt
  10. fig = plt.figure(figsize=(5,5))
  11. img = load_img(img_path,target_size=(224,224))
  12. plt.imshow(img)

单张图片特征提取:

  1. #模型加载、图像矩阵预处理
  2. from keras.applications.vgg16 import VGG16
  3. from keras.applications.vgg16 import preprocess_input
  4. import numpy as np
  5. model_vgg = VGG16(weight='imagenet',include_top=False)
  6. x = np.expand_dims(img,axis=0)
  7. x = preprocess_input(x)
  8. #特征提取
  9. features = model_vgg.predict(x)
  10. #特征数据格式预处理
  11. features = features.reshape(1,7*7*512)

定义一个提取图片特征的方法;

  1. def modelProcess(img_path,model):
  2. img = load_img(img_path,target_size=(224,224))
  3. img = img_to_array(img)
  4. x = np.expand_dims(img,axis=0)
  5. x = preprocess_input(x)
  6. x_vgg = model.predict(x)
  7. x_vgg = x_vgg.reshape(1,7*7*512)
  8. return x_vgg

批量提取图片特征:

  1. features1 = np.zeros([len(img_path),7*7*512])
  2. for i in range(len(img_path)):
  3. feature_i = modelProcess(img_path[i],model_vgg)
  4. print('preprocessed:',img_path[i])
  5. features1[i] = feature_i

使用聚类分析:

  1. #KMeans聚类(2类):
  2. from sklearn.cluster import KMeans
  3. cnn_kmeans = KMeans(n_cluster=2,max_iter=2000)
  4. cnn_kmeans.fit(X)
  5. y_pred_kmeans = cnn_kmeans.fit_predict(X)
  6. #Meanshift聚类:
  7. from sklearn.cluster import MeanShift,estimate_bandwidth
  8. #自动获取区域宽度
  9. bw = estimate_bandwidth(X1,n_samples=140)
  10. #建立模型
  11. ms = MeanShift(bandwidth = bw)
  12. ms.fit(X)
  13. y_pred_ms = ms.predict(X)

模型的优化:

  1. #数据降维(PCA处理):
  2. from sklearn.preprocessing import StandardScaler
  3. #数据标准化处理
  4. stds = StandardScaler()
  5. X_norm = stds.fit_transform(X)
  6. #PCA降维
  7. from sklearn.decomposition import PCA
  8. pca = PCA(n_components=200)
  9. X_pca = pca.fit_transform(X_norm)
  10. #计算主成分方差比例
  11. var_ratio = pca.explained_variance_ratio
  12. #查看主成分方差比之和
  13. print(np.sum(var_ratio))

  1. 统计数据次数:
  2. from collections import Counter
  3. print(Counter(y_pred_ms))
  4. 批量可视化结果:
  5. plt.figure(figsize=(10,30))
  6. for i in range(45):
  7. for j in range(5):
  8. img = load_img(img_path[i*5+j]) //read the image as a PIL image
  9. plt.subplot(45,i*5+j+1)
  10. plt.title('apple' if y_pred_ms[i*5+j] == normal_apple_id else 'others')
  11. plt.imshow(img),plt.axis('off')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/911711
推荐阅读
相关标签
  

闽ICP备14008679号