我无论如何也想不出如何切换图像排序。图像是以(x,x,3)格式读取的,theano要求它是(3,x,x)格式。我尝试使用numpy.array([img[:,:,i] for i in range(3)])
更改顺序
我猜这就完成了工作,但它既丑陋,我也不知道如何反转它来恢复原始图像。
发布于 2018-06-08 07:45:00
我同意@Qualia的评论,np.moveaxis(a, source, destination)更容易理解。这就是工作:
x = np.zeros((12, 12, 3))
x.shape
#yields:
(12, 12, 3)
x = np.moveaxis(x, -1, 0)
x.shape
#yields:
(3, 12, 12)
发布于 2017-05-08 00:09:33
重新排序数据的步骤
您可以使用numpy.rollaxis将轴3滚动到位置1(考虑到您的批次大小为维度0)。
np.rollaxis(imagesArray, 3, 1)
但是,如果您正在使用keras,您可能希望更改其配置或按层定义它。如果你使用的是Keras,Theano不需要你做任何事情。
除了允许您在每个单独的层中定义通道之外,Keras还可以先配置通道或最后配置通道,因此您不必更改数据。
配置keras
找到keras.json
文件并更改它。该文件通常安装在C:\Users\yourusername\.keras
或~/.keras
中,具体取决于您的操作系统。
根据需要将"image_data_format": "channels_last"
更改为"channels_first"
,反之亦然。
通常,使用"channels_last“不那么麻烦,因为有大量的其他(非卷积)函数只在最后一个轴上工作。
定义层中的通道顺序。
Keras documentation包含有关层参数的所有信息,包括data_format
参数。
发布于 2020-06-17 04:41:28
如果你正在寻找最快的选择,那就去找.transpose(...)
吧。它甚至比np.einsum
还快。
img = np.random.random((1000, 1000, 3))
img.shape
# (1000, 1000, 3)
%timeit img.transpose(2, 0, 1)
# 385 ns ± 1.11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.rollaxis(img, -1, 0)
# 2.7 µs ± 50.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.einsum('ijk->kij', img)
# 2.75 µs ± 31.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.moveaxis(img, -1, 0)
# 7.26 µs ± 57.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
np.allclose(img.transpose(2, 0, 1), np.einsum('ijk->kij', img))
# True
np.allclose(img.transpose(2, 0, 1), np.moveaxis(img, -1, 0))
# True
np.allclose(img.transpose(2, 0, 1), np.rollaxis(img,-1, 0))
# True
https://stackoverflow.com/questions/43829711
复制相似问题