Sonnet
Sonnet 是一个用 Python 编写的面向对象的库。它是由 DeepMind 在 2017 年发布的.Sonnet 打算从对象中清晰地分离构建计算图的以下两个方面:
- 对象的配置称为模块
- 对象与计算图的连接
可以使用以下命令在 Son 3 中安装 Sonnet:
pip3 install dm-sonnet
可以按照以下链接的说明从源安装 Sonnet:https://github.com/deepmind/sonnet/blob/master/docs/INSTALL.md。
模块被定义为抽象类sonnet.AbstractModule的子类。在编写本书时,Sonnet 中提供了以下模块:
| 基本模块 | AddBias,BatchApply,BatchFlatten,BatchReshape,FlattenTrailingDimensions,Linear,MergeDims,SelectInput,SliceByDim,TileByDim和TrainableVariable |
|---|---|
| 循环模块 | DeepRNN,ModelRNN,VanillaRNN,BatchNormLSTM,GRU和LSTM |
| Recurrent + ConvNet 模块 | Conv1DLSTM和Conv2DLSTM |
| ConvNet 模块 | Conv1D,Conv2D,Conv3D,Conv1DTranspose,Conv2DTranspose,Conv3DTranspose,DepthWiseConv2D,InPlaneConv2D和SeparableConv2D |
| ResidualNets | Residual,ResidualCore和SkipConnectionCore |
| 其他 | BatchNorm,LayerNorm,clip_gradient和scale_gradient |
我们可以通过创建sonnet.AbstractModule的子类来定义我们自己的新模块。从函数创建模块的另一种非推荐方法是通过传递要包装为模块的函数来创建sonnet.Module类的对象。
在 Sonnet 库中构建模型的工作流程如下:
- 为从
sonnet.AbstractModule继承的数据集和网络体系结构创建类。在我们的示例中,我们创建了一个 MNIST 类和一个 MLP 类。 - 定义参数和超参数。
- 从上一步中定义的数据集类定义测试和训练数据集。
- 使用定义的网络类定义模型。例如,在我们的案例中,
model = MLP([20, n_classes])创建了一个 MLP 网络,其中包含两层 20 和每个神经元n_classes的数量。 使用模型为训练和测试集定义
y_hat占位符。定义训练和测试集的损失占位符。
- 使用训练损失占位符定义优化程序。
- 在 TensorFlow 会话中执行所需数量的周期的损失函数以优化参数。
笔记本电脑ch-02_TF_High_Level_Libraries中提供了 Sonnet MNIST 分类示例的完整代码。 每个类中的__init__方法初始化类和相关的超类。 _build方法在调用类时创建并返回数据集或模型对象。 Sonnet MNIST 示例的输出如下:
Epoch : 0 Training Loss : 236.79913330078125
Epoch : 1 Training Loss : 227.3693084716797
Epoch : 2 Training Loss : 221.96337890625
Epoch : 3 Training Loss : 220.99142456054688
Epoch : 4 Training Loss : 215.5921173095703
Epoch : 5 Training Loss : 213.88958740234375
Epoch : 6 Training Loss : 203.7091064453125
Epoch : 7 Training Loss : 204.57427978515625
Epoch : 8 Training Loss : 196.17218017578125
Epoch : 9 Training Loss : 192.3954315185547
Test loss : 192.8847198486328
由于神经网络中计算的随机性,您的输出可能会有所不同。这包括我们对 Sonnet 模块的概述。
有关 Sonnet 的更多详细信息,您可以浏览以下链接:https://deepmind.github.io/sonnet/。