更新:将每行数据重塑为(x,1)数组

时间:2018-06-29 13:59:59

标签: python python-3.x machine-learning neural-network

最近,我正在阅读Michael Nielsen (link)的神经网络和深度学习,并想测试贷款违约数据上的神经网络。但是,经过多次尝试,我仍然无法通过脚本将csv格式的数据转换为所需的矩阵格式。

csv文件包含769个变量和1个布尔默认项。看起来像这样:

.  v1 v2 v3 ... v770; 
1. 1  2  3 ... 0; 
2. 2  1  2 ... 1; 
...

这就是我的导入方式:

import numpy as np
tr_input = [np.reshape(genfromtxt('training.csv', delimiter=','), (769,10000))]
tr_res = np.reshape(genfromtxt('training2.csv', delimiter=','),(1, 10000))
tr_test = [np.reshape(genfromtxt('testing.csv', delimiter=','), (769,2000))]
tr_test2 = np.reshape(genfromtxt('testing2.csv', delimiter=','), (1, 2000))
test_data = list(zip(tr_test, tr_test2))
training_data = list(zip(tr_input, tr_res))

但是它返回

Traceback (most recent call last):

  File "<ipython-input-8-de046f78e8ed>", line 3, in <module>
    net.SGD(training_data, 30, 300, 3.0, test_data = test_data)

  File "/Users/Neal/Documents/Sources/network.py", line 71, in SGD
    self.update_mini_batch(mini_batch, eta)

  File "/Users/Neal/Documents/Sources/network.py", line 85, in update_mini_batch
    delta_nabla_b, delta_nabla_w = self.backprop(x, y)

  File "/Users/Neal/Documents/Sources/network.py", line 105, in backprop
    z = np.dot(w, activation)+b

ValueError: shapes (30,769) and (10000,) not aligned: 769 (dim 1) != 10000 (dim 0)

已更新:

不知道为什么genfromtxt给出第一个条目NAN,但是pandas可以正常工作。

研究了原始教程数据之后,我想可能需要将每行数据重塑为(769,1)数组,但是我不知道该怎么做。

附有用于下载神经网络和我的数据的链接:

神经网络:https://github.com/MichalDanielDobrzanski/DeepLearningPython35

数据:https://drive.google.com/drive/folders/1bQEqgb1o9kKNyv8_IBPlNRci5cfSYwFL?usp=sharing (测试和训练是变量,而test2和training2是默认信息布尔值,0表示没有默认值,1表示默认值)。

2 个答案:

答案 0 :(得分:1)

您可以使用Numpy或Pandas读取此类CSV文件-我更喜欢Pandas:

import pandas as pd

X_train = pd.read_csv(r'D:\download\training.csv', header=None, dtype='float64')

结果:

In [18]: X_train.shape
Out[18]: (10000, 769)

如果要转置,则其形状为:769 x 10000

In [19]: X_train = X_train.T

In [20]: X_train.shape
Out[20]: (769, 10000)

答案 1 :(得分:0)

在您的代码中,您有一些错误:

在注释中发现的一个是 genfromtxt ,此函数已经在numpy数组对象中读取了,因此基于您的 import 语句,您实际上并不是在指模块,这是一种读取数据并进行整形的更简洁的方法。这是用于读取txt文件并重塑的numpy文档:numpy.genfromtxtnumpy.reshape

  

这是读取数据和重塑的更“可读”的方式(我讨厌迷失于这么多的括号中,而且阅读起来并不那么容易,需要对顺序进行谨慎处理) ,因此如您所见,这是将数据读取为 genfromtxt 的正确方法,您需要...

因此将“翻译”步骤:

  1. 表示 tr_input 变量:基于文件(10000,769)读取原始数据,并进行重塑,使数据看起来像< em>(769,10000)

  2. 表示 tr_res 变量:基于文件(10000,)读取原始数据,并进行重塑,使数据看起来(1,10000)

  3. 表示 tr_test 变量:根据文件(2000,769)读取原始数据,并进行重塑,使数据看起来像< em>(769,2000)

  4. 表示 tr_test2 变量:基于文件(2000,)读取原始数据,并执行重塑,使数据看起来(1,2000)

  

注意:可以看到错误已解决,其中一个正在使用软件包   模块,并且您指出的错误是数据的形状   ...您无法将(2000,)的数组重塑为(769,10000) ... ...您的 testing.csv 是格式为(2000年)

# readable format prefered by me, not a standard. 

# https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html
# https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

import numpy as np
tr_input = np.genfromtxt('/Users/sb0709/Desktop/dqn-pytorch/data_loan/training.csv', delimiter=',').reshape(769,10000)
tr_res = np.genfromtxt('/Users/sb0709/Desktop/dqn-pytorch/data_loan/training2.csv', delimiter=',').reshape(1, 10000)
tr_test = np.genfromtxt('/Users/sb0709/Desktop/dqn-pytorch/data_loan/testing.csv', delimiter=',').reshape(769,2000)
tr_test2 = np.genfromtxt('/Users/sb0709/Desktop/dqn-pytorch/data_loan/testing2.csv', delimiter=',').reshape(1, 2000)

# creating the lists 
test_data = list(zip(tr_test, tr_test2))
training_data = list(zip(tr_input, tr_res))

也在此处列出了输出:

tr_test data format and output

test_data and training_data print what is inside

注意:如果数据具有标题/变量名称,则在读取数据时传递skip_header = 1以跳过第一行,数据形状也将变为-1。