当前位置:   article > 正文

深度学习之---迁移学习

迁移学习

目录

一、什么是迁移学习

二、为什么需要迁移学习?

1. 大数据与少标注的矛盾:

2. 大数据与弱计算的矛盾:

3. 普适化模型与个性化需求的矛盾:

4. 特定应用(如冷启动)的需求。

三、迁移学习的基本问题有哪些?

四、 迁移学习有哪些常用概念?

​编辑 五、迁移学习与传统机器学习有什么区别?

六、迁移学习的核心及度量准则? 


一、什么是迁移学习

        迁移学习(Transfer Learning)是一种机器学习方法,就是把为任务 A 开发 的模型作为初始点,重新使用在为任务 B 开发模型的过程中。迁移学习是通过 从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数机器学习算 法都是为了解决单个任务而设计的,但是促进迁移学习的算法的开发是机器学 习社区持续关注的话题。 迁移学习对人类来说很常见,例如,我们可能会发现 学习识别苹果可能有助于识别梨,或者学习弹奏电子琴可能有助于学习钢琴。

        找到目标问题的相似性,迁移学习任务就是从相似性出发,将旧领域 (domain)学习过的模型应用在新领域上

二、为什么需要迁移学习?

1. 大数据与少标注的矛盾:

        虽然有大量的数据,但往往都是没有标注的, 无法训练机器学习模型。人工进行数据标定太耗时。

2. 大数据与弱计算的矛盾:

        普通人无法拥有庞大的数据量与计算资源。因 此需要借助于模型的迁移。

3. 普适化模型与个性化需求的矛盾:

        即使是在同一个任务上,一个模型也 往往难以满足每个人的个性化需求,比如特定的隐私设置。这就需要在 不同人之间做模型的适配。

4. 特定应用(如冷启动)的需求。

三、迁移学习的基本问题有哪些?

基本问题主要有3个:

  • How to transfer: 如何进行迁移学习?(设计迁移方法)
  • What to transfer: 给定一个目标领域,如何找到相对应的源领域, 然后进行迁移?(源领域选择)
  • When to transfer: 什么时候可以进行迁移,什么时候不可以?(避 免负迁移)

四、 迁移学习有哪些常用概念?

基本定义

域(Domain):数据特征和特征分布组成,是学习的主体

        源域 (Source domain):已有知识的域

        目标域 (Target domain):要进行学习的域

任务 (Task):由目标函数和学习结果组成,是学习的结果

按特征空间分类

 按迁移情景分类

        归纳式迁移学习(Inductive TL):源域和目标域的学习任务 不同

        直推式迁移学习(Transductive TL):源域和目标域不同,学 习任务相同

        无监督迁移学习(Unsupervised TL):源域和目标域均没有 标签 按迁移方法分类

        基于样本的迁移 (Instance based TL):通过权重重用源域和 目标域的样例进行迁移

        基于样本的迁移学习方法 (Instance based Transfer Learning) 根据一定的权重生成规则,对数据样本进行重用, 来进行迁移学习。下图形象地表示了基于样本迁移方法的思想 源域中存在不同种类的动物,如狗、鸟、猫等,目标域只有狗 这一种类别。在迁移时,为了最大限度地和目标域相似,我们 可以人为地提高源域中属于狗这个类别的样本权重。

        基于特征的迁移 (Feature based TL):将源域和目标域的特 征变换到相同空间  

        基于特征的迁移方法 (Feature based Transfer Learning) 是 指将通过特征变换的方式互相迁移,来减少源域和目标域之间的 差距;或者将源域和目标域的数据特征变换到统一特征空间中, 然后利用传统的机器学习方法进行分类识别。根据特征的同构 和异构性,又可以分为同构和异构迁移学习。下图很形象地表示 了两种基于特 征的迁移学习方法。

        基于模型的迁移 (Parameter based TL):利用源域和目标域的参数共享 模型

        基于模型的迁移方法 (Parameter/Model based Transfer Learning) 是指 从源域和目标域中找到他们之间共享的参数信息,以实现迁移的方法。这种迁移 方式要求的假设条件是: 源域中的数据与目标域中的数据可以共享一些模型的 参数。下图形象地表示了基于模型的迁移学习方法的基本思想。  

        基于关系的迁移 (Relation based TL):利用源域中的逻辑网络关系进行迁移

        基于关系的迁移学习方法 (Relation Based Transfer Learning) 与上述三种 方法具有截然不同的思路。这种方法比较关注源域和目标域的样本之间的关 系。下图形象地表示了不 同领域之间相似的关系。  

 五、迁移学习与传统机器学习有什么区别?

六、迁移学习的核心及度量准则? 

        迁移学习的总体思路可以概括为:开发算法来最大限度地利用有标注的领 域的知识,来辅助目标领域的知识获取和学习。

        迁移学习的核心是:找到源领域和目标领域之间的相似性,并加以合理利 用。这种相似性非常普遍。比如,不同人的身体构造是相似的;自行车和摩托 车的骑行方式是相似的;国际象棋和中国象棋是相似的;羽毛球和网球的打球 方式是相似的。这种相似性也可以理解为不变量。以不变应万变,才能立于不 败之地。

        有了这种相似性后,下一步工作就是, 如何度量和利用这种相似性。度量 工作的目标有两点:一是很好地度量两个领域的相似性,不仅定性地告诉我们 它们是否相似,更定量地给出相似程度。二是以度量为准则,通过我们所要采 用的学习手段,增大两个领域之间的相似性,从而完成迁移学习。

        一句话总结: 相似性是核心,度量准则是重要手段。

 七、迁移学习三步走

        1加载预训练模型(inceptionnet-v3)(主干网络,backbone),提取所 有图片数据集的特征(特征向量2048维度)。(调用别人训练好的模型,因为 他们的模型泛化能力强,不用自己创建训练模型)

        2用特征向量训练自己的后端网络模型,(后端用自己创建dense后端模 型,保存dense后端6个模型)

        3调用最后一个模型来显示测试集16张图片预测结果

 第一步

  1. import os.path
  2. import numpy as np
  3. # # import tensorflow.compat.v1 as tf
  4. # import tensorflow._api.v2.compat.v1 as tf
  5. import tensorflow.compat.v1 as tf
  6. tf.disable_v2_behavior()
  7. from tensorflow.python.platform import gfile
  8. MODEL_FILE = 'model/tensorflow_inception_graph.pb'
  9. JPEG_DATA_TENSOR_NAME = 'DecodeJpeg/contents:0'
  10. BOTTLENECK_TENSOR_NAME = 'pool_3/_reshape:0'
  11. INPUT_IMAGE = 'data/agriculture'
  12. OUTPUT_VEC = 'data/bottleneck'
  13. def load_google_model(path):
  14.   with gfile.FastGFile(path, "rb") as f:
  15.       graph_def = tf.GraphDef()
  16.       graph_def.ParseFromString(f.read())
  17.       jpeg_data_tensor, bottleneck_tensor = \
  18.           tf.import_graph_def(graph_def, return_elements=
  19. [JPEG_DATA_TENSOR_NAME, BOTTLENECK_TENSOR_NAME])
  20.   return jpeg_data_tensor, bottleneck_tensor
  21. def get_random_cached_bottlenecks(sess, path,
  22. jpeg_data_tensor, bottleneck_tensor):
  23.   for _, class_name in enumerate(os.listdir(path)):
  24.       sub_path = os.path.join(path, class_name)
  25.       for img in os.listdir(sub_path):
  26.           img_path=os.path.join(sub_path,img)
  27.           image_data = gfile.FastGFile(img_path,
  28. 'rb').read()
  29.           bottleneck_values = sess.run(bottleneck_tensor,
  30. feed_dict={jpeg_data_tensor: image_data})第二步骤:
  31.           bottleneck_values = np.squeeze(bottleneck_values)
  32.           sub_dir_path = os.path.join(OUTPUT_VEC,
  33. class_name)
  34.           if not os.path.exists(sub_dir_path):
  35.               os.makedirs(sub_dir_path)
  36.           new_image_path=os.path.join(sub_dir_path,
  37. img)+".txt"
  38.           if not os.path.exists(new_image_path):
  39.               bottleneck_string = ','.join(str(x) for x in
  40. bottleneck_values)
  41.               with open(new_image_path, 'w') as
  42. bottleneck_file:
  43.                   bottleneck_file.write(bottleneck_string)
  44.           else:
  45.               break
  46. if __name__ == '__main__':
  47.   jpeg_data_tensor, bottleneck_tensor =
  48. load_google_model(MODEL_FILE)
  49.   with tf.Session() as sess:
  50.       tf.global_variables_initializer().run()
  51.       get_random_cached_bottlenecks(sess, INPUT_IMAGE,
  52. jpeg_data_tensor, bottleneck_tensor)

第二步 

  1. import os
  2. import numpy as np
  3. import tensorflow.compat.v1 as tf
  4. tf.disable_v2_behavior()
  5. # import tensorflow._api.v2.compat.v1 as tf
  6. from sklearn.model_selection import train_test_split
  7. IN_DIR = 'data/bottleneck'
  8. OUT_DIR = 'runs'
  9. checkpoint_every = 100 #every 每,
  10. def get_data(path):   x_vecs=[]
  11.   y_labels=[]
  12.   for i, j in enumerate(os.listdir(path)): #enumerate代表枚
  13. 举,把元素一个个列举出来。
  14.       sub_path = os.path.join(path, j)
  15.       for vec in os.listdir(sub_path):
  16.           vec_path = os.path.join(sub_path, vec)
  17.           with open(vec_path, 'r') as f:
  18.               vec_str = f.read()
  19.           vec_values = [float(x) for x in
  20. vec_str.split(',')]
  21.           x_vecs.append(vec_values)
  22.           y_labels.append(np.eye(5)[i])
  23.   return np.array(x_vecs), np.array(y_labels)
  24. image_data,labels=get_data(IN_DIR)
  25. train_data,test_data,train_label,test_label=train_test_split(
  26. image_data,labels,train_size=0.8,shuffle=True)
  27. test_data,val_data,test_label,val_label=train_test_split(test
  28. _data,test_label,train_size=0.5)
  29. if __name__ == '__main__':#入口
  30.   X = tf.placeholder(tf.float32, [None, 2048])
  31.   Y = tf.placeholder(tf.float32, [None, 5])
  32.   with tf.name_scope('final_training_ops'):
  33.       logits = tf.layers.dense(X, 5)
  34.   with tf.name_scope('loss'):
  35.       cross_entropy_mean =
  36. tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits
  37. =logits, labels=Y))
  38.   with tf.name_scope('Optimizer'):
  39.       train_step =
  40. tf.train.GradientDescentOptimizer(0.001).minimize(cross_entro
  41. py_mean)
  42.   with tf.name_scope('evaluation'):       correct_prediction = tf.equal(tf.argmax(logits, 1),
  43. tf.argmax(Y, 1))
  44.       evaluation_step =
  45. tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  46.   with tf.Session() as sess:
  47.       sess.run(tf.global_variables_initializer())
  48.       # 保存检查点
  49.       checkpoint_dir =
  50. os.path.abspath(os.path.join(OUT_DIR, 'checkpoints'))
  51.       checkpoint_prefix = os.path.join(checkpoint_dir,
  52. 'model')
  53.       if not os.path.exists(checkpoint_dir):
  54.           os.makedirs(checkpoint_dir)
  55.       saver = tf.train.Saver(tf.global_variables(),
  56. max_to_keep=6)
  57.       for epoch in range(1001):
  58.           batch_size = 64
  59.           start = 0
  60.           num_step = len(train_data) // batch_size
  61.           for i in range(num_step):
  62.               xb = train_data[start : start + batch_size]
  63.               yb = train_label[start : start + batch_size]
  64.               start = start + batch_size
  65.               _ = sess.run([train_step], feed_dict={X: xb,
  66. Y: yb})
  67.           if epoch % 100 == 0:
  68.               validation_accuracy =
  69. sess.run(evaluation_step, feed_dict={X: val_data, Y:
  70. val_label})
  71.               print("[epoch {}]验证集准确率
  72. {:.3f}%".format(epoch, validation_accuracy * 100))
  73.               path = saver.save(sess, checkpoint_prefix,
  74. global_step=epoch)
  75.               print('Saved model checkpoint to
  76. {}\n'.format(path))
  77.       test_accuracy = sess.run(evaluation_step, feed_dict=
  78. {X: test_data, Y: test_label})第三步骤:
  79.       print("测试集准确率{:.3f}%".format(test_accuracy *
  80. 100))

 第三步

  1. import numpy as np
  2. import cv2
  3. import os
  4. import tensorflow.compat.v1 as tf
  5. tf.disable_v2_behavior()
  6. from tensorflow.python.platform import gfile
  7. import matplotlib.pyplot as plt
  8. MODEL_FILE = 'model/tensorflow_inception_graph.pb'
  9. JPEG_DATA_TENSOR_NAME = 'DecodeJpeg/contents:0'
  10. BOTTLENECK_TENSOR_NAME = 'pool_3/_reshape:0'
  11. CHECKPOINT_DIR = 'runs/checkpoints'
  12. test_dir = 'data/test/agriculture'
  13. def load_google_model(path):
  14.   with gfile.FastGFile(path, "rb") as f:
  15.       graph_def = tf.GraphDef()
  16.       graph_def.ParseFromString(f.read())
  17.       jpeg_data_tensor, bottleneck_tensor = \
  18.           tf.import_graph_def(graph_def, return_elements=
  19. [JPEG_DATA_TENSOR_NAME, BOTTLENECK_TENSOR_NAME])
  20.   return jpeg_data_tensor, bottleneck_tensor
  21. def create_test_featrue(sess, test_dir, jpeg_data_tensor,
  22. bottleneck_tensor):
  23.   test_data, test_feature, test_labels = [], [], []
  24.   for i in os.listdir(test_dir):
  25.       img = cv2.imread(os.path.join(test_dir, i))
  26.       img = cv2.resize(img, (256, 256))
  27.       img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
  28.       test_data.append(img)
  29.       img_data = gfile.FastGFile(os.path.join(test_dir, i),
  30. "rb").read()       feature = sess.run(bottleneck_tensor, feed_dict=
  31. {jpeg_data_tensor: img_data})
  32.       test_feature.append(feature)
  33.       test_labels.append(i.split("_")[0])
  34.   return test_data, np.reshape(test_feature, (-1, 2048)),
  35. np.array(test_labels)
  36. def show_img(test_data, pre_labels, test_labels):
  37.   _, axs = plt.subplots(4, 4)
  38.   for i, axi in enumerate(axs.flat):
  39.       axi.imshow(test_data[i])
  40.       print(pre_labels[i], test_labels[i])
  41.       axi.set_xlabel(xlabel=pre_labels[i], color="black" if
  42. pre_labels[i] == test_labels[i] else "red")
  43.       axi.set(xticks=[], yticks=[])
  44.   plt.savefig(os.path.join("data/test/", 'agriculture' +
  45. ".jpg"))
  46.   plt.show()
  47. if __name__ == '__main__':
  48.   jpeg_data_tensor, bottleneck_tensor =
  49. load_google_model(MODEL_FILE)
  50.   class_names = os.listdir("data/agriculture")
  51.   num_class= len(class_names)
  52.   x_transfer = tf.placeholder(tf.float32, [None, 2048])
  53.   y_transfer = tf.placeholder(tf.int64, [None, num_class])
  54. # [None,5]
  55.   logits = tf.layers.dense(x_transfer, num_class)
  56.   saver = tf.train.Saver()
  57.   with tf.Session() as sess:
  58.       sess.run(tf.global_variables_initializer())
  59.       print(CHECKPOINT_DIR)
  60.       last_point =
  61. tf.train.latest_checkpoint(CHECKPOINT_DIR)
  62.       print(last_point)
  63.       saver.restore(sess, last_point)三个步骤代码组合起来实现迁移学习:
  64.       test_data, test_feature, test_labels = \
  65.           create_test_featrue(sess, test_dir,
  66. jpeg_data_tensor, bottleneck_tensor)
  67.       pred = sess.run(tf.argmax(logits, 1), {x_transfer:
  68. test_feature})
  69.       show_img(test_data, [class_names[i] for i in pred],
  70. test_labels)

 

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

闽ICP备14008679号