Tensorflow的正确打开方式:Tensorboard调试神经网络和可视化训练
2017年07月18日 由 yining 发表
496208
0
本文将向你推荐一个名叫Tensorboard的工具,是Tensorflow自带的可视化模块。Tensorboard对你的深度学习研究十分有帮助,你可以将它添加到深度学习的工具箱中。
注:
本文假设你了解构建神经网络的基础知识,并对keras有一定程度的了解。
如果没有,我建议先阅读这些文章,然后再回到本文
目录:
- 训练一个神经网络:是恩惠还是诅咒?
- 用神经网络解决年龄检测问题
- Tensorboard的概述
- 回去解决问题
- 结论
- 有用的资源
训练一个神经网络:是恩惠还是诅咒?
训练神经网络通常是一种高风险但高回报的策略。如果你对它做了正确的调整,你可能会有一个最先进的工作模型帮你来完成任务。举个例子,图像生成是神经网络最近的一个突破。只需用人工画笔画上几笔,你就可以创造出一幅真实的自然场景图像。
图片来源
但另一方面,培养一个生成神经网络是极其困难的。你必须经历一个严格的试验和错误阶段才能得到正确的成果。
几天前,当我试图建立一个用于
年龄检测问题的工作模型时,我不得不经历了与训练神经网络类似的经历。当我为这个问题做了第一个模型时,它非常绝对地拒绝接受训练。在本文中,我将分享我如何调试神经网络的方法。请继续收看,因为本文有一个Happy Ending!
用神经网络解决年龄检测问题
在开始解决这个问题之前,让我先概述一下这个问题是什么。
对
通过图像识别技术检测年龄是最近发布的一项实践问题,该问题涉及提取面部特征进行年龄分析。由于这是一个图像处理问题,我自然而然地选择了神经网络来解决这个问题。但就像我之前说的,网络不会进行培训。即使我让它在200次迭代中训练超过一个小时,也不会有任何的变化。这里有一个证明。
很明显,这是行不通的!
我在下面提到的这些步骤是当我陷入这种问题时通常会遵循的步骤。如果你仔细考虑,可能有两个主要的原因让你的神经网络无法正常工作:
1.你的神经网络架构是不正确的
2.你给的网络的数据出了问题
让我们一个接一个地讨论这些原因来消除这些“不可能”。
测试神经网络体系结构
步骤1:检查架构
在构建神经网络时,首先要检查的是是否正确地定义了体系结构。这里我们有一个三类问题,在数据集中有不同大小的图像。
为了简化,我把所有的图像都转换为32×32的尺寸。
temp = []
for img_name in train.ID:
img_path = os.path.join(data_dir, 'Train', img_name)
img = imread(img_path)
img = imresize(img, (32, 32))
temp.append(img.astype('float32'))
train_x = np.stack(temp)
根据这一点,我已经定义了如下的结构。
# define vars
input_num_units = 32 * 32 * 3 # image is 3D (RGB) that is why multiply by 3
hidden_num_units = 500
output_num_units = 3
epochs = 50
batch_size = 128
model = Sequential([
InputLayer(input_shape=(input_num_units,)),
Dense(units=hidden_num_units, activation='relu'),
Dense(units=output_num_units, activation='softmax'),
])
我在神经网络的架构中没有看到任何问题。
步骤2:检查神经网络的超参数
根据我的说法,这是处理神经网络时最重要的一步。因为有太多的参数需要调优,所以尝试这些参数有时会让人感到挫败。
(注:我做了一个关于超参数的调查,以及如何在这篇
文章中对它们进行调优。)
幸运的是,我使用了一个非常简单的神经网络,该神经网络只有一个隐藏层,使用了经典梯度下降算法(SGD)。
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
这里有一件值得注意的事情,当你用SGD训练神经网络时,它可能会缓慢地训练。为了克服这一问题,我们可以使用自适应梯度下降来更快地训练网络。
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
但问题是,即使把训练算法从SGD转换到Adam算法,网络也没有进行训练。这仅仅意味着网络的本质上是错误的。我不得不用Thor’s hammer来突破这个问题!
Tensorboard的概述
在理解神经网络的过程中,我已经经历了许多用于构建和可视化神经网络的工具。在所有这些方面,我发现tensorboard是一项重要的资产。在训练神经网络时,它能给你提供有用的帮助。
我将提到如何在你的系统中安装tensorboard的步骤。我建议你自己试一试。
你可以使用 Python包管理工具——pip 来安装Tensorboard。
pip install Tensorboard
安装之后,你可以通过进入终端和打字来打开tensorboard。
tensorboard --logdir=logs/
这里有一个视图显示它在浏览器上的样子
上面提到的“logs/”文件夹应该有关于神经网络如何训练的历史。你可以通过在kera中包含的一个tensorboard回调来获得它。
model.fit(train_x, train_y, batch_size=batch_size,epochs=epochs,verbose=1,
validation_split=0.2, callbacks=[keras.callbacks.TensorBoard(log_dir="logs/
final/{}".format(time()), histogram_freq=1, write_graph=True, write_images=
True)])
在本例中,我已经传递了所有的参数,以便所有的内容都得到了保存。参数的意义如下:
- write_graph: 打印在内部定义神经网络图。
- write_images:通过结合神经网络的权重来创建一个图像。
- histogram_freq:在神经网络中绘制出权重和偏差的分布
回去解决问题
步骤3:检查网络的复杂性
下面来检查我所建立的网络是否足够了解问题的分布。为此,我不再使用简单的神经网络,而是将架构更改为卷积神经网络。其结果是,准确度从一开始就大幅增加(从33%到54%)。即使在训练之后,它仍然保持不变。
似乎我们的小实验失败了。
测试数据
步骤4:检查输入数据的结构
在彻底检查网络体系结构之后,开始检查是否有合适的数据集。
需要检查的几件事:
正如步骤1所讨论的,我们已经确保在将图像发送到网络之前,图像的大小是相同的,所以这是毫无疑问的。
数据集并不是不平衡的,因为我们每个类仍然有大量的图像。
MIDDLE 0.542751
YOUNG 0.336883
OLD 0.120366
在这里,我们应该检查是否有正确处理的输入。例如,在图像处理问题中,如果我们处理图像,并且结果输入有不规则的宽比,那么神经网络显然会被它打乱。
在这里它是一个简单的网络,我们还没有做任何预处理步骤。所以这也是毫无疑问的。
步骤5:检查数据的分布
在解决了我们可能遇到的大多数问题之后,我对真正的问题感到有些困惑。
幸运的是,我的困惑很快就被消除,因为我发现了一个很奇怪的bug,我应该早点发现它。
这个问题是,我发送给网络的输入数据的范围是0到255。理想情况下,这个范围应该在0到1之间。输入数据的分布如下:
让我向你解释一下为什么正常化(将范围从0设置为1)很重要。
图片来源
你可以看到,如果你的数据没有一个简单的分布,那么神经网络可能会发现这个分布很难去学习。它肯定会尝试收敛,但不能保证完全收敛。这个概念的扩展版本是batch normalization,它确保数据在一层神经网络之后被规范化。这有一篇
文章主要讨论了batch normalization怎样更好地训练神经网络的深入分析。
这是我用来读取图像并使它们标准化的代码。
temp = []
for img_name in train.ID:
img_path = os.path.join(data_dir, 'Train', img_name)
img = imread(img_path)
img = imresize(img, (32, 32))
temp.append(img.astype('float32'))
train_x = np.stack(temp)
train_x = train_x / 255. # normalization step
瞧! 在我添加了一个简单的标准化步骤之后,我发现神经网络开始训练了。我实在是太高兴了! !
总结
总结一下,这些是调试神经网络时应该注意的步骤。
步骤1:检查架构
步骤2:检查神经网络的超参数
步骤3:检查网络的复杂性
步骤4:检查输入数据的结构
步骤5:检查数据的分布
实用资源
此文为编译作品,作者
FAIZAN SHAIKH,原网站:https://www.analyticsvidhya.com/blog/2017/07/debugging-neural-network-with-tensorboard/