【发布时间】:2017-06-03 21:49:15
【问题描述】:
我试图弄清楚 CNN 中的步幅是如何编码的,但我似乎无法有效地实现它——脚本需要很长时间才能完成计算,否则我会遇到错误
from PIL import Image
img = Image.open('C:\sample_pic.jpeg').convert("RGB") #800 x600 dimensions
pixels =np.array(img) # However PIL inverts height and width so #600 X800
print(pixels.shape) # (600L, 800L, 3L)
理想情况下,我不想展平图像,但是当正确使用 1 的步幅时,我无法弄清楚如何将 600 x 800 x 3 的图像与 2x3x3 的滤镜相乘。因此,我尝试将阵列展平,因为我觉得这样会更容易。
flat = pixels.flatten()
filter1= np.array([1,1,0],)
pixels2 = np.array([])
for i in range(0, len(flat),2):
pixels2 =np.append(pixels2,np.sum((flat[i:i+3] * filter1)))
所以我尝试将每个像素的 RGB 值与过滤器相乘,然后取和然后滑动 2。我试图可视化 CNN 的第一个卷积层。 在这里,我无法弄清楚如何告诉循环仅在 i+3 个元素可用时进行迭代。我认为这就是我收到以下错误的原因
ValueError: operands could not be broadcast together with shapes (2,) (3,)
还有一种计算速度更快的方法可以将过滤器值与图像的像素值相乘,因为我的笔记本电脑需要很长时间来计算。 (英特尔 i-7 3610QM @2.30 Geforce 650M GT 2GB)
编辑:为清晰起见进行编辑。如果可以将 600x800x3 数组与 2x3x3 的过滤器相乘,那么我想使用 1 的步幅。 我希望过滤器看起来像这样,
[[[1,1,0]
[1,1,0]
[1,1,0]]
[[1,1,0]
[1,1,0]
[1,1,0]]]
2 行,每行 3 列,每列有三个值 [1,1,0]
原始图像为 600 行(高度)、800 列(宽度)和 3 个值(RGB 值)。
如有任何混淆,我们深表歉意。
我正在使用的图片:
【问题讨论】:
-
输出数组的形状是什么?
-
嗨,理想情况下,我想要一个可以重塑为图片尺寸自然尺寸的输出。因此,如果可能的话,我希望能够将每个维度重塑为 350(最小值)。
-
修改您的循环代码以使其与
2x3x3形状的过滤器一起工作,因为这似乎是最终目的地?你说-"RGB values of each pixel with the filter,"。使用多维过滤器,有多种方法可以解释过滤操作。因此,循环代码将有助于演示您的想法。 -
您是否尝试将
(2, 2, 3)与(600, 800, 3)进行卷积?您想为每个颜色平面单独执行此操作,生成(599, 799, 3)输出,还是一起生成(599, 799)输出?还是您的意思是步幅为 2,给(300, 400, 3)或(300, 400)? -
对不起,造成混乱。当图像未展平时,我希望步幅为 1。我想要一个3维的输出。所以我假设(599,799,3)将是如果我使用步幅为 1 和过滤器(2,3,3)的输出。谢谢。
标签: python-2.7 numpy python-imaging-library conv-neural-network