在tf.keras模型中使用tensorflow操作

zim*_*rol 5 keras tensorflow

我正在尝试使用预先训练的模型,添加一些新的图层和操作并执行训练课程tensorflow.因此,我对tf.keras.applications.*命名空间进行了详细说明,并开始在那里使用一些已实现的模型.

加载基本模型后,我将添加这些新图层,如下所示:

x = base_model.output
# this line seems to cause my error
x = tf.reshape(x, [-1, 1]) 
# using this line solves the issue
# tf.keras.layers.Flatten()(x) #
x = tf.keras.layers.Dense(1024, activation="relu")(x)
x = tf.keras.layers.Dense(5, activation="softmax")(x)
Run Code Online (Sandbox Code Playgroud)

当我现在tf.keras.models.Model(...)从Tensor 创建一个新的时x,我收到此错误消息:

Output tensors to a Model must be the output of a TensorFlow `Layer`
(thus holding past layer metadata).
Found: Tensor("dense_27/Softmax:0", shape=(?, 3), dtype=float32)
Run Code Online (Sandbox Code Playgroud)

我猜这个异常是因为tf.*tf.keras模型中使用了一个操作引起的.在这种情况下,我可以轻松地使用keras alterantive,但现在我开始想知道是否存在一种解决方法,无论如何在keras模型中使用张量操作.还是我完全限制使用tf.keras.layer.*操作?

Yu-*_*ang 6

正如评论中提到的,您需要将TF操作包装在一个Lambda层(或任何自定义层)中,以便Keras可以找到构建Model对象所需的元数据.

x = base_model.output
x = tf.keras.layers.Lambda(lambda x: tf.reshape(x, [-1, 1]))(x)
x = tf.keras.layers.Dense(1024, activation="relu")(x)
x = tf.keras.layers.Dense(5, activation="softmax")(x)
Run Code Online (Sandbox Code Playgroud)

值得注意的是,在尝试保存并加载此模型时,会出现错误,抱怨tf未定义名称.

model = tf.keras.Model(base_model.input, x)
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
model.save('1.h5')
m = tf.keras.models.load_model('1.h5')

# NameError: name 'tf' is not defined
Run Code Online (Sandbox Code Playgroud)

这是因为在模型加载期间,tf不会在Lambda重构图层的范围内导入.它可以通过提供custom_objects字典来解决load_model.

m = tf.keras.models.load_model('1.h5', custom_objects={'tf': tf})
Run Code Online (Sandbox Code Playgroud)