# 2.7 迁移学习（Transfer Learning）

训练集很小的情况：

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/8f0e69f085991cfc74726983418f6569.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/8f0e69f085991cfc74726983418f6569.png)

建议：从网上下载一些神经网络开源的实现，不仅把代码下载下来，也把权重下载下来。然后去掉**Softmax**层，创建自己的**Softmax**单元，用来输出**Tigger**、**Misty**和**neither**三个类别。把所有的层看作是冻结的，冻结网络中所有层的参数，只需要训练和**Softmax**层有关的参数。这个**Softmax**层有三种可能的输出，**Tigger**、**Misty**或者**Neither**。

通过使用其他人预训练的权重，很可能得到很好的性能，即使只有一个小的数据集。大多数深度学习框架会有`trainableParameter=0`的参数，对于前面的层，可以设置这个参数。为了不训练这些权重，会有`freeze=1`的参数。只需要训练**softmax**层的权重，把前面这些层的权重都冻结

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/ac520bf9e9facfc026db46b187b513bd.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/ac520bf9e9facfc026db46b187b513bd.png)

由于前面的层都冻结了，相当于一个固定的函数，因此不需要改变和训练它，取输入图像$$X$$，然后把它映射到**softmax**前一层的激活函数。能加速训练的技巧是如果先计算这一层（紫色箭头标记），计算特征或者激活值，然后把它们存到硬盘里。所做的就是用这个固定的函数，在这个神经网络的前半部分（**softmax**层之前的所有层视为一个固定映射），取任意输入图像$$X$$，然后计算它的某个特征向量，这样训练的就是一个很浅的**softmax**模型，用这个特征向量来做预测。对计算有用的一步就是对训练集中所有样本的这一层的激活值进行预计算，然后存储到硬盘里，在此之上训练**softmax**分类器。存储到硬盘或者说预计算方法的优点是不需要每次遍历训练集再重新计算这个激活值

更大的训练集：应该冻结更少的层，然后训练后面的层。如果输出层的类别不同，那么需要构建自己的输出单元，**Tigger**、**Misty**或者**Neither**三个类别。可以取后面几层的权重，用作初始化，然后从这里开始梯度下降

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/e7079af956d884d6184c4bde62271175.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/e7079af956d884d6184c4bde62271175.png)

也可以直接去掉这几层，换成自己的隐藏单元和**softmax**输出层，如果有越来越多的数据，那么需要冻结的层数就越少，能够训练的层数就越多。如果有一个更大的数据集，那么不要单单训练一个**softmax**单元，而是考虑训练中等大小的网络，包含最终要用的网络的后面几层

[![](https://github.com/fengdu78/deeplearning_ai_books/raw/master/images/7cf0e18b739684106548cbbf0c1dd500.png)](https://github.com/fengdu78/deeplearning_ai_books/blob/master/images/7cf0e18b739684106548cbbf0c1dd500.png)

如果有大量数据：应该做的就是用开源的网络和它的权重，把所有的权重当作初始化，然后训练整个网络

如果有越多的标定的数据，可以训练越多的层。极端情况下，可以用下载的权重只作为初始化，用它们来代替随机初始化，接着用梯度下降训练，更新网络所有层的所有权重


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://baozoulin.gitbook.io/neural-networks-and-deep-learning/di-si-men-ke-juan-ji-shen-jing-wang-luo-convolutional-neural-networks/convolutional-neural-networks/deep-convolutional-models-case-studies/29-qian-yi-xue-xi-ff08-transfer-learning.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
