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

Problem in reshaping train and validation data for 1D CNN

我想在 physioNet2017 ECG 数据上训练 1D CNN。训练数据中的每一行都是可变长度的,即有些行有 9000 列长,有些有 18286 列长。为了使它们具有相同的长度,我在每一行中填充了零,最大长度为 18286。 现在我有 20200 行,每行长 18286 列,所以数据形状是 (20200, 18286)。现在我想重塑这些数据以训练一维 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,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)