没看懂,expected shape=(None, None, 1100), found shape=(1, 29907, 1), 对LSTM输入shape的困惑? (数据为基因组序列)

Didn't understand ,expected shape=(None, None, 1100), found shape=(1, 29907, 1), Confusion about LSTM input shape? (the data is genome sequence)

我的数据是关于基因组序列的,基本上是一长串“AAATTGCCAA...AA”。 Total data is 1100表示​​总共有1100行,每行的长度是29907Here is a pic of my dataFrame。一共有5个目标值。

我将数据转换为浮点值的 NumPy 数组。 我的数据的形状是 train_data.shape: (1100,29907)。在这里,我的数据在我将其转换为 NumPy 数组后的样子如下:

array([[1.  , 0.25, 0.25, ..., 0.  , 0.  , 0.  ],
       [0.75, 0.5 , 0.5 , ..., 0.  , 0.  , 0.  ],
       [1.  , 0.75, 1.  , ..., 0.  , 0.  , 0.  ],
       ...,
       [0.5 , 0.25, 0.75, ..., 0.  , 0.  , 0.  ],
       [0.5 , 0.25, 0.75, ..., 0.  , 0.  , 0.  ],
       [1.  , 0.75, 1.  , ..., 0.  , 0.  , 0.  ]], dtype=float32)

我们知道 LSTM 输入需要 3D 或 2D 形状 (batch_size, time_steps, seq_len)

所以我重塑了数据

train_data=train_data.reshape(1100,29907,1)

现在,当我将数据传递到我的模型时,我的输入形状是 input_shape=(29907,1100)

实际型号如下。但是当我 运行 模型时,它给了我一个值错误,即
ValueError: Input 0 is incompatible with layer sequential: expected shape=(None, None, 1100), found shape=(1, 29907, 1).

我没有收到错误,是我输入的形状错误还是重塑错误?另外我在第二层使用了 conv1D,形状是否也必须与两个(LSTM 和 conv1D)层兼容?在 LSTM 层中,我定义将有 5 个输出 (units-5) 因为有 5 个目标值。

def create_model():
    
    num_classes = 5
    model = Sequential([
    LSTM(units=16, input_shape=(train_data.shape[1],train_data.shape[2]), 
    activation='relu', return_sequences=True,  
    kernel_regularizer=regularizers.l2(0.0001)),
    Dropout(rate=0.5),
    Conv1D(filters=100, kernel_size=21, strides=1,
    padding="same",activation='relu'),
    Dropout(rate=0.3),
    MaxPooling1D(pool_size=148, strides=1, padding='valid'),
    Dropout(rate=0.1),
    # LSTM(16,activation='relu'),
    Flatten(),
    Dense(5, activation='softmax')
    ])

    # compile the model
    model.compile(loss="sparse_categorical_crossentropy", optimizer=Adam(learning_rate= 0.0001),
              metrics=['accuracy'])

    return model

序列上的一维卷积需要 3D 输入,而您使用的 LSTM 输出二维数组(batch_size, units),因为参数 return_sequences 设置为 False。此参数指示是否 return 每个时间步的输出而不是最后一个时间步的输出。将其更改为 True return 一个 3D 数组 (batch_size, time_steps, units) 而不是 2D 数组。

LSTM(units=5, input_shape=(29907,1100), activation='relu', return_sequences=True, kernel_regularizer=regularizers.l2(0.0001))

这也是一件小事,但不要对输入形状进行硬编码,而是将其设置为 input_shape=(X_train.shape[1],X_train.shape[2]).

之类的东西

编辑:

因此除此之外,您还需要在将最后一个通道传递给模型之前扩展其尺寸,并使用此方法对其进行整形。

# train_data shape: (1100,29907)
train_data = np.expand_dims(train_data, -1) # new shape = (1100,29907,1)

不要像这样重塑它,你很容易在任何通道中的值数量上出错:

train_data=train_data.reshape(1100,29907,1)

然后只需将 LSTM 的输入形状更改为输入数据的第 2 和第 3 通道即可。

num_classes = 5
model = Sequential([
    LSTM(units=num_classes, input_shape=(train_data.shape[1],train_data.shape[2]), 
    activation='relu', return_sequences=True, 
    kernel_regularizer=regularizers.l2(0.0001)),
    Conv1D(filters=100, kernel_size=21, strides=1,
    padding="same", activation='relu',
    Dropout(rate=0.5),
    MaxPooling1D(pool_size=203, strides=1, padding='valid'),
    Flatten(),
    Dense(num_classes, activation='softmax')
])