keras - 将 tf.keras.layers 与 keras.model 一起使用
问题描述
是的,我到处都读到 keras 和 tf.keras 不兼容。但是您可以将 tf.keras.layers 传递给 keras 模型,它确实有效。当我尝试用自己的模型做到这一点时......它不起作用!
如果您检查 Resnet50.py 的 resnet 源代码,他们会构建类似的模型
input = layers.Input(shape=input_shape)
x = layers.Dense()(x)
model = Model(input,x)
无论您传入 layers=tf.keras.layers 还是 layers=keras.layers 都可以正常工作
演示代码:
import tensorflow as tf
import keras
# THIS WORKS!
input_shape = (224,224,3)
base_model = keras.applications.ResNet50(layers=tf.keras.layers, weights='imagenet',
weights='imagenet', include_top=False, pooling=None,
input_shape=input_shape,
classes=1000)
# this fails!!
input = tf.keras.layers.Input(shape=input_shape)
x = tf.keras.layers.Dense(1000,activation='relu')(input)
model = keras.Model(input, x)
我的代码产生了这个错误:类型错误:Dense 类型的对象没有 len
如何使我的这项工作?显然有一种方法可以使它工作,因为 keras.applications 预建模型似乎确实支持它并且工作正常
我想使用 tf.keras.layers 因为它们的批标准化层工作方式不同。这可能是将其放入我们庞大的现有代码库中的最简单方法。
我确实看到这个相关的 stackoverflow 帖子具有相同的错误:“密集”类型的对象没有 len()
他们正确地提到这是由于 tf.keras 和 keras 不兼容。但我再次确认,将 tf.keras.layers 传递给 keras.applications.resnet50确实会返回具有正确层的 keras 模型。不知何故。
解决方案
你得到了错误的结论,keras.applications
是一个同时支持keras
和tf.keras
包的模块,作为keras.applications
uses models.Model
,它检测你是否使用tf.keras
orkeras
并获取相应的模块,因此代码与实际的 keras 实现无关。
keras.applications
没有混合使用keras
and tf.keras
,它只支持两者。
推荐阅读
- python - Spyder 和 Jupyter:与错误“TypeError:'list' 对象不能被解释为整数”的区别
- node.js - 如何使用 ngFor 从 Angular 中的数组对象中访问键值
- c# - 如何在 ASP.NET 中创建已在后端 HTML 表和 div 中创建的 onserverclick 事件
- python - 如何在后台调度程序运行时阻止程序崩溃?
- asp.net-core - 成功登录后如何重定向客户端应用程序(而不是使用最初请求的 url)?
- azure - 从多个租户获取 VM 详细信息
- python - 是否有任何模块用于处理利用 mongoengine 执行迁移的数据库更改?
- apache-kafka - 不使用 POJO 的 Kafka Avro 反序列化器
- javascript - 使用 jQuery 向 icheck-helper 类添加一个新类
- javascript - 如何有条件地呈现逗号和句点?