为什么 Conv2D 似乎只能在 1D 中执行?
Why does Conv2D seems to only performing in 1D?
我想了解 Tensorflow 的工作原理。
我有这段代码试图对大小为 (5,5) 的输入图像执行 2D 卷积。
但是好像只是在一维而不是二维进行卷积。
代码如下:
iX = iY = 5
kX = kY = 3
image = np.ones((iY,iX)).reshape((iY,iX,1))
kernel = np.ones((kY,kX)).reshape((kY,kX,1,1))
bias = np.array([0.0])
i = layers.Input(shape=(iY,iX,1))#l_input
x = layers.Conv2D(1, (kY,kX), strides=1, padding="same", activation='linear',weights=[kernel,bias])(i)#l_conv2d(i)
model = keras.Model(i, x)
model(image).numpy()
实际输出:
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
预期输出:
[4, 6, 6, 6, 4]
[6, 9, 9, 9, 6]
[6, 9, 9, 9, 6]
[6, 9, 9, 9, 6]
[4, 6, 6, 6, 4]
我做错了什么?
您已经提到 padding='same'
这就是为什么您得到的输出具有与输入图像 5x5x1x1 相同的形状,格式为 Height X Width X Channel X No_of_filters
。 padding='same'
参数向图像添加额外的填充值以获得所需的输出体积形状。您可以使用 padding='valid'
来避免填充。
您在向模型提供图像时也错过了批量维度:
iX = iY = 9
kX = kY = 3
no_of_filter = 2
image = np.ones((iY,iX)).reshape((1,iY,iX,1))
kernel = np.ones((kY,kX,no_of_filter)).reshape((kY,kX,1,no_of_filter))
bias = np.array([0.0 for _ in range(no_of_filter)])
i = layers.Input(shape=(iY,iX,1))#l_input
x = layers.Conv2D(no_of_filter, (kY,kX), strides=1, padding="valid", activation='linear',weights=[kernel,bias])(i) #l_conv2d(i)
model = keras.Model(i, x)
model.summary()
model(image).numpy().shape
我想了解 Tensorflow 的工作原理。 我有这段代码试图对大小为 (5,5) 的输入图像执行 2D 卷积。 但是好像只是在一维而不是二维进行卷积。
代码如下:
iX = iY = 5
kX = kY = 3
image = np.ones((iY,iX)).reshape((iY,iX,1))
kernel = np.ones((kY,kX)).reshape((kY,kX,1,1))
bias = np.array([0.0])
i = layers.Input(shape=(iY,iX,1))#l_input
x = layers.Conv2D(1, (kY,kX), strides=1, padding="same", activation='linear',weights=[kernel,bias])(i)#l_conv2d(i)
model = keras.Model(i, x)
model(image).numpy()
实际输出:
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
[2, 3, 3, 3, 2]
预期输出:
[4, 6, 6, 6, 4]
[6, 9, 9, 9, 6]
[6, 9, 9, 9, 6]
[6, 9, 9, 9, 6]
[4, 6, 6, 6, 4]
我做错了什么?
您已经提到 padding='same'
这就是为什么您得到的输出具有与输入图像 5x5x1x1 相同的形状,格式为 Height X Width X Channel X No_of_filters
。 padding='same'
参数向图像添加额外的填充值以获得所需的输出体积形状。您可以使用 padding='valid'
来避免填充。
您在向模型提供图像时也错过了批量维度:
iX = iY = 9
kX = kY = 3
no_of_filter = 2
image = np.ones((iY,iX)).reshape((1,iY,iX,1))
kernel = np.ones((kY,kX,no_of_filter)).reshape((kY,kX,1,no_of_filter))
bias = np.array([0.0 for _ in range(no_of_filter)])
i = layers.Input(shape=(iY,iX,1))#l_input
x = layers.Conv2D(no_of_filter, (kY,kX), strides=1, padding="valid", activation='linear',weights=[kernel,bias])(i) #l_conv2d(i)
model = keras.Model(i, x)
model.summary()
model(image).numpy().shape