【问题标题】:A 'Concatenate' layer should be called on a list of at least 2 inputs应在至少 2 个输入的列表上调用“连接”层
【发布时间】:2020-01-21 13:57:08
【问题描述】:

我正在尝试在 Keras 中实现一个 conv-net,我计划将层分成不同参数激活函数的单元,然后使用连接层重新组合这些单元。但是,在测试层的分离/重组期间,我在网络的第一层遇到了上述错误。

使用的代码:

#Import statements.
import random
import numpy as np
from tensorflow import keras
import tensorflow as tf
from tensorflow.keras import layers as L
from collections import deque

#Op function.
def op(x, units, kernel, stride, activation):
    x_list = []
    for i in range(units):
        x_list += L.Conv2D(1, kernel, stride, activation=activation)(x)
    x = L.Concatenate(-1)(x_list)
    return x

#build_model method
    def build_model(self):
        inputx = L.Input(shape=self.state_size)
        goalx = L.Input(shape=self.state_size)
        x = L.Concatenate(1)([goalx, inputx])
        x = op(x, 4, (5,5), (1,1), activation=swish)
        x = op(x, 4, (5,5), (1,1), activation=swish)
        x = op(x, 16, (5,5), (2,2), activation=swish)
        x = op(x, 16, (5,5), (2,2), activation=swish)
        x = op(x, 16, (5,5), (1,1), activation=swish)
        x = op(x, 16, (5,5), (1,1), activation=swish)
        x = op(x, 16, (5,5), (1,1), activation=swish)
        x = op(x, 16, (5,5), (1,1), activation=swish)
        x = op(x, 16, (5,5), (1,1), activation=swish)
        x = op(x, 16, (5,5), (1,1), activation=swish)
        x = L.Flatten()(x)
        outp = L.Dense(self.action_size, activation='softmax')(x)
        valp = L.Dense(1)(x)
        model = keras.models.Model([inputx, goalx], outp)
        critic = keras.models.Model([inputx, goalx], valp)
        model.compile(loss='msle', optimizer='adam')
        critic.compile(loss='msle', optimizer='adam')
        return model, critic

追溯:

Traceback (most recent call last):
  File "thoughtform.py", line 76, in <module>
    main_loop()
  File "thoughtform.py", line 50, in main_loop
    dqn = DQN(frame.shape, 5000)
  File "/home/ai/Projects/Thoughtforms/dqn.py", line 27, in __init__
    self.model, self.critic = self.build_model()
  File "/home/ai/Projects/Thoughtforms/dqn.py", line 33, in build_model
    x = op(x, 4, (5,5), (1,1), activation=swish)
  File "/home/ai/Projects/Thoughtforms/dqn.py", line 16, in op
    x = L.Concatenate(-1)(x)
  File "/home/ai/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py", line 817, in __call__
    self._maybe_build(inputs)
  File "/home/ai/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py", line 2141, in _maybe_build
    self.build(input_shapes)
  File "/home/ai/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/utils/tf_utils.py", line 306, in wrapper
    output_shape = fn(instance, input_shape)
  File "/home/ai/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/keras/layers/merge.py", line 378, in build
    raise ValueError('A `Concatenate` layer should be called '
ValueError: A `Concatenate` layer should be called on a list of at least 2 inputs

【问题讨论】:

  • 你的意思是L.Concatenate(-1)(x_list)
  • @Jakub,啊,是的。不过,仍然会收到完全相同的错误消息。
  • 您使用了多少个units?如果它是 1,你会得到那个错误。
  • @Jakub,前两个“层”各有 4 个,接下来的 6 个“层”有 16 个...
  • 你能包括你如何称呼op吗?

标签: python python-3.x tensorflow keras


【解决方案1】:

像这样重写你的函数:

def op(x, units, kernel, stride, activation):
    x_list = []
    for i in range(units):
        x_list.append(L.Conv2D(1, kernel, stride, activation=activation)(x))
    x = L.Concatenate(-1)(x_list)
    return x

列表上的+= 运算符并没有像你想象的那样做,最后它是一种连接所有张量而不是将它们添加到列表中的方式。使用append 达到预期效果。

【讨论】:

  • 这是有道理的。另一个解决方案可能是x_list += [L.Conv2D(1, kernel, stride, activation=activation)(x)]
【解决方案2】:

我认为您的错误与“L”的范围有关。 您在 for 循环中声明它。因此,当循环结束时,L 被擦除。 也许添加类似的东西

L=""

在 for 循环之前应该可以解决您的问题吗?

【讨论】:

  • L 是 keras.layers 的快捷方式...对不起,我应该把 import 语句放在...
猜你喜欢
  • 2020-04-25
  • 2021-10-10
  • 2020-05-14
  • 1970-01-01
  • 2018-03-20
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多