从csv馈送Torch对象以学习

时间:2019-07-10 08:27:49

标签: python csv pytorch torch

我正在尝试为PyTorch提供输入,以构建一个非常简单的神经网络。这是我的问题: 我拥有要在csv中使用的所有数据,并且正在使用Panda读取它。 这是我的代码:

data = pd.read_csv("../myFile.csv")
input = [x for x in data]
input = np.asarray(input)
input = torch.from_numpy(input)

这将返回错误:

line 42, in <module>
input = torch.from_numpy(input)
TypeError: can't convert np.ndarray of type numpy.str_. The only supported types are: float64, float32, float16, int64, int32, int16, int8, and uint8.

我了解错误的含义。主要问题是,我的csv中有几列不能转换为int或float,因为它们基本上是字符串,例如,客户ID类似于:AAABBBCCC;而且我不能将其转换为float或int。你知道我能做什么吗?

编辑:这是我的新更新的代码,其中包含Anubhav的建议答案:

data = pd.read_csv("myFile.csv", names=col_names)
data = data.drop(["Customer-ID", "name"], axis=1)

for column in list(data):
    # one hot encode of Object Columns
    one_hot = pd.get_dummies(data[column])
    # drop encoded columns
    data = data.drop(column, axis=1)
    # join the encoded data
    data = data.join(one_hot)

print(data.dtypes)

inp = [x for x in data]
inp = np.asarray(inp, dtype=np.float32)
inp = torch.from_numpy(inp)

但是我仍然收到以下错误:

line 52, in <module>
    inp = np.asarray(inp, dtype=np.float32)
  File "C:\Users\Paul\anaconda3\lib\site-packages\numpy\core\numeric.py", line 538, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not convert string to float: '01139_Lichtenau'

从print(data.dtypes)查找此值时,它会明确指出:

01139_Lichtenau  uint8

编码是否由于某种原因而失败?

2 个答案:

答案 0 :(得分:0)

这里的错误非常明显,数组中有一些无法转换为张量的字符串。您可以将所有数值变量转换为张量,但是您必须对字符串做一些事情。您可以删除所有包含字符串的列(不是最佳列),对类别进行热编码,或者我建议在将类别馈入前馈神经网络之前嵌入类别。

Fastai(建立在pytorch之上的库)有一个Tabular部分,它可以帮助您更轻松地建立网络,您可能想查看一下:https://docs.fast.ai/tabular.html(它将为您执行分类变量的嵌入和一些预处理)。

答案 1 :(得分:0)

您检查了[x for x in data]的输出吗?这只是列名称的列表,列名称是字符串类型。这就是为什么,您遇到了错误。现在,我将使用示例csv文件帮助您解决问题。

文件名:data.csv

custID name age salary label
EMP1 Mahi 23 120000 Yes
EMP2 Tom 28 200000 No
EMP3 Chris 25 123000 No
EMP4 Matt 29 2130000 Yes
EMP5 Brown 27 324675 Yes

如您所见,以上文件包含字符串和整数值。首先,我将显示您的代码输出:

data = pd.read_csv('data.csv', sep=' ')
inp = [x for x in data]   # ['custID', 'name', 'age', 'salary', 'label']
inp = np.asarray(inp)     # array(['custID', 'name', 'age', 'salary', 'label'], dtype='<U6')
inp = torch.from_numpy(inp)
  

TypeError:无法转换numpy.str_类型的np.ndarray。唯一的   支持的类型有:double,float,float16,int64,int32和uint8

您可以做的是考虑只有那些字符串列对神经网络很重要,并且您可以one-hot进行编码。就神经网络而言,诸如custIDname之类的列没有任何意义。

data = pd.read_csv('data.csv', sep=' ')

# one-hot encode of column 'label'
# Get one hot encoding of column 'label'
one_hot = pd.get_dummies(data['label'])
# Drop column 'label' as it is now encoded
data = data.drop('label',axis = 1)
# Join the encoded data
data = data.join(one_hot)

inp = [data[x] for x in data]
inp = np.asarray(inp[2:], dtype=np.float32)
inp = torch.from_numpy(inp)

输出:

tensor([[     23.,      28.,      25.,      29.,      27.],
        [ 120000.,  200000.,  123000., 2130000.,  324675.],
        [      0.,       1.,       1.,       0.,       0.],
        [      1.,       0.,       0.,       1.,       1.]])

在上面的代码中,我首先对列label进行了一次热编码,然后删除了该列并加入了编码数据。之后,我读取了csv文件的所有列(包括custIDname),然后忽略了custIDname列,并将其他列转换为float最后使用torch.from_numpy将其转换为张量。

在上面的输出中,每一行对应于one-hot编码数据中的一列。