2

嗨,我正在关注他们使用 MNIST 数据库的教程。现在他们使用 cPickle 解压缩数据并获取列表元组等。我想使用自己的数据,但我有 csv 格式的数据,我不确定如何转换为 MNIST 格式。我使用 48 个单位作为训练数据,最后一个是我想要的结果

我如何拥有 csv 文件的示例:

1,2,3..........48,1

在我遵循的教程中,他们使用了这个:

training_data, validation_data, test_data = cPickle.load(f)

如果我

打印训练数据

我明白了:

(array([[ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       ..., 
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.],
       [ 0.,  0.,  0., ...,  0.,  0.,  0.]], dtype=float32), array([5, 0, 4, ..., 8, 4, 8]))

打印训练数据[0]

[[ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 ..., 
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]
 [ 0.  0.  0. ...,  0.  0.  0.]]

print training_data[0][0] 是每个集合的值的 numpy.array(),training_data[1][0] 是和 float32 以及每个集合的期望输出。

我正在做的代码是这样的,但是我对提示符上显示的 array() 和 dtype=float32 感到困惑

def load(filename):
    finalDataset = []
    res = 0
    with open(filename, 'rb') as csvfile:
        lines = csv.reader(csvfile)
        datos = list(lines)
        for i in datos:
            tempA = np.array(i[:len(datos)-2]).astype(np.float64)
            tempB = np.float64(i[len(datos)-1:])
            finalDataset.append((tempA,tempB))
    return finalDataset
4

1 回答 1

2

为了理解数据结构,您可以(最初)忽略 array() 和 dtype 信息。基本上你似乎需要一个两部分的元组(我们称它们为 LEFT 和 RIGHT)。LEFT 是列表的(矩形)列表(即二维数组),RIGHT 是列表(即一维数组)。

对于 csv 中的每一行,您将前 n-1 个条目作为新行添加到 LEFT,最后一个条目添加到 RIGHT。

关于您的加载功能:您的代码将每一行创建为单独的 1dim 数组 + 值,然后将它们作为元组添加到(python)列表中。这不是你想要的。如上所述,您需要一个保存数据的 2dim 数组和一个保存预期结果的 1dim 数组。

逐行扩展一个 numpy 数组有点棘手,在大多数情况下应该避免。然后,您可以选择将数据构建为列表的(python)列表,然后将其整体转换为 numpy 数组,或者更好的是,创建一个预先确定大小的空 numpy 数组,然后用您的数据填充它。

我在下面使用的后来的概念:

def load(filename):
    # read file into a list of rows
    with open(filename, 'r') as csvfile:
        lines = csv.reader(csvfile, delimiter=';')
        rows = list(lines)

    # create empty numpy arrays of the required size
    data = np.empty((len(rows), len(rows[0])-1), dtype=np.float64)
    expected = np.empty((len(rows),), dtype=np.int64)

    # fill array with data from the csv-rows
    for i, row in enumerate(rows):
        data[i,:] = row[:-1]
        expected[i] = row[-1]

    training_data = data, expected
    return training_data

编辑:请注意普通 python 列表和特别是 numpy 数组的非常简洁的索引功能。负索引从列表的末尾开始计数,-1 是最后一个条目,-2 是倒数第二个,依此类推。 a:b索引切片,即索引为 a、a+1、... b-1 的条目。如果a在该表示法中留空,则表示“从第一个”,如果b省略,则表示“到最后”条目。因此:意味着“一切”。虽然普通的 python 列表在一维中支持这种语法,但 numpy 数组通过用冒号分隔每个维度的索引来将其扩展到多维。

EDIT2:空 numpy 数组的大小略有偏差。

EDIT3:回应您的评论:

type(training_data) = <type 'tuple'>表示这training_data是一个元组(有两个元素)。

type(training_data[0]) = <type 'numpy.ndarray'>表示这training_data[0]是一个 numpy 数组(为了简化理解,认为这相当于一个列表)。

type(training_data[1]) = <type 'numpy.ndarray'>意味着这training_data[1]也是一个 numpy 数组/列表。

type(training_data[0][0]) = <type 'numpy.ndarray'>表明 的每个元素training_data[0]本身就是一个数组/列表。

type(training_data[1][0]) = <type 'numpy.int64'>表明 的每个元素training_data[1]都是一个值。

使用len(training_data[0])并且len(training_data[1])您可以看到对于training_data[0](=这是一个值列表,即您的输入数据)中的每个条目,在training_data[1](这是一个单个值,即您的预期结果值)中都有一个相应的条目。

于 2016-05-30T06:54:21.970 回答