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()
所以我使用纯 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()