将一个数据集上训练好的卷积神经网络模型快速转移到另外一个数据集上。
迁移学习:将一个问题上训练好的卷积神经网络通过简单的调整使其适用于一个新的问题;某一论文中提到一个结论,可以保留训练好的Inception-v3模型中所有卷积层参数,只是替换最后一层全连接层。最后一层全连接层之前的网络层称为瓶颈层(bottleneck)。
- 将新的图像数据通过训练好的卷积神经网络直到瓶颈层的过程,可理解为对图像进行特征提前的过程;
- 将瓶颈层的输出再经过一个全连接层可以很好的区分1000种类的图像,故可认为瓶颈层输出的节点向量可以被作为任意图像的一个更加精简且表达能力更强的特征向量。
流程简述:
- 在新数据集上,直接利用训练好的神经网络对图像进行特提取;
- 然后再将提取到的特征向量作为输入来训练一个新的单层全连接神经网络来处理新的问题;
在数据量足够的情况下,迁移训练效果不如重新训练,但是训练时间和训练样本数原i小于训练完整的模型。
# 不需要从Google训练好的模型中加载的参数------最后的全连接层,这一层需要重新训练参数# 参数的前缀CHECKPOINT_EXCLUDE_SCOPES = 'InceptionV3/Logits', 'InceptionsV3/AuxLogits'# 需要训练的网络层参数名称,fine-tuning最后一层全连接# 参数前缀TRAINABLE_SCOPES = 'InceptionV3/Logits', 'InceptionsV3/AuxLogits'# 获取所有需要从Google训练好的模型中加载的参数def get_tuned_variables():exclusions = [scope.strip() for scope in CHECKPOINT_EXCLUDE_SCOPES.split(',')]variables_to_restore = []# 枚举inception-v3模型中的所以参数,然后判断是否需要从加载列表中移除for var in slim.get_model_variables():excluded = Falsefor exclusion in exclusions:if var.op.name.startswith(exclusion):excluded = Truebreakif not excluded:variables_to_restore.append(var)return variables_to_restore# 获取所以需要训练的变量列表def get_trainable_variables():scopes = [scope.strip() for scope in TRAINABLE_SCOPES.split(',')]variables_to_train = []# 枚举inception-v3模型中的所以需要训练的参数,并通过这些前缀找到所有的参数for scope in scopes:# 从一个集合中取出变量variables = tf.get_collections(tf.GraphKeys.TRAINABLE_VARIABLES, scope)variables_to_train.append(variables)return variables_to_train
