numpy:将图像形状从224 x 224 x 3更改为3 x 224 x 224的最快方法

时间:2017-12-30 17:56:02

标签: python numpy keras

我将使用Keras预训练的Inception V3模型。预处理后,图像形状为224 x 224 x 3.但是Keras Inception V3模型的输入是(?,3,?,?),即批量大小到达通道之后。所以我做了数组重塑。但是这使得整个事情变得非常缓慢并且耗尽记忆我不知道为什么。

注意:当图像形状为224,224,3时,它在简单的CNN上工作正常。但3,224,224馈送到简单的CNN使事情变得非常缓慢和内存溢出。

这是我的代码:

def get_image_preprocessed(image_name):
    im = Image.open(image_name)
    im = np.asarray(im)
    im = im/float(255)
    im = im.reshape(3,224,224) #this changes 224,224,3 to 3,224,224
    return im

这是输入张量形状

  

tf.Tensor' input_1:0' shape =(?,3,?,?)dtype = float32

更多信息:

模型 -

model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(3,224, 224), padding='same', activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(0.2))
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3)))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

生成器功能 -

def generator(save_dir_path, encoding_list, batch_size, image_size):
    # Create empty arrays to contain batch of features and labels#
    batch_features = np.zeros((batch_size, 3, image_size, image_size))
    batch_labels = np.zeros((batch_size,len(encoding_list)))
    image_list= [file for file in os.listdir(save_dir_path) if (file.endswith('.jpeg') or file.endswith('.-'))]
    while True:
        for i in range(batch_size):
            # choose random index in features
            image_name= random.choice(image_list)
            batch_features[i] = get_image_preprocessed(save_dir_path, image_name)
            batch_labels[i] = np.asarray(get_encoding(encoding_list, image_name.split('_')[0]))
        yield batch_features, batch_labels

2 个答案:

答案 0 :(得分:1)

您可以使用.transpose

im = im.transpose(2,0,1)

所以从现在开始,旧的第三个索引(2)是第一个索引,旧的第一个索引(0)是第二个索引,旧的第二个索引({{1}) })是第三个索引。

因此,如果您访问1,就像您在转置之前访问了im[i,j,k] 一样。

答案 1 :(得分:0)

除了reshapetranspose之外,还有另一个类似的解决方案:Numpy库中的swapaxes。以下行将第一个轴与数组im中的第三个轴交换。

im.swapaxes(0,2)
  

如果a是ndarray,则返回a的视图;否则一个新的   数组已创建。 - 引自numpy-1.13.0 Docs

参考

How does numpy.swapaxes work?