ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2 [keras]
ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2 [keras]
我收到错误:ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2
,代码如下:
def make_model():
model = Sequential()
model.add(Conv2D(20,(5,5), input_shape = (24,48,30), activation = "relu", strides = 1, padding = "valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(50, (5,5), use_bias = 50))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(20, activation = "relu"))
model.add(LSTM(50, activation="relu", return_sequences=True))
return model
我的输入是 30 个大小为 24*48 的矩阵。
问题在于,在最后一个Dense层之后(lstm层之前),输出形状为(?,20)并且lstm层需要3D张量,而不是2D.So,你可以扩展维度以便在馈送到 lstm 层之前再添加一个维度。
您可以使用 tf.expand_dims 扩展维度(假设您使用 tensorflow 作为后端)tf expand
input_layer = Input((30,24,48))
model = Conv2D(20,(5,5), input_shape = (30,24,48), activation = "relu", strides = 1, padding = "valid")(input_layer)
model = MaxPooling2D(pool_size=(2,2))(model)
model = Conv2D(50, (5,5), use_bias = 50)(model)
model = MaxPooling2D(pool_size=(2,2))(model)
model = Flatten()(model)
model = Dense(20, activation = "relu")(model)
model = tf.expand_dims(model, axis=-1)
model = LSTM(50, activation="relu", return_sequences=True)(model)
(我没有使用 Sequential 模式,我使用 functional api 因为它更灵活)
如果您想使用顺序模型:
model = Sequential()
model.add(Conv2D(20,(5,5), input_shape = (30, 24, 48), activation = "relu", strides = 1, padding = "valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(50, (5,5), use_bias = 50))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(20, activation = "relu"))
model.add(Lambda(lambda x: tf.expand_dims(model.output, axis=-1)))
model.add(LSTM(50, activation="relu", return_sequences=True))
你必须在里面使用 expand dims Lambda
我收到错误:ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2
,代码如下:
def make_model():
model = Sequential()
model.add(Conv2D(20,(5,5), input_shape = (24,48,30), activation = "relu", strides = 1, padding = "valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(50, (5,5), use_bias = 50))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(20, activation = "relu"))
model.add(LSTM(50, activation="relu", return_sequences=True))
return model
我的输入是 30 个大小为 24*48 的矩阵。
问题在于,在最后一个Dense层之后(lstm层之前),输出形状为(?,20)并且lstm层需要3D张量,而不是2D.So,你可以扩展维度以便在馈送到 lstm 层之前再添加一个维度。
您可以使用 tf.expand_dims 扩展维度(假设您使用 tensorflow 作为后端)tf expand
input_layer = Input((30,24,48))
model = Conv2D(20,(5,5), input_shape = (30,24,48), activation = "relu", strides = 1, padding = "valid")(input_layer)
model = MaxPooling2D(pool_size=(2,2))(model)
model = Conv2D(50, (5,5), use_bias = 50)(model)
model = MaxPooling2D(pool_size=(2,2))(model)
model = Flatten()(model)
model = Dense(20, activation = "relu")(model)
model = tf.expand_dims(model, axis=-1)
model = LSTM(50, activation="relu", return_sequences=True)(model)
(我没有使用 Sequential 模式,我使用 functional api 因为它更灵活)
如果您想使用顺序模型:
model = Sequential()
model.add(Conv2D(20,(5,5), input_shape = (30, 24, 48), activation = "relu", strides = 1, padding = "valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(50, (5,5), use_bias = 50))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(20, activation = "relu"))
model.add(Lambda(lambda x: tf.expand_dims(model.output, axis=-1)))
model.add(LSTM(50, activation="relu", return_sequences=True))
你必须在里面使用 expand dims Lambda