Tensorflow的正确打开方式:Tensorboard调试神经网络和可视化训练

2017年07月18日 由 yining 发表 496186 0
Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

本文将向你推荐一个名叫Tensorboard的工具,是Tensorflow自带的可视化模块。Tensorboard对你的深度学习研究十分有帮助,你可以将它添加到深度学习的工具箱中。

注:

本文假设你了解构建神经网络的基础知识,并对keras有一定程度的了解。

如果没有,我建议先阅读这些文章,然后再回到本文

目录:



  • 训练一个神经网络:是恩惠还是诅咒?

  • 用神经网络解决年龄检测问题

  • Tensorboard的概述

  • 回去解决问题

  • 结论

  • 有用的资源


训练一个神经网络:是恩惠还是诅咒?


训练神经网络通常是一种高风险但高回报的策略。如果你对它做了正确的调整,你可能会有一个最先进的工作模型帮你来完成任务。举个例子,图像生成是神经网络最近的一个突破。只需用人工画笔画上几笔,你就可以创造出一幅真实的自然场景图像。

Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

图片来源


但另一方面,培养一个生成神经网络是极其困难的。你必须经历一个严格的试验和错误阶段才能得到正确的成果。

几天前,当我试图建立一个用于年龄检测问题的工作模型时,我不得不经历了与训练神经网络类似的经历。当我为这个问题做了第一个模型时,它非常绝对地拒绝接受训练。在本文中,我将分享我如何调试神经网络的方法。请继续收看,因为本文有一个Happy Ending!

用神经网络解决年龄检测问题


在开始解决这个问题之前,让我先概述一下这个问题是什么。

通过图像识别技术检测年龄是最近发布的一项实践问题,该问题涉及提取面部特征进行年龄分析。由于这是一个图像处理问题,我自然而然地选择了神经网络来解决这个问题。但就像我之前说的,网络不会进行培训。即使我让它在200次迭代中训练超过一个小时,也不会有任何的变化。这里有一个证明。

Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

很明显,这是行不通的!

我在下面提到的这些步骤是当我陷入这种问题时通常会遵循的步骤。如果你仔细考虑,可能有两个主要的原因让你的神经网络无法正常工作:

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/

这里有一个视图显示它在浏览器上的样子

Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

上面提到的“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: 打印在内部定义神经网络图。


Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

  • write_images:通过结合神经网络的权重来创建一个图像。


Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

  • histogram_freq:在神经网络中绘制出权重和偏差的分布


Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

回去解决问题


步骤3:检查网络的复杂性

下面来检查我所建立的网络是否足够了解问题的分布。为此,我不再使用简单的神经网络,而是将架构更改为卷积神经网络。其结果是,准确度从一开始就大幅增加(从33%到54%)。即使在训练之后,它仍然保持不变。

Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

似乎我们的小实验失败了。

测试数据


步骤4:检查输入数据的结构

在彻底检查网络体系结构之后,开始检查是否有合适的数据集。

需要检查的几件事:

  • 是否所有的记录都是相同的大小?


正如步骤1所讨论的,我们已经确保在将图像发送到网络之前,图像的大小是相同的,所以这是毫无疑问的。

  • 是否问题是不平衡的?


数据集并不是不平衡的,因为我们每个类仍然有大量的图像。
MIDDLE    0.542751

YOUNG     0.336883

OLD       0.120366


  • 是否进行了适当的预处理?


在这里,我们应该检查是否有正确处理的输入。例如,在图像处理问题中,如果我们处理图像,并且结果输入有不规则的宽比,那么神经网络显然会被它打乱。

在这里它是一个简单的网络,我们还没有做任何预处理步骤。所以这也是毫无疑问的。

步骤5:检查数据的分布

在解决了我们可能遇到的大多数问题之后,我对真正的问题感到有些困惑。

幸运的是,我的困惑很快就被消除,因为我发现了一个很奇怪的bug,我应该早点发现它。

这个问题是,我发送给网络的输入数据的范围是0到255。理想情况下,这个范围应该在0到1之间。输入数据的分布如下:

Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

让我向你解释一下为什么正常化(将范围从0设置为1)很重要。

Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

图片来源


你可以看到,如果你的数据没有一个简单的分布,那么神经网络可能会发现这个分布很难去学习。它肯定会尝试收敛,但不能保证完全收敛。这个概念的扩展版本是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

瞧! 在我添加了一个简单的标准化步骤之后,我发现神经网络开始训练了。我实在是太高兴了! !

Tensorflow的正确打开方式:Tensorboard对神经网络的调试和可视化训练

总结


总结一下,这些是调试神经网络时应该注意的步骤。

步骤1:检查架构

步骤2:检查神经网络的超参数

步骤3:检查网络的复杂性

步骤4:检查输入数据的结构

步骤5:检查数据的分布

实用资源



 

 

此文为编译作品,作者
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消