深度学习

注意



我们可以用它来编写一个递归的tensor_sum函数:
如果你不习惯递归思考,你应该思考直到弄明白它的意思,因为我们将在本章使用相同的逻辑。但是,我们将创建一些辅助函数,以便我们不必在各处重写此逻辑。第一个方法将一个函数单独应用于单个张量:












注意
本章中的一些网络我根本无法使用不同的初始化方法进行训练,现在我相信你知道初始化方案有多重要了。

注意
在“真正的”张量库中,这些(以及许多其他)操作将表示为矩阵或张量乘法,这些库设计得非常快。我们的库速度很慢。



所以我们可以将我们用于XOR的神经网络表示为: 



之后,再次使用tensor_combine轻松实现梯度下降: 



这应该训练得很快,你应该看到损失会下降。现在我们可以检查一下权重了:
对于我的网络,我大致发现: 








经过1000次训练迭代,模型在测试集上的准确率达到90%;如果训练时间更长,它应该做得更好。(我不认为仅仅25个隐藏单元就能训练到100%准确,但如果你达到50个隐藏单元,则绝对有可能。) 







我们将使用此方法来帮助我们防止深度学习模型过度拟合。
让我们绘制前100张训练图像,了解它们的形状(图19-1): 

注意
我第一次尝试显示这些图像,结果是黑色背景上的黄色数字。我既不聪明也不微妙,不知道我需要添加cmap=Greys来获得黑白图像;我通过谷歌搜索,找到了堆栈溢出的解决方案。作为一名数据科学家,你将非常熟练于这个工作流程。


我们还想要对目标进行一次热编码,因为我们有10个输出。首先,让我们编写一个one_hot_encode函数:
然后将其应用于我们的数据中: 






注意
MNIST网站(http://yann.lecun.com/exdb/mnist/)描述了各种性能优于这些模型的模型。其中许多都可以使用我们迄今为止开发的方法来实现,但这需要非常长的时间才能在张量列表框架(lists-as-tensors)中进行训练。一些最好的模型涉及到卷积层,这很重要,但不幸的是,这完全超出了一本关于数据科学的介绍性书的范围。


注意
JSON将数据存储为文本,这使得它成为一种非常低效的表示。在实际应用程序中,你可能会使用pickle序列化库,它将内容序列化为更高效的二进制格式。在这里,我决定保持它的简单性和可读性。
