TypeError: can’t convert np.ndarray of type numpy.object_. The only supported types are: double, float, float16, int64, int32, and uint8.
train_x = torch.from_numpy(train_x).float().unsqueeze(1) # numpy 转成 torch 类型
train.py
from getData import getAllData
from sklearn.model_selection import train_test_split
data = getAllData()
X, Y = data.XY()
print(type(X)) #
print(np.shape(X)) # (1789,)
train_x, test_x, train_y, test_y = train_test_split(np.array(X), np.array(Y), test_size=0.1) # 输入数据类型必须的numpy的
print(np.shape(train_x)) # (1610,)
train_x = torch.from_numpy(train_x).float().unsqueeze(1) # numpy 转成 torch 类型
torch_dataset = Data.TensorDataset(train_x, train_y) # 训练的数据集
train_loader = Data.DataLoader(dataset=torch_dataset, batch_size=BATCH_SIZE, shuffle=False)
X, Y = data.XY()
生成的数据集的 shape 不是我期望的那样。我的输入数据应该是个二维list, 不应该是一维的 ,所以问题出在数据的制作过程。
最后发现问题的关键点在:
getAllData.py 中的这行代码:
x = []
for i in ...: # 遍历,将 X 添加到 x
X = data["channel blue"][(data.Time >= times[i]) & (data.Time < (times[i] + 4))].values
print(type(X)) #
x.append(X)
print(np.shape(x)) # (361,) # 这说明 361个 X数据中,长度不全是 100
上面代码行中的 data
是 pandas 数据类型的,经过 [(data.Time >= times[i]) & (data.Time < (times[i] + 4))]
筛选后,得到的数据的长度不全是相同的。不同长度的数据X,append 到 x 之后,是不能生成一个每个元素的长度都是相同的 二维list 的。
因为有的长度为出现大于100的情况,而我只需要100个数据,所以将 X 的长度指定为相同长度 100:
修改getAllData.py 中的这行代码:
X = data["channel blue"][(data.Time >= times[i]) & (data.Time < (times[i] + 4))].values[:100]
print(np.shape(x)) # (361, 100) # 说明 添加到 x的 X数据的长度都是 100 的,是我们需要的数据 shape
train_x, test_x, train_y, test_y = train_test_split(np.array(X), np.array(Y), test_size=0.1)
因为输入数据(X 列表)中的每一个元素长度必须是相同的,否者生成的 train_x
中的每个数据的长度也不是相同的,这样在torch.from_numpy(train_x)
时,就会报错。
torch 中的数据长度必须是相同的 ------> X中的数据长度必须是相同的 ------> np.shape(X)==( , ) 即必须是二维的。
完