您好我遵循他们使用MNIST数据库的教程。现在,他们使用cPickle解压缩数据并获得列表元组,依此类推。我想使用我自己的数据,但我有csv格式,我不知道如何转换为MNIST格式。我使用48个单位作为训练数据,最后一个是我想要的结果
我如何拥有csv文件的示例:
1,2,3..........48,1
在我关注的教程中,他们使用了这个:
training_data, validation_data, test_data = cPickle.load(f)
如果我
print training_data
我明白了:
(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]))
print training_data [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
答案 0 :(得分:2)
为了理解数据结构,您可以(最初)忽略array()和dtype信息。基本上你似乎需要一个两部分元组(让我们称它们为LEFT和RIGHT)。 LEFT是(矩形)列表列表(即2维数组),RIGHT是列表(即1维数组)。
对于csv中的每一行,您将前n-1个条目作为新行添加到LEFT,将最后一个条目添加到RIGHT。
关于你的负载功能: 您的代码将每行创建为单独的1dim数组+值,然后将它们作为元组添加到(python)列表中。这不是你想要的。如上所述,您需要一个保存数据的2dim数组和一个保持预期结果的1dim数组。
逐行扩展numpy数组有点棘手,在大多数情况下应该避免。然后,您可以选择将数据构建为(python)列表列表,然后将其整体转换为numpy数组,或者更好的是,创建一个预先调整大小的空numpy数组,然后用数据填充它。 / p>
我在下面使用的后一个概念:
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]
中的每个条目(=这是一个值列表,即您的输入数据),{中有一个对应的条目{1}}(这是一个值,即您的预期结果值)。