keras 到 tf.keras 转换:未定义密集层尺寸?

keras to tf.keras Conversion: Dense layer dimensions not defined?

所以我使用纯 keras 构建了一个卷积网络。它完全按预期编译和运行,但我需要将其转换为使用 tf.keras,以便我可以使用 tfmot。阅读文档后,我尝试转换它,结果出现以下错误:

The last dimension of the inputs to Dense should be defined. Found None.

知道我做错了什么吗?

谢谢!

keras型号:

input_layer = keras.layers.Input(shape=(100,))
reshape_layer = keras.layers.Reshape((-1, 100, 1))(input_layer)
conv_layer_1 = keras.layers.Convolution2D(filters=30, kernel_size=(10, 1), strides=(1, 1), padding="same", activation="relu")(reshape_layer)
conv_layer_2 = keras.layers.Convolution2D(filters=30, kernel_size=(8, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_1)
conv_layer_3 = keras.layers.Convolution2D(filters=40, kernel_size=(6, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_2)
conv_layer_4 = keras.layers.Convolution2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_3)
conv_layer_5 = keras.layers.Convolution2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_4)
flatten_layer = keras.layers.Flatten()(conv_layer_5)
label_layer = keras.layers.Dense(200, activation="relu")(flatten_layer)
output_layer = keras.layers.Dense(1, activation="linear")(label_layer)

model = keras.Model(inputs=input_layer, outputs=output_layer)

已转换 tf.keras 型号:

input_layer = tf.keras.layers.InputLayer(input_shape=(100,))
reshape_layer = tf.keras.layers.Reshape((-1, 100, 1))(input_layer)
conv_layer_1 = tf.keras.layers.Convolution2D(filters=30, kernel_size=(10, 1), strides=(1, 1), padding="same", activation="relu")(reshape_layer)
conv_layer_2 = tf.keras.layers.Convolution2D(filters=30, kernel_size=(8, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_1)
conv_layer_3 = tf.keras.layers.Convolution2D(filters=40, kernel_size=(6, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_2)
conv_layer_4 = tf.keras.layers.Convolution2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_3)
conv_layer_5 = tf.keras.layers.Convolution2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_4)
flatten_layer = tf.keras.layers.Flatten()(conv_layer_5)
label_layer = tf.keras.layers.Dense(200, activation="relu")(flatten_layer)
output_layer = tf.keras.layers.Dense(1, activation="linear")(label_layer)

model = tf.keras.Model(inputs=input_layer, outputs=output_layer)

编辑 1:

我想也许我可以通过在创建后保存 keras 模型并在编译/训练之前立即将其加载为 tf.keras 模型来解决这个问题。抛出同样的错误!

您的代码几乎没有问题。修复它们,你应该可以开始了,

问题 1:使用 Input 而不是 InputLayer

标准是使用Input层而不是InputLayer(实际上内部使用InputLayer)。如果您使用 Input 层,您还需要将 input_shape 更改为 shape

input_layer = tf.keras.layers.Input(shape=(100,))

问题 2:输出中有 2 None 个维度

当您执行以下行时,您会在输出中得到两个 None 维度。

reshape_layer = tf.keras.layers.Reshape((-1, 100, 1))(input_layer)

这就是您收到上述错误的原因。在定义 Reshape 层时,您没有定义 batch 维度,它将是 None。如果您想使用 Dense 层,那是您可以作为 None 的唯一维度。否则,Dense 层无法推断其权重的形状(这就是您得到错误的原因)。所以把它改成,

reshape_layer = tf.keras.layers.Reshape((1, 100, 1))(input_layer)

其余保持不变。

conv_layer_1 = tf.keras.layers.Convolution2D(filters=30, kernel_size=(10, 1), strides=(1, 1), padding="same", activation="relu")(reshape_layer)
conv_layer_2 = tf.keras.layers.Convolution2D(filters=30, kernel_size=(8, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_1)
conv_layer_3 = tf.keras.layers.Convolution2D(filters=40, kernel_size=(6, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_2)
conv_layer_4 = tf.keras.layers.Convolution2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_3)
conv_layer_5 = tf.keras.layers.Convolution2D(filters=50, kernel_size=(5, 1), strides=(1, 1), padding="same", activation="relu")(conv_layer_4)
flatten_layer = tf.keras.layers.Flatten()(conv_layer_5)
label_layer = tf.keras.layers.Dense(200, activation="relu")(flatten_layer)
output_layer = tf.keras.layers.Dense(1, activation="linear")(label_layer)

model = tf.keras.Model(inputs=input_layer, outputs=output_layer)
model.summary()