如何调整Keras函数式API模型输出形状?Reshape层无效求助
如何重塑Keras模型的输出?
你当前的问题是模型输出形状为(n,1),希望直接得到(n,)的形状以匹配y_test,无需事后手动reshape。你尝试的Reshape层未生效,是因为参数设置有误:Reshape(target_shape=(1,))只是将输出维持为一维(每个样本对应一个长度为1的向量),并没有去掉这个额外维度。
解决方案1:使用Reshape(target_shape=())
将Reshape的目标形状设为空元组,即可完全挤压掉最后一个维度:
import numpy as np from tensorflow.keras.layers import Input, Conv1D, MaxPooling1D, Flatten, Dense, Reshape from tensorflow.keras.models import Model # 修正输入维度:给X添加最后一维以匹配Input(shape=(3,1)) X=np.random.rand(100,3) X = np.expand_dims(X, axis=-1) y=np.random.rand(100) X_train, X_test = np.vsplit(X,[80]) y_train, y_test = np.split(y,[80]) # 定义模型 inputs=Input(shape=(3,1)) h=Conv1D(filters=64,kernel_size=2, activation='relu')(inputs) h=MaxPooling1D(pool_size=2)(h) h=Flatten()(h) h=Dense(50, activation='relu')(h) h=Dense(1)(h) outputs=Reshape(target_shape=())(h) # 空元组实现维度挤压 model=Model(inputs=inputs, outputs=outputs) model.compile(optimizer='adam', loss='mse') model.fit(X_train, y_train,verbose=0) print(model.predict(X_test).shape) # 输出(20,)
解决方案2:使用Lambda层挤压维度
通过Lambda层调用tf.squeeze去掉最后一个维度,效果和上述方法一致:
import numpy as np import tensorflow as tf from tensorflow.keras.layers import Input, Conv1D, MaxPooling1D, Flatten, Dense, Lambda from tensorflow.keras.models import Model X=np.random.rand(100,3) X = np.expand_dims(X, axis=-1) y=np.random.rand(100) X_train, X_test = np.vsplit(X,[80]) y_train, y_test = np.split(y,[80]) inputs=Input(shape=(3,1)) h=Conv1D(filters=64,kernel_size=2, activation='relu')(inputs) h=MaxPooling1D(pool_size=2)(h) h=Flatten()(h) h=Dense(50, activation='relu')(h) h=Dense(1)(h) outputs=Lambda(lambda x: tf.squeeze(x, axis=-1))(h) # 挤压最后一维 model=Model(inputs=inputs, outputs=outputs) model.compile(optimizer='adam', loss='mse') model.fit(X_train, y_train,verbose=0) print(model.predict(X_test).shape) # 输出(20,)
额外注意
你的原始代码存在输入维度不匹配的问题:Input(shape=(3,1))要求输入数据形状为(样本数, 3, 1),但初始生成的X是(100,3),必须通过np.expand_dims(X, axis=-1)添加最后一维,否则训练时会报错。
内容的提问来源于stack exchange,提问作者vevefu
相关产品推荐
相关产品推荐

