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



所以我使用纯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维度,该维度将为"无"。如果您想使用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()

最新更新