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

Tensorflow 关于使用Keras在VGG16中构建第一个输入层,tensorflow,deep-learning,theano,keras,Tensorflow,Deep Learning,Theano,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_i

在本文中,作者包含了构建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\u input\u shape=(1,3,img\u width,img\u height))
,我们通常使用
ZeroPadding2D
构建第一层读取图像作为输入,这是否总是正确的?
(1,1)
为输入指示了什么
ZeroPadding2D
的参数。根据Keras文档,这意味着我们为行和列都添加了1个零。如何决定要加多少个零

其次,为什么我们需要在
第一层=模型层[-1]
中设置
-1
?这里我们只有一个层,它应该是
0

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

视情况而定。在这段特殊的代码中,作者打算执行3x3卷积,输出与输入图像具有相同宽度和高度的图像特征。如果输入图像大小为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


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

谢谢您的详细解释。