首先我们使用 Keras 中的 Sequential 类初始化一个用于存放任意层网络的模型,我们可以简单地认为这个类创建了一个杯子,我们的任务就是用适当的内容将这个杯子填满。接着在代码中不断地调用 add 方法按照顺序添加我们需要的神经网络层 (layer)。我们可以看到短短的几行代码便可以创建一个 MNIST 神经网络分类器。你只需要专注于以下几个方面:将数据按照神经网络的输入(代码中为一行 model.add(Dense(512, activation='relu', input_shape=(784,)))格式处理好,选择适当的激活函数(不仅是 relu,你也可以尝试 tanh 或是 softmax 来快速比较不同激活函数对神经网络结果的影响),是否添加 Dropout 层来减轻学习过程中的过拟合现象。
当模型构建好之后,我们便可以快速地使用 compile 方法来编译模型,其中的损失函数 loss、优化方法 optimizer 均可以自由选择。最后,使用类似于 sklearn 机器学习工具包中的 fit 方法即可开始训练我们的模型。
TensorFlow 有一个非常出色可视化工具 TensorBoard,可以协助你的开发。
除了自己动手开发,你也可以利用别人写好的代码,这也是开源的好处,也是本演讲所关注的重点。
Inception
Gordon 首先介绍的模型是 Inception。
Inception 的结构
比如如果你想识别一张照片,你可以直接在谷歌的云平台上直接调用该模型的 API 来帮你完成。当然,你可以通过使用开源模型的方式来实现:
上面的这一点代码就实现了前面幻灯片上的 Inception 模型,可以看到,代码量非常少。
这是该模型在 Gordon 自己拍摄的一张照片上所得到的结果。效果不好,主要是因为这个模型所预训练的数据集来自于 ImageNet。ImageNet 中包含了大量的图像,但其中大部分都是猫、狗、花、艺术品等等,对上图照片的场景经验不足。
而有了合适的数据集,Inception 能得到非常好的表现,甚至能够分辨出狗的品种。
也许你对识别狗不感兴趣,但你也可以用深度学习做其它事情,比如迁移学习。迁移学习的概念很简单。举个例子,假如你已经训练好了一个可以识别狗的模型,但你想要识别上面照片中的城市。如果有迁移学习,你就不需要从头开始在新数据集上训练你的模型,你可以去掉你原来模型的最后一层,然后换上新的一层再训练。这样就能将原来需要数周的训练时间减省到了几十秒。
TensorFlow for Poets 展示这样实现图像模型的方式。希望在更多领域看到这样的例子。实际上,在 https://github.com/tensorflow/models 中,有很多模型公开可用。
你也可以设计你自己的实验:
接下来,Gordon 对大名鼎鼎的 Deep Dream 进行了介绍。参阅机器之心文章《深度 | 揭秘谷歌 Deep Dream 的前世今生》。
转载请注明出处。