2016-11-30 109 views
2

this blog中,作者包含构建VGG16网络的代码段。我有一个关于代码关于使用Keras构建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 

相关的以下部分model.add(ZeroPadding2D((1, 1), batch_input_shape=(1, 3, img_width, img_height)))一些问题,就是它总是真的,我们通常使用ZeroPadding2D打造的第一层读取图像作为输入? (1,1)对输入 参数ZeroPadding2D指示什么。根据Keras文档,这意味着我们为行和列都添加1个零。如何决定添加多少个零?

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

回答

4

我们通常使用ZeroPadding2D构建第一层读取图像作为输入,这总是正确的吗?

取决于。在这个特定的代码中,作者打算执行3×3卷积,其输出图像特征与作为输入图像的相同的宽度和高度。如果输入图像大小是2的幂,通常会出现这种情况,因为您希望保留2x2池图层的编号。

没有填充:

128x128 -[3x3 conv]-> 126x126 -[2x2 pool]-> 63x63 -[3x3 conv]-> 61x61 -> *how to pool next?* 

随着填充:

128x128 -[pad 1]-> 130x130 -[3x3 conv]-> 128x128 -[2x2 pool]-> 64x64 
-[pad+conv+pool]-> 32x32 -[...]-> 16x16 -> 8x8 ... 

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

如果输入图像是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 

如果您有意使用5x5的卷积保持图像的尺寸,你需要一个(2,2)填充。

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

可以使用精确索引。但是,如果您决定在第一个卷积图层下面添加预处理图层,则不需要更改索引,因为它总是提供最上层的图层。如果您忘记了,减少错误。

+0

感谢您提供非常详细的解释。 – user785099