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

Tensorflow keras到tf.keras转换:未定义致密层尺寸?,tensorflow,keras,deep-learning,conv-neural-network,tf.keras,Tensorflow,Keras,Deep Learning,Conv Neural Network,Tf.keras,因此,我使用纯keras构建了一个convnet。它完全按照预期进行编译和操作,但我需要将其转换为使用tf.keras,以便我可以使用tfmot。阅读了文档后,我试图转换它,但出现以下错误: 应定义密集输入的最后一个维度。未找到任何文件。 知道我做错了什么吗 谢谢 原装keras型号: input_layer = keras.layers.Input(shape=(100,)) reshape_layer = keras.layers.Reshape((-1, 100, 1))(input_la

因此,我使用纯
keras
构建了一个convnet。它完全按照预期进行编译和操作,但我需要将其转换为使用
tf.keras
,以便我可以使用
tfmot
。阅读了文档后,我试图转换它,但出现以下错误:

应定义密集输入的最后一个维度。未找到任何文件。

知道我做错了什么吗

谢谢

原装
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)
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)
转换后的
tf.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)
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\u 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)
这就是为什么会出现上述错误。定义
重塑
层时,不定义
批次
维度,该维度将为无。如果要使用
密集
层,这是唯一可以作为
None
的维度。否则,
稠密
层无法推断其权重的形状(这就是为什么会出现错误)。那么换成,

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()