mxnet ndarray在python中索引

时间:2018-02-12 19:14:26

标签: python mxnet

我是mxnet的新手。我刚刚在带有CUDA 8.0和cudnn 7.0.5的Ubuntu 14.04机器上安装了mxnet 1.0.0和python 3.5。

我的代码如下。我试图将图像数据存储在ndarray中。 (有关原始代码,请参阅https://github.com/ypwhs/DogBreed_gluon/blob/master/get_features_v3.ipynb)   -

X_224 = nd.zeros((n, 3, 224, 224))
X_299 = nd.zeros((n, 3, 299, 299))

mean = np.array([0.485, 0.456, 0.406])
std = np.array([0.229, 0.224, 0.225])

for i, (fname, breed) in tqdm(df.iterrows(), total=n):
    img = cv2.imread('data/train/%s.jpg' % fname)
    img_224 = ((cv2.resize(img, (224, 224))[:, :, ::-1] / 255.0 - mean) / std).transpose((2, 0, 1))
    img_299 = ((cv2.resize(img, (299, 299))[:, :, ::-1] / 255.0 - mean) / std).transpose((2, 0, 1))

    X_224[i] = nd.array(img_224) <-- I get error in this line
    X_299[i] = nd.array(img_299)

这是我得到的错误:

  

ValueError:不支持索引NDArray索引= 0且类型= class'numpy.int64'。

我假设它必须索引多维nd数组。所以我尝试切片- X_224[i:i+1] = ....,但这给了我另一个错误。

1 个答案:

答案 0 :(得分:1)

您可以将索引的类型从numpy.int64转换为int;例如在尝试设置切片之前i = int(i)

df.iterrows()返回元组,其中第一个元素的类型取决于数据帧索引的类型。 df.iterrows()在运行Github示例时返回了类型(intpandas.core.series.Series)的元组,因此不需要转换(使用Pandas 0.22)。

除了这个特定问题,您可能需要查看Gluon数据集和DataLoader来完成此任务。 mxnet.gluon.data.vision.datasets.ImageFolderDataset可用于加载图像,并通过transform参数接受图像转换功能。

def transform_fn(data, label):
    mean = np.array([0.485, 0.456, 0.406])
    std = np.array([0.229, 0.224, 0.225])
    data = ((cv2.resize(data, (224, 224))[:, :, ::-1] / 255.0 - mean) / std).transpose((2, 0, 1))
    return data, label

image_directory = os.path.join(data_dir, "train")
dataset = mx.gluon.data.vision.ImageFolderDataset(image_directory, transform=transform_fn)
data_loader = mx.gluon.data.DataLoader(dataset, batch_size=10, shuffle=True)

for data, label in data_loader:
    ...