填充输入向量,一个 4-D 矩阵,使用 numpy 用于卷积神经网络 (CNN)
padding a input vector, a 4-D matrix, using numpy for a convolutional neural network (CNN)
这是与我的问题相关的完整代码。您应该能够 运行 此代码并查看创建的图 - 只需将其粘贴并 运行 到您的 IDE 即可。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
x = np.random.randn(4, 3, 3, 2)
x_pad = np.pad(x, ((0,0), (2, 2), (2, 2), (0,0))\
, mode='constant', constant_values = (0,0))
print ("x.shape =\n", x.shape)
print ("x_pad.shape =\n", x_pad.shape)
print ("x[1,1] =\n", x[1,1])
print ("x_pad[1,1] =\n", x_pad[1,1])
fig, axarr = plt.subplots(1, 2)
axarr[0].set_title('x')
axarr[0].imshow(x[0,:,:,0])
axarr[1].set_title('x_pad')
axarr[1].imshow(x_pad[0,:,:,0])
具体来说,我的问题与这两行代码有关:
x = np.random.randn(4, 3, 3, 2)
x_pad = np.pad(x, ((0,0), (2, 2), (2, 2), (0,0)), mode='constant', constant_values = (0,0))
我想在 x
中填充第 2 和第 3 维。所以,我想填充 x[1]
的值为 3
和 x[2]
的值也为 3
。根据我正在解决的问题,x[0]
和 x[3]
分别包含“4”和“2”,代表其他内容。 x[0]
表示这样的3*3矩阵的个数和x[3]
个通道数。
我的问题是关于 python 如何表示这些信息以及我们如何解释它。这些是一样的吗?
语句x = np.random.randn (4, 3, 3, 2)
创建了一个4行3列的矩阵,这个4*3矩阵中的每个元素都是一个3行2列的矩阵。这就是 Python 代表 x_pad
的方式。这个理解对吗?
如果是这样,那么在 np.pad
语句中,我们将填充外矩阵中的列数(在 4*3 中为 3)。我们还在“3*2”中填充行数,即 3——即内部矩阵中的行数)。
(4, 3, 3, 2) 中的 3, 3 应该只是一个矩阵的一部分,而不是外矩阵的列和内矩阵的行?我无法想象这个?有人可以澄清一下吗?谢谢!
这些行:
x = np.random.randn(4, 3, 3, 2)
x_pad = np.pad(x, ((0,0), (2, 2), (2, 2), (0,0)), mode='constant', constant_values = (0,0))
相当于:
x = np.random.randn(4, 3, 3, 2)
x_pad = np.zeros((4, 3+2+2, 3+2+2, 2))
x_pad[:, 2:-2, 2:-2, :] = x
您可以将 4 维数组解释为二维数组的二维数组,如果它符合此数据代表的任何内容,但 numpy 在内部将数组存储为一维数据数组; x[i,j,k,l]
指向 data[l+n3*(k + n2*(j + n1*i))]
其中 n1、n2、n3 是相应轴的长度。
可视化 4-D(和更高)阵列对人类来说非常困难。当你处理这样的数组时,你只需要跟踪四个轴的索引。
这是与我的问题相关的完整代码。您应该能够 运行 此代码并查看创建的图 - 只需将其粘贴并 运行 到您的 IDE 即可。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
x = np.random.randn(4, 3, 3, 2)
x_pad = np.pad(x, ((0,0), (2, 2), (2, 2), (0,0))\
, mode='constant', constant_values = (0,0))
print ("x.shape =\n", x.shape)
print ("x_pad.shape =\n", x_pad.shape)
print ("x[1,1] =\n", x[1,1])
print ("x_pad[1,1] =\n", x_pad[1,1])
fig, axarr = plt.subplots(1, 2)
axarr[0].set_title('x')
axarr[0].imshow(x[0,:,:,0])
axarr[1].set_title('x_pad')
axarr[1].imshow(x_pad[0,:,:,0])
具体来说,我的问题与这两行代码有关:
x = np.random.randn(4, 3, 3, 2)
x_pad = np.pad(x, ((0,0), (2, 2), (2, 2), (0,0)), mode='constant', constant_values = (0,0))
我想在 x
中填充第 2 和第 3 维。所以,我想填充 x[1]
的值为 3
和 x[2]
的值也为 3
。根据我正在解决的问题,x[0]
和 x[3]
分别包含“4”和“2”,代表其他内容。 x[0]
表示这样的3*3矩阵的个数和x[3]
个通道数。
我的问题是关于 python 如何表示这些信息以及我们如何解释它。这些是一样的吗?
语句x = np.random.randn (4, 3, 3, 2)
创建了一个4行3列的矩阵,这个4*3矩阵中的每个元素都是一个3行2列的矩阵。这就是 Python 代表 x_pad
的方式。这个理解对吗?
如果是这样,那么在 np.pad
语句中,我们将填充外矩阵中的列数(在 4*3 中为 3)。我们还在“3*2”中填充行数,即 3——即内部矩阵中的行数)。
(4, 3, 3, 2) 中的 3, 3 应该只是一个矩阵的一部分,而不是外矩阵的列和内矩阵的行?我无法想象这个?有人可以澄清一下吗?谢谢!
这些行:
x = np.random.randn(4, 3, 3, 2)
x_pad = np.pad(x, ((0,0), (2, 2), (2, 2), (0,0)), mode='constant', constant_values = (0,0))
相当于:
x = np.random.randn(4, 3, 3, 2)
x_pad = np.zeros((4, 3+2+2, 3+2+2, 2))
x_pad[:, 2:-2, 2:-2, :] = x
您可以将 4 维数组解释为二维数组的二维数组,如果它符合此数据代表的任何内容,但 numpy 在内部将数组存储为一维数据数组; x[i,j,k,l]
指向 data[l+n3*(k + n2*(j + n1*i))]
其中 n1、n2、n3 是相应轴的长度。
可视化 4-D(和更高)阵列对人类来说非常困难。当你处理这样的数组时,你只需要跟踪四个轴的索引。