【问题标题】:Problem in reshaping train and validation data for 1D CNN为一维 CNN 重塑训练和验证数据的问题
【发布时间】:2021-07-25 08:31:48
【问题描述】:

我想在 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

【问题讨论】:

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


    【解决方案1】:

    你的重塑是错误的。您正在更改样本数量,因此您的数据与您的标签不兼容。据我了解,您正试图将 (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)

    【讨论】:

    • 感谢您的回答。您的解决方案有效,但我很困惑。你为什么要改变 18288 的形状,因为这些是实际的列,所以重塑它不会影响精度测量?
    • 我们需要排列列而不是行,因为每一行代表一个对应于 y-label 的样本。如果我们安排行,它会扭曲样本标签的对应关系。
    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2020-12-11
    • 1970-01-01
    • 2018-04-15
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多