当我在 Tensorflow 上使用 Keras API 连接两个模型时,模型的输入张量必须来自 `tf.layers.Input`

Posted

技术标签:

【中文标题】当我在 Tensorflow 上使用 Keras API 连接两个模型时,模型的输入张量必须来自 `tf.layers.Input`【英文标题】:Input tensors to a Model must come from `tf.layers.Input` when I concatenate two models with Keras API on Tensorflow 【发布时间】:2019-01-18 14:49:02 【问题描述】:

我正在使用 Keras 函数式 API 在 tensorflow 上创建一个广泛而深入的模型。

当我尝试合并两个模型时,出现以下错误。

----------------------------------- ---------------------------- ValueError Traceback(最近一次调用 最后)在() 1 merge_out = tf.keras.layers.concatenate([wide_model.output, deep_model.output]) 2 merge_out = tf.keras.layers.Dense(1)(merged_out) ----> 3 combine_model = tf.keras.Model(inputs=wide_model.input + [deep_model.input], outputs=merged_out) 4 打印(combined_model.summary())

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py 在 init(self, *args, **kwargs) 111 112 def 初始化(自我,*args,**kwargs): --> 113 super(Model, self).init(*args, **kwargs) 114 # 为迭代器 get_next 操作创建缓存。 115 self._iterator_get_next = weakref.WeakKeyDictionary()

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py 在 init(self, *args, **kwargs) kwargs 中的 77 个“输入”和 kwargs 中的“输出”): 78 # 图网络 ---> 79 self._init_graph_network(*args, **kwargs) 80 其他: 81 # 子类网络

/usr/local/lib/python3.6/dist-packages/tensorflow/python/training/checkpointable/base.py 在 _method_wrapper(self, *args, **kwargs) 362 self._setattr_tracking = False #pylint:禁用=保护访问 363尝试: --> 364 方法(自我,*args,**kwargs) 365终于: 366 self._setattr_tracking = previous_value # pylint: disable=protected-access

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/network.py 在_init_graph_network(自我,输入,输出,名称) 193 '必须来自tf.layers.Input。 ' 194 '收到:' + str(x) + --> 195 '(缺少前一层元数据)。') 196 # 检查 x 是否是输入张量。 197 # pylint:禁用=保护访问

ValueError:模型的输入张量必须来自tf.layers.Input。 收到:Tensor("add_1:0", shape=(1, ?, 163), dtype=float32) (缺失 上一层元数据)。

这是连接两者的代码。

merged_out = tf.keras.layers.concatenate([wide_model.output, deep_model.output])
merged_out = tf.keras.layers.Dense(1)(merged_out)
combined_model = tf.keras.Model(inputs=wide_model.input + [deep_model.input], outputs=merged_out)
print(combined_model.summary())

对于每个模型的输入,我尝试使用tf.layers.Inputwith

inputs = tf.placeholder(tf.float32, shape=(None,X_resampled.shape[1]))
deep_inputs = tf.keras.Input(tensor=(inputs))

让他们tf.layers.Input 就像this page 提到的那样。 但我仍然面临同样的问题。

我正在使用 tensorflow==1.10.0

有人可以帮我解决这个问题吗?

谢谢!

【问题讨论】:

【参考方案1】:

inputs=wide_model.input + [deep_model.input] 中,wide.model.input 可能不是列表,因此您传递的是新的Add 张量而不是输入列表。尝试传递inputs=[wide_model.input] + [deep_model.input]

【讨论】:

以上是关于当我在 Tensorflow 上使用 Keras API 连接两个模型时,模型的输入张量必须来自 `tf.layers.Input`的主要内容,如果未能解决你的问题,请参考以下文章

如何确保 Keras 使用 GPU 和 tensorflow 后端?

Keras 中的 tensorflow 会话在哪里

如何在 Windows 上降级 keras 和 tensorflow 版本?

keras 后端 theano/tensorflow

将 Keras 和 Tensorflow 与 AMD GPU 结合使用

Keras tensorflow 后端未检测到 GPU