Keras重新定义了输入形状

时间:2018-01-29 10:08:20

标签: python tensorflow keras

假设我想培训GRU,因为我需要stateful=true,必须事先知道批量大小。

使用功能API我会有一个输入如下:

input_1 = Input(batch_shape=(batch_size, None, features))

但是当我评估模型时,我不想分批传递我的测试数据(batch_size = 1;一个观察的预测),具有固定的时间步长。我的 目前的解决方案是加载已保存的模型并使用以下命令重建它:

input_1 = Input(shape=(None, num_input_dim))

要做到这一点,虽然我需要一个遍历模型的每一层然后的方法 之后设置权重。

    input_1 = Input(shape=(None, num_input_dim))
    x1 = input_1
    weights = []
    for l in range(0, len(layers)):
        if isinstance(layers[l], keras.layers.GRU):
            x1 = GRU(layers[l].output_shape[-1], return_sequences=True)(x1)
            weights.append(layers[l].get_weights())
        elif isinstance(layers[l], keras.layers.Dense):
            x1 = Dense(layers[l].output_shape[-1], activation='tanh')(x1)
            weights.append(layers[l].get_weights())
        else:
            continue

(这只是一个例子,我发现这个解决方案非常不优雅。)

必须有更好的方法来重新定义输入形状。有人可以帮助我 请。

1 个答案:

答案 0 :(得分:1)

由于您未使用stateful=True模型进行评估,因此您需要重新定义模型。

您可以创建一个函数来创建模型,将选项作为输入:

def createModel(stateful, weights=None):

    #input
    if (stateful==True):
        batch = batch_size
    else:
        batch = None

    #You don't need fixed timesteps, even if the model is stateful
    input_1 = Input(batch_shape=(batch_size, None, num_input_dim))

    #layer creation as you did with your first model
    ...
    out = LSTM(...., stateful=stateful)(someInput)
    ...

    model = Model(input_1,out)

    if weights is not None:
        model.set_weights(weights)

    return model

工作顺序:

#create the training model 

trainModel = createModel(True,None)

 #train
 ...

#create the other model
newModel = createModel(False,trainModel.get_weights())