创建一堆重复的 keras 模型并绕过部分输入

我正在构建一个 keras 模型架构,其中一个层块重复多次,具有共享权重。为此,我首先创建一个基础模型,然后重复这个基础模型。这工作正常:

from tensorflow import keras

# build base model
input = keras.layers.Input(shape=(4,))
layer1 = keras.layers.Dense(32)(input)
out=keras.layers.Dense(4)(layer1)
base_model = keras.Model(input,out)
base_model.summary()
# repeat the model
n_repeat=4
for _ in range(n_repeat):
    out = base_model(out)

model = keras.Model(input, out)
model.summary()

现在我有一个更特殊的情况,输入维度大于输出维度。输入数据由与输出对应的部分和“固定”部分组成。在模型的每次重复中,这个固定部分应该是相同的。在这个最小的例子中,这个固定部分是输入向量的最后 2 个元素。因此,将重复模型的输入创建为输出和输入的最后两个元素的串联就足够了:

# now with input shape 4 and output shape 2
# the input for the repeated model is the output of its predecessor
# and concatanated the last 2 values of the input
inshape=4
outshape=2
input = keras.layers.Input(shape=(4,))
layer1 = keras.layers.Dense(32)(input)
out=keras.layers.Dense(outshape)(layer1)
base_model = keras.Model(input,out)

n_repeat=1
for _ in range(n_repeat):
    out = keras.layers.Concatenate(axis=1)([out, input[:,outshape:]])
    out = base_model(out)

model = keras.Model(input, out)

但是,这会产生以下错误:

Traceback (most recent call last):
  File "/opt/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2862, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-190-38cf331e7c75>", line 17, in <module>
    model = keras.Model(input, out)
  File "/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 111, in __init__
    super(Model, self).__init__(*args, **kwargs)
  File "/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/network.py", line 78, in __init__
    self._init_graph_network(*args, **kwargs)
  File "/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/network.py", line 201, in _init_graph_network
    '(thus holding past layer metadata). Found: ' + str(x))
ValueError: Output tensors to a Model must be the output of a TensorFlow `Layer` (thus holding past layer metadata). Found: Tensor("model_21/dense_37/BiasAdd:0", shape=(?, 2), dtype=float32)

当替换out = keras.layers.Concatenate(axis=1)([out, input[:,outshape:]])out = keras.layers.Concatenate(axis=1)([out, out])(只包含一个导致正确输出形状的连接)时,我没有收到错误,所以我猜它不是来自 Concatenate 层,而是来自连接部分输入的特殊情况。该错误表明最终的“输出”不是 Keras 层的输出(并且它确实没有层元数据)。但是,我不知道如何解决这个问题,因为它实际上应该是一个层的输出。我正在使用 keras 版本“2.1.6-tf”

拉斐尔·默德克

你的切片input应该封装在一个keras.layers.Lambda层中。

下面的例子

import keras

inshape = 4
outshape = 2

input = keras.layers.Input(shape=(4,))
layer1 = keras.layers.Dense(32)(input)
out = keras.layers.Dense(outshape)(layer1)
base_model = keras.Model(input,out)

sliced_input = keras.layers.Lambda(lambda inp: inp[:, outshape:])(input)

n_repeat=2
for _ in range(n_repeat):
    out = keras.layers.Concatenate(axis=1)([out, sliced_input])
    out = base_model(out)

model = keras.Model(input, out)
model.summary()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档