我想在 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
答案 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)