新的 RaspberryPi 安全更新已经默认禁用了 SSH

以前,新刷好的 raspbian 是可以直接通过 SSH 连上的,现在则是:

$ ssh [email protected]
ssh: connect to host 192.168.1.143 port 22: Connection refused  

官方博客找到了原因:

Anyone who has been following tech media over the last few months will have seen the stories about botnets running on Internet of Things devices. Hackers are using the default passwords on webcams and the like to create a network capable of sending enough requests to a website to cause it to grind to a halt.

大概就是 IoT 里默认的 SSH 密码已经成了黑客攻击的重灾区。

解决方案也很简单,在 SD 卡根目录新建一个名为 ssh 的文件(内容无所谓),之后 SD 卡的内容会被 mount 到 /boot/,启动的时候树莓派检测到这个文件,就会开启 SSH。

TensorFlow 与深度学习 (14) 恭喜!

你已经建立了你的第一个神经网络,并且达到了 99% 的准确率。在这个过程中,你所学到的技术并不局限于 MNIST 数据集。实际上,这些技术在训练神经网络的过程中被广泛使用。作为礼物,下面提供的内容可以用来帮助你回忆已经所学的内容。

下一步

  • 在完成了完全神经网络和卷积网络后,你应该看看循环神经网络
  • 在本教程中,你已经学习了如何在矩阵层次构建 TensorFlow 模型。Tensorflow 还有更高级的 API,称为 tf.learn
  • 要在云上的分布式框架上训练,我们提供 Cloud ML 服务
  • 最后,我们希望收到你的反馈。如果你在发现了本实验中的些许错误,或者你认为有什么需要改进的地方,请告诉我们。我们通过 GitHub 处理反馈[反馈链接]。

原文作者: Martin Görner (@martin_gorner)

本实验中所有卡通画的版权属于: alexpokusay / 123RF stock photos

TensorFlow 与深度学习 (13) 挑战 99% 准确率

调整你的神经网络的一个好方法是:先去实现一个限制较多的神经网络,然后给它更多的自由度并且增加 dropout,使神经网络避免过拟合。最终你将得到一个相当不错的神经网络。

例如,我们在第一层卷积层中仅仅使用了 4 个 patch,如果这些权重的 patch 在训练的过程中发展成不同的识别器,你可以直观地看到这对于解决我们的问题是不够的。手写数字模式远多于 4 种基本样式。

因此,让我们稍微增加 patch 的数量,将我们卷积层中 patch 的数量从 4,8,12 增加到 6,12,24,并且在全连接层上添加 dropout。它们的神经元重复使用相同的权重,在一次训练迭代中,通过冻结(限制)一些不会对它们起作用的权重,dropout 能够有效地工作。

上吧!去打破 99%的限制。增加 patch 大小和通道数量,并在卷积层中添加 dropout。

答案可以在 mnist_3.1_convolutional_bigger_dropout.py 中找到,如果你卡住了可以看它。

使用上图所示的模型,在 10000 个测试的数字中,结果仅仅错误了 72 个。你可以在 MNIST 网站上发现,准确率的世界纪录大约为 99.7%,这仅比我们用 100 行 Python/TensorFlow 代码构建的模型高 0.4%。

作为结尾,以下就是 dropout 为我们更大的卷积网络所带来的改变。给网络的额外自由度,使模型的准确率从 98.9% 达到 99.1%。向卷积层中增加 dropout 不仅令我们驯服了测试误差,而且让我们安全地在 99% 的准确率上“航行”,甚至能达到 99.3%。

TensorFlow 与深度学习 (12) 卷积网络:实验

为了将我们的代码转化为卷积模型,我们需要为卷积层定义适当的权重张量,然后将该卷积层添加到模型中。

我们已经见过到卷积层需要以下形式的权重张量。下面代码是用 TensorFlow 语法来对其初始化:

W = tf.Variable(tf.truncated_normal([4, 4, 3, 2], stddev=0.1))  
B = tf.Variable(tf.ones([2])/10) # 2 is the number of output channels  

TensorFlow 中,使用 tf.nn.conv2d 函数实现卷积层,该函数使用提供的权重在两个方向上扫描输入图片。这仅仅是神经元的加权和部分,你还需要添加偏置,并将加权和传给激活函数。

stride = 1  # output is still 28x28  
Ycnv = tf.nn.conv2d(X, W, strides=[1, stride, stride, 1], padding='SAME')  
Y = tf.nn.relu(Ycnv + B)  

不要太在意 stride 的复杂语法,欲知详情请查文档。这里的 padding 策略是复制边缘的像素。所有的数字都在一个统一的背景下,所以这仅仅扩展了背景,不应该添加任何不需要的形状。

现在轮到你了。修改你的模型并将其转化为卷积模型。你可以使用上图中的值来修改它,你可以保留学习速率衰减,但是务必先移除 dropout。

解答可以在 mnist_3.0_convolutional.py 找到。如果卡住可以看它。

你的模型的准确率应该会超过 98%,并且最终很接近 99%。眼看目标就要实现,我们不能停下!看看测试的交叉熵曲线,是不是想到了一个解决方案?

TensorFlow 与深度学习 (11) 卷积网络:理论

在卷积网络层中,一个神经元仅对该图像上的一个小部分的像素求加权和。然后,通常会加上一个偏置,并且将得到的加权和传给激活函数。与全连接网络相比,其最大的区别在于卷积网络的每个神经元重用相同的权重,而不是每个神经元都有自己的权重。

在上面的动画中,你可以看到通过连续修改图片上两个方向的权重(卷积),能够获得与图片上的像素点数量相同的输出值(边缘处需要 padding)。

要产生一个输出值平面,我们使用了一张 4x4 大小的彩色图片作为出输入。在这个动画当中,我们需要 4x4x3=48 个权重。这还不够,为了增加更多自由度,我们还需要选取不同组的权重值重复实验。

通过向权重张量添加一个维度,能够将两组或更多组的权重重写为一组权重,这样就给出了一个通用的卷积层权重张量的实现。由于输入、输出通道的数量都是参数,我们可以堆叠和连接卷积层。

最后,我们需要提取出信息。在最后一层中,我们仅仅想使用 10 个神经元来分类 0-9 十个不同的数字。传统上,这是通过最大池化(max-pooling)层来完成的。即使今天有许多更简单的方法能够实现这分类任务,但是,max-pooling 能够帮助我们直觉地理解卷积神经网络是怎么工作的。如果你认为在训练的过程中,我们的小块权重会发展成能够过滤基本形状(水平线、垂直线或曲线等)的 filter,那么,提取有用信息的方式就是识别输出层中哪种形状具有最大的强度。实际上,在 max-pooling 层中,神经元的输出是在 2x2 的分组中被处理,最后仅仅保留输出最大强度的神经元。

这里有一种更简单的方法:如果你是以一步两个像素移动图片上的滑块而不是以每步一个像素地移动图片上的滑块。这种方法被证明是有效的,当今的卷积网络仅仅使用了卷积层。

让我们来构建一个用于手写数字识别的卷积网络。在上方,我们将使用 3 个卷积层;在底部,我们使用传统的 softmax 读出层,并将它们用一个完全连接层相连:

注意,第二与第三卷积层的步长(stride)是2,这就解释了为什么它们的输出值从 28x28 减少为 14x14,然后再到 7x7。卷积层的大小变化使神经元的数量在每层下降约为:28x28x14≈3000 → 14x14x8≈1500 → 7x7x12≈500 → 200。下一节中,我们将给出该网络的具体实现。