Tensorflow煤油模型.摘要()显示了一个层上的0个可训练参数

2024-10-04 03:25:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在训练一个LSTM变体,PhasedLSTM,用于回归。我在用tensorflow.contrib.rnn.PhasedLSTMCell,除了功能外,还需要时间戳向量。以下是我的模型定义:

    from tensorflow.keras.layers import Dense, RNN, Input
    from tensorflow.keras.models import Model
    from tensorflow.keras.optimizers import Adam

    from tensorflow.contrib.rnn import PhasedLSTMCell

    hidden_size = 128
    num_features = 217
    num_timesteps = 2016

    input_layer_timestamps = Input(shape=(num_timesteps, 1), name='time_input')
    input_layer_features = Input(shape=(num_timesteps, num_features) name='data_input')

    timed_inputs = (input_layer_timestamps, input_layer_features)

    P_cell = PhasedLSTMCell(hidden_size)
    PLSTM_layer = RNN(P_cell, return_sequences=False, name='Phased_LSTM_1')(timed_inputs)

    output_layer = Dense(2, activation=None)(PLSTM_layer_1)

    model = Model(inputs  = [input_layer_timestamps, input_layer_features],
                  outputs = [output_layer])

    lstm_optimizer = Adam(lr=Adam_lr, clipnorm=5.)

    model.compile(optimizer=lstm_optimizer,
                  loss='mse')

    model.summary()

这个模型可以很好地编译和训练。验证结果似乎很好,有合理的误差。但是模型.摘要上一个片段中的()是:

^{pr2}$

值得注意的是,分阶段安装的可培训参数数量为0

如果型号.重量然后调用(),它根本不显示LSTM部分:

ipdb> NN.weights
[<tf.Variable 'scope/dense/kernel:0' shape=(128, 2) dtype=float32>, <tf.Variable 'scope/dense/bias:0' shape=(2,) dtype=float32>]

另外,如果模型保存为模型.保存()并加载 tensorflow.keras.models。加载模型或定义模型->;模型载荷()模型的行为将完全不同。相当好的验证精度将变成一个只预测噪声的模型,也就是说,原来相当好的回归模型从一个RNN变成了一个实际上看起来像128个神经元的单层NN,在错误的事情上进行了线性激活训练。在

我有三个问题:

1)怎么了?这是一个bug还是我在滥用Keras RNN API?在

2)如何验证LSTM是否得到正确培训?我想像平常一样检查这些层型号.重量以及model.get_权重()

3)如何在不破坏模型的情况下保存和加载此模型?我的输入和输出管道以及它周围的模块都是为Keras构建的,所以如果可能的话,我不想将NN定义转换为“base”tensorflow。在

我使用的是tensorflow gpu 1.13.1和Keras2.2.4-tf


Tags: from模型importlayerinputmodel定义tensorflow