【问题标题】:You must feed a value for placeholder tensor 'lstm_3_input' with dtype float and shape [1,1,1]您必须使用 dtype float 和 shape [1,1,1] 为占位符张量“lstm_3_input”提供一个值
【发布时间】:2019-04-29 10:59:20
【问题描述】:

所以我正在尝试使用以下代码从 3 个顺序子模型中创建一个集成模型:

def create_ensemble(models,model_input):

    # take-in all outputs fro all models
    outModels = [model(model_input) for model in models]

    # calculate average of all results
    outAvg = layers.average(outModels)

    # merge into one model

    modelMerge = Model(inputs=model_input,outputs=outAvg,name='ensemble')

    return modelMerge


model_input = Input(shape=models[0].input_shape[1:])
modelEns = create_ensemble(models,model_input)

我得到了这个模型:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 1, 1)         0                                            
__________________________________________________________________________________________________
model_1 (Sequential)            multiple             14          input_1[0][0]                    
__________________________________________________________________________________________________
model_2 (Sequential)            multiple             14          input_1[0][0]                    
__________________________________________________________________________________________________
model_3 (Sequential)            multiple             14          input_1[0][0]                    
__________________________________________________________________________________________________
average_1 (Average)             (None, 1)            0           model_1[1][0]                    
                                                                 model_2[1][0]                    
                                                                 model_3[1][0]                    
==================================================================================================

子模型如下:

Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (1, 1)                    12        
_________________________________________________________________
dense_1 (Dense)              (1, 1)                    2         
=================================================================

这是我提供数据的方式:

def fit_lstm(train, batch_size, nb_epoch, nb_neurons):
    X, y = train[:, 0:-1], train[:, -1]
    X = X.reshape(X.shape[0], 1, X.shape[1])
    model = Sequential()
    model.add(LSTM(nb_neurons, batch_input_shape=(batch_size, X.shape[1], X.shape[2]), stateful=True))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer='adam')
    for i in range(nb_epoch):
        model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
        model.reset_states()
    return model

我正在尝试为集成模型提供与子模型相同的数据,但标题中出现错误。我哪里错了?

【问题讨论】:

  • 如何提供数据?使用tf.Session()model.fit()?由于问题存在,您需要展示如何提供数据。您提供的代码似乎是正确的。
  • 我使用提供数据的功能编辑了帖子
  • 在这个例子中,你没有提供集成模型,而只是一个常规模型。 + 进入model.fit()Xy 的形状是什么。 + 您在运行刚刚添加的特定代码时遇到问题吗?
  • 我使用这个函数来提供 3 个 lstm 模型而不是 ensemble 模型。我想要的是提供集成模型 X(3 个子模型的 X 相同),然后将其提供给所有三个子模型以获得输出。当我将 X 提供给 3 个子模型时,我得到了我想要的,但是当我在集成模型上尝试 X 时,我得到了错误。 X 是形状 (28,1,1)

标签: python tensorflow keras


【解决方案1】:

它不起作用,因为您使用的是Sequestial api:

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))

为了将模型合并在一起,您需要使用Functional api:

a = Input(shape=(32,))
b = Dense(32)(a)
model = Model(inputs=a, outputs=b)

【讨论】:

  • 这实际上是可能的,如 Keras 文档中所述。只是我已经保存了 3 个经过训练的模型,而在文档中它试图在一开始就训练集成模型。我现在处于预测阶段(关于新数据)
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 2023-03-14
  • 2018-02-26
  • 1970-01-01
  • 2017-11-02
相关资源
最近更新 更多