串联或级联多个预训练的keras模型

串联或级联多个预训练的keras模型,keras,concatenation,Keras,Concatenation,我正在尝试构建一组串联或级联(实际上甚至不知道这是否是正确的定义)模型。 为了简单起见,我的基本模型如下所示 ----Input---- | L1-1 |

我正在尝试构建一组串联或级联(实际上甚至不知道这是否是正确的定义)模型。 为了简单起见,我的基本模型如下所示

                              ----Input----
                                    |
                                  L1-1
                                    |  
                                  L1-2
                                    |
                                  Dense
                                    |
                                 Softmax
我对其中7个模型进行了交叉验证培训,并尝试以级联方式对其进行总结,例如:

            -----------------------Input---------------------
            |       |       |       |       |       |       |       
          L1-1    L1-2    L1-3    L1-4     L1-5   L1-6    L1-7
            |       |       |       |       |       |       |
          L2-1    L2-2    L2-3    L2-4     L2-5   L2-6    L2-7
            |       |       |       |       |       |       |
            |_______|_______|_______|_______|_______|_______|
            |                  Concatenated                 |
            |___________________Dense Layer_________________|
                                    |
                                 SoftMax
每一个致密层都有
512个
神经元,因此最后连接的致密层总共有
7*512=3584个
神经元

我所做的是:

  • 培训所有模型并将它们保存在名为
    models[]
    的列表中
  • 在所有型号中弹出底部Softmax层
然后我尝试连接它们,但出现了错误:

Layer merge was called with an input that isn't a symbolic tensor. 

在形成级联之后,我要做的是冻结所有中间层,除了
连接的密集层
,然后稍微调整一下。但是我被困在了所有细节中解释的地方。

您需要使用函数式API模型来实现这一点。这种模型适用于张量

首先定义一个公共输入张量:

inputTensor = Input(inputShape)
然后使用此输入调用每个模型以获得输出张量:

outputTensors = [m(inputTensor) for m in models]
然后将这些张量传递到连接层:

output = Concatenate()(outputTensors) 
output = Dense(...)(output)    
#you might want to use an Average layer instead of these two....

output = Activation('softmax')(output)
最后,定义从开始张量到结束张量的完整模型:

fullModel = Model(inputTensor,output)

输出传感器=[m(输入传感器)适用于模型中的m]
亲爱的先生,您能澄清一下我们在这里到底在做什么吗。这意味着用输入张量调用模型以获得输出张量。谢谢。模型的行为完全像层。你“调用”一个通过张量的层。结果是输出张量。因此,假设您有一个模型
m
和一个输入张量
input
。下面调用模型:
output=m(input)
。在这一行中,您将输入张量“传递”给模型,调用的结果是输出张量。---现在,在您提到的行中,我创建了一个输出张量列表,列表中的每个模型都有一个输出张量。该行表示:对于列表中的每个型号
m
,使用
inputSensor
调用此型号
m
。这将创建一个输出张量列表。这正是我所需要的。谢谢你宝贵的时间。