没看懂,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')
])
我的数据是关于基因组序列的,基本上是一长串“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')
])