【发布时间】:2017-01-12 13:03:22
【问题描述】:
为了计算图像均值,如果我没记错的话,可以使用numpy.mean()。
mean() 所做的只是简单地将所有元素相加,然后除以所有元素的总和数。此外,如果我想计算平均通道,(每个通道都有自己的平均计算),并且我有一个形状输入:(num_batch, num_channel, width, height),我会写:
numpy.mean(a,axis=(0,2,3))
现在,我尝试编写它的非矢量化版本,但我不确定我是否正确地做所有事情。
这是假定计算平均通道的代码,(它的输出应该与上面给出的命令相匹配:
def calc_mean_classic(a):
#sum all elements in each channel and divide by the number of elements
batch = a.shape[0]
channel = a.shape[1]
width = a.shape[2]
height = a.shape[3]
sum = np.zeros((channel))
for i in range(batch):
for c in range(channel):
for w in range(width):
for h in range(height):
sum[c] += a[i,c,w,h]
return sum, (sum/(width*height))
当我使用numpy.mean(a,axis=(0,2,3)) 运行我的数据时,我得到:
[ 125.30691805 122.95039414 113.86538318]
但是当我运行我编写的函数时,我得到:
sum,m3 = calc_mean_classic(data_train)
print 'sum=',sum
print 'm3=',m3
print m3[0]/(32*32)
输出:
sum= [ 6.41571420e+09 6.29506018e+09 5.82990762e+09]
m3= [ 6265345.90234375 6147519.70703125 5693269.15917969]
6118.50185776
这里有一个讽刺意味,图像大小是32*32,这就是为什么我在做m3[0]/(32*32) (sum/width*height) 看看我是否可以生成sum[0] 值!如您所见,它们是完全不同的值,但它们应该产生相同的值!
我不知道这里发生了什么。
【问题讨论】:
-
我的快速而肮脏的故障排除技巧:加、减、乘和除预期输出与当前输出。如果你得到奇怪的相关性,那就是线索。如果您将循环输出除以矢量化输出,您将得到 50000,我希望这是您的批量大小 - 这将导致您在下面得到 Divakar 的答案。
-
@DanielForsman:非常感谢,这是一个非常方便的提示 :)