【问题标题】:MXNET - Invalid type '<type 'numpy.ndarray'>' for data, should be NDArray, numpy.ndarray,MXNET - 数据的“<type 'numpy.ndarray'>”类型无效,应为 NDArray、numpy.ndarray、
【发布时间】:2018-04-12 04:31:00
【问题描述】:

我在使用 mxnet 的基本 IO 时遇到问题。我正在尝试使用 mxnet.io.NDArrayIter 读取内存数据集以在 mxnet 中进行训练。我有以下代码(为简洁起见),它预处理代码并尝试迭代它(主要基于tutorial):

import csv
import mxnet as mx
import numpy as np

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.pipeline import Pipeline


with open('data.csv', 'r') as data_file:
    data = list(csv.reader(data_file))

labels = np.array(map(lambda x: x[1], data)) # one-hot encoded classes
data = map(lambda x: x[0], data) # raw text in need of pre-processing

transformer = Pipeline(steps=(('count_vectorizer', CountVectorizer()),
                              ('tfidf_transformer', TfidfTransformer())))

preprocessed_data = np.array([np.array(row) for row in transformer.fit_transform(data)])

training_data = mx.io.NDArrayIter(data=preprocessed_data, label=labels, batch_size=50)

for i, batch in enumerate(training_data):
    print(batch)

执行此代码时,我收到以下错误:

    Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/mxnet/io.py", line 510, in _init_data
    data[k] = array(v)
  File "/usr/local/lib/python3.5/dist-packages/mxnet/ndarray/utils.py", line 146, in array
    return _array(source_array, ctx=ctx, dtype=dtype)
  File "/usr/local/lib/python3.5/dist-packages/mxnet/ndarray/ndarray.py", line 2245, in array
    arr[:] = source_array
  File "/usr/local/lib/python3.5/dist-packages/mxnet/ndarray/ndarray.py", line 437, in __setitem__
    self._set_nd_basic_indexing(key, value)
  File "/usr/local/lib/python3.5/dist-packages/mxnet/ndarray/ndarray.py", line 698, in _set_nd_basic_indexing
    self._sync_copyfrom(value)
  File "/usr/local/lib/python3.5/dist-packages/mxnet/ndarray/ndarray.py", line 856, in _sync_copyfrom
    source_array = np.ascontiguousarray(source_array, dtype=self.dtype)
  File "/usr/local/lib/python3.5/dist-packages/numpy/core/numeric.py", line 581, in ascontiguousarray
    return array(a, dtype, copy=False, order='C', ndmin=1)
TypeError: float() argument must be a string or a number, not 'csr_matrix'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "mxnet_test.py", line 20, in <module>
    training_data = mx.io.NDArrayIter(data=preprocessed_data, label=labels, batch_size=50)
  File "/usr/local/lib/python3.5/dist-packages/mxnet/io.py", line 643, in __init__
    self.data = _init_data(data, allow_empty=False, default_name=data_name)
  File "/usr/local/lib/python3.5/dist-packages/mxnet/io.py", line 513, in _init_data
    "should be NDArray, numpy.ndarray or h5py.Dataset")
TypeError: Invalid type '<class 'numpy.ndarray'>' for data, should be NDArray, numpy.ndarray or h5py.Dataset

我不明白,因为我的数据在创建NDArrayIter 实例之前被转换为numpy.ndarray。有人愿意就如何读取mxnet 中的数据提供一些见解吗?

以上代码目前使用以下版本:

  • mxnet-1.1.0
  • numpy-1.14.2

【问题讨论】:

  • 嘘。 code 在一行周围打了一个毯子except,并假设try 内的所有异常都是由于输入类型错误造成的。这可能会更容易在 Python 3 上使用异常链接进行调试。
  • 尝试在_init_data中设置一个pdb断点。
  • 你是对的,使用 Python 3,异常链接非常有用(上面为 Python 3 更新了代码)。我最终不需要使用pdb 来查找错误。 TfidfTransformer 返回 scipy.sparse.csr_matrix 而不是 numpy.array,正如我所期待的 documentation。我将在下面写一个答案,说明我为使流程正常工作所做的更改。

标签: python numpy mxnet


【解决方案1】:

user2357112 的帮助下,通过在 Python 3 中使用异常链查找异常(已更新)解决了这个问题:

transformer 管道返回 numpy.arrayscipy.sparse.csr_matrix 矩阵,而不是二维 numpy.array。通过添加更改以下行以改用 toarray 方法进行转换,脚本将运行。

preprocessed_data = np.array([row.toarray() for row in transformer.fit_transform(data)])

最佳解决方案toarrayscipy.sparse.csr_matrix 上使用时在内存消耗方面效率低下。在mxnet1.10 版本中,可以使用mxnet.nd.sparse.array 更有效地存储数据:

...
preprocessed_data = mx.nd.sparse.array(transformer.fit_transform(data))

training_data = mx.io.NDArrayIter(data=preprocessed_data, label=preprocessed_labels, batch_size=5, last_batch_handle='discard')

for i, batch in enumerate(training_data):
    print(batch)

唯一需要注意的是,必须在NDArrayIter 中使用last_batch_handle='discard' 关键字参数(last_batch_handlehere 的功能)

【讨论】:

    猜你喜欢
    • 2020-03-06
    • 2022-07-29
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2011-07-10
    • 2019-08-31
    相关资源
    最近更新 更多