一维CNN重塑训练和验证数据的问题

时间:2021-07-25 08:31:48

标签: python tensorflow keras conv-neural-network lstm

我想在 physioNet2017 ECG 数据上训练 1D CNN。训练数据中的每一行都是可变长度,即有些行长 9000 列,有些行长 18286 列。为了使它们具有相同的长度,我在每一行中填充了零,最大长度为 18286。 现在我有 20200 行,每行长 18286 列,所以数据形状是 (20200, 18286)。现在我想重塑这些数据以训练 1D CNN。我使用以下代码将数据拆分为训练和验证。

Xt, Xv, Yt, Yv = train_test_split(trainX_bal, trainY_bal, random_state=42, test_size=0.2)
print("Train shape: ", Xt.shape)
print("Valdation shape: ", Xv.shape)

我有输出: 火车形状:(16160, 18286) 验证形状:(4040, 18286)

现在我使用以下代码重塑了训练和验证数据:

samples_train = list()
samples_val = list()
samples_test = list()
length = 8
for i in range(0,Xt.shape[0],length):
 sample = Xt[i:i+length]
 samples_train.append(sample)
for i in range(0,Xv.shape[0],length):
 sample_val = Xv[i:i+length]
 samples_val.append(sample_val)

data = np.array(samples_train).astype(np.float32)
data_val = np.array(samples_val).astype(np.float32)

print("Training new shape: ", data.shape)
print("Validation new shape: ", data_val.shape)

Xt_cnn = data.reshape((len(samples_train), length, data.shape[2]))
Xv_cnn = data_val.reshape((len(samples_val), length, data_val.shape[2]))

Yt = to_categorical(Yt, num_classes=4)
Yv = to_categorical(Yv, num_classes=4)

输出是: 训练新形态:(2020, 8, 18286) 验证新形状:(505, 8, 18286)

现在我使用以下代码将此数据拟合到 CNN 模型:

mod = cnn_model(Xt_cnn)
cnn_history = mod.fit(Xt_cnn, Yt, batch_size=64, validation_data = (Xv_cnn, Yv), 
                       epochs=20)

我收到此错误。 Error

1 个答案:

答案 0 :(得分:0)

你的重塑是错误的。您正在更改样本数量,因此您的数据与您的标签不兼容。据我了解,您正试图将 (1,18286) 重塑为 (8,18286/8) 值,这是不可能的,因为 18286/8=2285,75。如果您增加填充并使形状为 18288,则有可能,因为 18288/8=2286(因为它是一个整数)。

您可以使用以下伪代码进行这种重塑:

Arr=[]
for samp in range(number_of_samples):
    new_array=Xt[samp,:].reshape(8,2286)
    Arr.append(new_array)

Arr=np.array(Arr)

Arr 的形状变为 (number_of_samples,8,2886)