关于使用 Keras 在 VGG16 中构建第一个输入层

use*_*099 2 theano deep-learning keras tensorflow

这篇博客中,作者包含了一个代码段来构建 VGG16 网络。我对代码的以下部分有一些疑问

model = Sequential()
model.add(ZeroPadding2D((1, 1), batch_input_shape=(1, 3, img_width, img_height)))
first_layer = model.layers[-1]
# this is a placeholder tensor that will contain our generated images
input_img = first_layer.input
Run Code Online (Sandbox Code Playgroud)

与 相关model.add(ZeroPadding2D((1, 1), batch_input_shape=(1, 3, img_width, img_height))),我们通常使用ZeroPadding2D构建第一层读取图像作为输入总是正确的吗?什么(1,1)表示ZeroPadding2D..的输入参数根据Keras文档,这意味着我们为行和列都添加了1个零。如何决定添加多少个零?

其次,为什么我们需要设置-1first_layer = model.layers[-1]?这里我们只有一层,应该0改为吗?

Kh4*_*tiK 5

我们通常使用 ZeroPadding2D 来构建第一层读取图像作为输入是真的吗?

要看。在这个特定的代码中,作者打算执行一个 3x3 卷积,输出与输入图像具有相同宽度和高度的图像特征。如果输入图像大小是 2 的幂,则通常​​会出现这种情况,因为您希望保留 2x2 池化层的数量。

无填充:

128x128 -[3x3 conv]-> 126x126 -[2x2 pool]-> 63x63 -[3x3 conv]-> 61x61 -> *how to pool next?*
Run Code Online (Sandbox Code Playgroud)

带填充:

128x128 -[pad 1]-> 130x130 -[3x3 conv]-> 128x128 -[2x2 pool]-> 64x64
-[pad+conv+pool]-> 32x32 -[...]-> 16x16 -> 8x8 ...
Run Code Online (Sandbox Code Playgroud)

ZeroPadding2D 的输入参数 (1,1) 表示什么?

如果输入图像是 128*128,(1,1)零填充将创建一个 130x130 的图像,并添加一个 1 像素宽的黑框。(1,1)表示分别在水平/垂直边缘添加多少像素。

           o o o o o
x x x      o x x x o
x x x  ->  o x x x o
x x x      o x x x o
           o o o o o
Run Code Online (Sandbox Code Playgroud)

如果您打算使用 5x5 卷积保持图像尺寸,则需要(2,2)填充。

为什么我们需要在 first_layer = model.layers[-1] 中设置 -1?

可以使用精确索引。然而,如果有一天你决定在第一个卷积层下面添加一个预处理层,你不需要更改[-1]索引,因为它总是给出最顶层。减少错误,以防您忘记。