![神经网络设计与实现](https://wfqqreader-1252317822.image.myqcloud.com/cover/765/38894765/b_38894765.jpg)
2.4.3 XOR问题中的TensorBoard
TensorBoard默认情况下随TensorFlow一起使用,因此要启动TensorBoard,我们只需要在打开的控制台输入保存网络代码的位置即可:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/045-i.jpg?sign=1739163839-iGXk9TsI3No1HFruTVQZyorYiE46LsIg-0-14d93721c53b0595d9c5393f5740933e)
我们将在屏幕上看到一个URL,可以通过它访问TensorBoard服务器。如果你遵循上述说明,URL应为http://localhost:6006/。它将读取logs文件夹中的文件,它可能暂时是空的,无法看到任何信息。
开始记录前,我们必须修改先前编写的代码。这里将使用函数。
回调只是在训练过程的给定阶段应用的一组函数。在训练过程中,我们可以使用它们来查看模型的内部状态和统计信息。要定义回调,我们需要运行以下命令:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/045-2-i.jpg?sign=1739163839-V9S3GLZApQjP4TXNgZpMdHDRohvjvOrx-0-766e6007fa001a5ca783358b81a59cb1)
然后,我们可以将回调列表(作为关键字参数)传递给Sequential和Model类中的fit方法。之后,在训练的每个阶段调用回调。
我们可以添加一个回调,显示模型的图:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/045-3-i.jpg?sign=1739163839-jNQMpIR8x2zlZzDyfZdcnnudSpl6l65k-0-8ff2d046dd2cf8223d4f2e84aa9bb2cf)
先前编写的代码唯一需要更改的就是训练调用。它需要一个回调列表,以便可以在每个epoch结束时执行:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/046-i.jpg?sign=1739163839-5sMAT2LdcIhMxA3aRZHKosekWsa2d2BL-0-2731330d7a59733dfeea4e3a41b4308d)
请注意,为了分析更多的数据,我们增加了epoch的数量。
现在,如果重新加载TensorBoard页面,我们将能够看到以下两个东西:
·我们的网络图
·损失在每个epoch中如何演变
让我们在以下TensorBoard页面上查看前面的内容(见图2-17)。
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/2-17.jpg?sign=1739163839-q53mL7yFJ1KCBE6QelisTChic4WKt3wR-0-8eb0fba1ff21f06f750b701e371eb98e)
图 2-17
使用TensorBoard,可以可视化张量图及其计算从而查看潜在的瓶颈并优化性能(见图2-18)。
训练复杂的网络可能会持续数天甚至数周。在此期间,可能多个方面会出错,例如:机器内存不足或者硬件、电气故障。为了保护我们的工作,我们希望有一种方法可以保存当前的训练状态,以便以后可以重新打开。幸运的是,网络状态基本上就是连接神经元的权重。因此,保存训练状态很容易。要在训练期间以编程方式做到这一点,我们将再次使用回调,也就是使用称为checkpoint的东西:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/047-i.jpg?sign=1739163839-zbFncCvbIKcd0pTFynGXmtasSX1wrw0N-0-085807b78786fd4e28eb8d9ec887cdc7)
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/2-18.jpg?sign=1739163839-e87tcDKKjeO3JkeMXL4qReSNXmPvsE5f-0-b348643abd10ba138f2082fe2327e827)
图 2-18
现在,将其添加到回调中,我们可以告诉Keras来监控准确度,这需要将其作为指标添加:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/047-3-i.jpg?sign=1739163839-gj2hzOQ3FUUATeG7LReqRgw3QeWTC5bb-0-725d8225e42034bebc146ac10fd7e0b0)
同样,在我们拟合模型之后,它将给我们返回一个对象,其中包含所有历史记录,每个epoch的训练损失值和指标值的记录:
![](https://epubservercos.yuewen.com/96A46E/20422784308285606/epubprivate/OEBPS/Images/047-4-i.jpg?sign=1739163839-xD251r6xH63xaQo3fvYIoVgriyItNtEx-0-7fcb32e05c10b390aad7ea675520ed50)