我正在尝试使用预先训练的模型,添加一些新的图层和操作并执行训练课程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.*操作?
正如评论中提到的,您需要将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)
| 归档时间: |
|
| 查看次数: |
1435 次 |
| 最近记录: |