
深度学习是一组机器学习算法,它们使用包含许多非线性变换的体系结构为数据中的高级抽象建模。 同意,这句话听起来很有威胁。 但是,如果创建了Keras(最强大的用于神经网络的库)的Francois Schollay谈到深度学习,一切都不会那么令人恐惧。 通过来自各个领域的实践示例来体验深度学习。 本书分为两个部分,第一部分给出了理论基础,第二部分专门解决特定问题。 这不仅使您可以了解DL的基础知识,还可以学习如何在实践中利用新的机会。 这本书是为那些具有R编程经验的人编写的,他们希望快速地熟悉实践中的深度学习,并且是Francois Scholl畅销书“ Python的深度学习”的安排,但是使用了基于Keras的R接口的示例。
关于这本书
《 R深度学习》一书面向具有R编程技能但在机器和深度学习领域没有丰富知识的统计学家,分析家,工程师和学生。 本书是上一本书《
Python的深度学习》的修订版,其中包含使用Keras R接口的示例。 本书的目的是为R社区提供一个指南,其中包含您需要的所有内容,从基础理论到高级实际应用。 您将看到30多个程序代码示例,其中包含有关使用深度学习解决特定问题所需了解的一切的详细注释,实用建议和简单的广义解释。
这些示例使用Keras深度学习框架和TensorFlow库作为内部机制。 Keras是最流行和增长最快的深度学习框架之一。 通常,它被推荐为初学者学习深度学习的最成功工具。 阅读本书之后,您将了解什么是深度学习,以解决该技术可能涉及的问题以及它的局限性。 您将了解解释和解决机器学习问题的标准流程,以及如何处理常见问题。 您将学习如何使用Keras解决从模式识别到自然语言处理的实际问题:图像分类,时间序列预测,情感分析以及图像和文本生成等等。
摘录。 5.4.1。 中间激活可视化
中间激活的可视化包括显示特征图,这些特征图通过不同的卷积显示,并响应于某些输入数据(级别的输出,激活功能的结果,通常称为激活)来组合网络中的级别。 使用此技术,您可以查看在学习过程中如何将输入数据分解为网络接收到的各种过滤器。 通常,具有三个维度的要素图用于可视化:宽度,高度和深度(颜色通道)。 通道编码相对独立的特征,因此,为了可视化这些特征图,最好为每个通道分别构建二维图像。 我们首先加载第5.2节中存储的模型:
> library(keras) > model <- load_model_hdf5("cats_and_dogs_small_2.h5") > model________________________________________________________________ Layer (type) Output Shape Param # ============================================================== conv2d_5 (Conv2D) (None, 148, 148, 32) 896 ________________________________________________________________ maxpooling2d_5 (MaxPooling2D) (None, 74, 74, 32) 0 ________________________________________________________________ conv2d_6 (Conv2D) (None, 72, 72, 64) 18496 ________________________________________________________________ maxpooling2d_6 (MaxPooling2D) (None, 36, 36, 64) 0 ________________________________________________________________ conv2d_7 (Conv2D) (None, 34, 34, 128) 73856 ________________________________________________________________ maxpooling2d_7 (MaxPooling2D) (None, 17, 17, 128) 0 ________________________________________________________________ conv2d_8 (Conv2D) (None, 15, 15, 128) 147584 ________________________________________________________________ maxpooling2d_8 (MaxPooling2D) (None, 7, 7, 128) 0 ________________________________________________________________ flatten_2 (Flatten) (None, 6272) 0 ________________________________________________________________ dropout_1 (Dropout) (None, 6272) 0 ________________________________________________________________ dense_3 (Dense) (None, 512) 3211776 ________________________________________________________________ dense_4 (Dense) (None, 1) 513 ================================================================ Total params: 3,453,121 Trainable params: 3,453,121 Non-trainable params: 0
接下来,选择不属于训练集的猫的输入图像。
清单5.25 测试图像显示
plot(as.raster(img_tensor[1,,,]))
要提取要可视化的特征图,请创建一个Keras模型,该模型接受图像包并显示所有卷积和组合级别的激活。 为此,我们使用Keras框架中的keras_model函数,该函数有两个参数:输入张量(或输入张量的列表)和输出张量(或输出张量的列表)。 结果将是一个Keras模型对象,该对象类似于您已经熟悉的keras_sequential_model()函数返回的模型; 该模型将给定的输入映射到给定的输出。 特征模型
这种类型可以创建具有多个输出的模型(与keras_sequential_model()相反)。 7.1节将更详细地讨论keras_model函数。
如果将图像传递给该模型,它将返回原始模型中的图层激活值。 这是本书中具有多个输出的模型的第一个示例:到目前为止,上述所有模型都只有一个输入和一个输出。 通常,模型可以具有任意数量的输入和输出。 特别是,此模型具有一个输入和八个输出:每个级别激活一个。
例如,为猫的输入图像激活第一卷积层:
> first_layer_activation <- activations[[1]] > dim(first_layer_activation) [1] 1 148 148 32
这是具有32个通道的148×148的功能图。 让我们尝试显示其中一些。 首先,我们定义一个用于可视化通道的函数。
清单5.28 通道可视化功能
plot_channel <- function(channel) { rotate <- function(x) t(apply(x, 2, rev)) image(rotate(channel), axes = FALSE, asp = 1, col = terrain.colors(12)) }
现在,我们将显示原始模型的第一级激活的第二个通道(图5.18)。 该通道似乎代表一个环路检测器。
清单5.29 通道2可视化
plot_channel(first_layer_activation[1,,,2])
现在让我们看一下第七个通道(图5.19),但是请记住,您的通道可能有所不同,因为学习特定的过滤器不是确定性操作。 这个频道略有不同,看起来像是突出了猫的虹膜。
清单5.30 Channel 7可视化
plot_channel(first_layer_activation[1,,,7])
现在,我们将对网络上的所有激活进行完整的可视化处理(清单5.31)。 为此,请在所有八个激活图中提取并显示每个通道,并将结果放置在一个更大的带有图像的张量中(图5.20–5.23)。
清单5.31 可视化所有中间激活的所有通道
image_size <- 58 images_per_row <- 16 for (i in 1:8) { layer_activation <- activations[[i]] layer_name <- model$layers[[i]]$name n_features <- dim(layer_activation)[[4]] n_cols <- n_features %/% images_per_row png(paste0("cat_activations_", i, "_", layer_name, ".png"), width = image_size * images_per_row, height = image_size * n_cols) op <- par(mfrow = c(n_cols, images_per_row), mai = rep_len(0.02, 4)) for (col in 0:(n_cols-1)) { for (row in 0:(images_per_row-1)) { channel_image <- layer_activation[1,,,(col*images_per_row) + row + 1] plot_channel(channel_image) } } par(op) dev.off() }
以下是有关结果的一些评论。
- 第一层充当不同环路检测器的集合。 在此阶段,激活会保存原始图像中几乎所有可用的信息。
- 当您向上移动激活层时,它们变得更加抽象,并且它们的视觉解释也变得更加复杂。 他们开始编写高级概念,例如“猫的耳朵”或“猫的眼睛”。 高级表示形式携带的有关原始图像的信息越来越少,而有关图像类别的信息也越来越多。
- 激活的稀疏度随层的深度而增加:在第一层中,所有滤镜都被原始图像激活,但是在随后的层中,空滤镜越来越多。 这意味着在原始图像中找不到与滤镜匹配的图案。
我们刚刚研究了深度神经网络创建的表示的一个重要的通用特征:随着层的深度,层提取的特征变得更加抽象。 上层的激活包含关于特定输入图像的信息越来越少,而关于目标的信息也越来越多(在这种情况下,图像类别是猫还是狗)。 深度神经网络实际上充当清理信息的管道,该管道接收原始数据(在这种情况下为RGB格式的图像)并重复进行转换,过滤掉不必要的信息(例如,图像的特定外观),然后离开并清除正确的信息(例如,一类图片)。
人们和动物几乎以相同的方式感知周围的世界:观察场景几秒钟后,一个人记住了其中存在哪些抽象物体(自行车,树木),但不记得这些物体的外观的所有细节。 实际上,当尝试从内存中提取自行车时,即使您可以看到数千次自行车,也很可能无法获得或多或少正确的图像(请参见图5.24中的示例)。 立即尝试执行此操作,您将确信所说内容的真实性。 您的大脑学会了完全抽象输入端接收到的可见图像,并将其转换为高级视觉概念,同时过滤掉不重要的视觉细节,从而使其难以记住。
»这本书的更多信息可以
在出版商的网站上找到»
目录»
摘录小贩20%优惠券
-R深度学习