如何将keras CuDNNLSTM层转换为LSTM(以及将CuDNNGRU转换为GRU)?

时间:2019-09-18 13:32:22

标签: tensorflow keras lstm tf.keras

我正在尝试将tf.keras.layers.CuDNNLSTM转换为tf.keras.layers.LSTM(并且将tf.keras.layers.CuDNNGRU转换为tf.keras.layers.GRU)。

我从this StackOverflow postthis GitHub PR看到CuDNNLSTM-> LSTM转换是可能的,并且我从this GitHub PR看到转换是可能的,但是我发现有些意外推理过程中的行为,所以我不确定自己是否做得正确。

我现在要做的是通过创建(和训练)一个具有CuDNNLSTM层的模型...

    inputs = tf.keras.Input(shape=(120,))
    x = layers.CuDNNLSTM(100)(inputs)   # or x = layers.CuDNNGRU(100)(inputs)
    outputs = layers.Dense(5, activation='softmax')(x)

    model = tf.keras.Model(inputs=inputs, outputs=outputs)

...编译和训练模型...

    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.fit(...)

...将模型既保存为结构的json,又保存为权重的hdf5文件,然后将其编辑为LSTM层而不是CuDNNLSTM层。

    model.save_weights('/path/to/weights.h5')
    # get json, edit layer name, dump into file
    json_config = model.to_json()
    with open('/path/to/structure.json', 'w') as json_file:
        json_config_ = json.loads(json_config)
        layers = json_config_['config']['layers']
        for layer in layers:
            if layer['class_name'].lower() == 'cudnnlstm':
                layer['class_name'] = 'LSTM'
            elif layer['class_name'].lower() == 'cudnngru':
                layer['class_name'] = 'GRU'

        json.dump(json_config_, json_file)

我正在使用'/path/to/weights.h5''/path/to/structure.json'并将它们转换为coreml以在iphone上进行推断,因此在coreml转换期间可能会失败。在研究coreml转换器之前,我想先检查一下是否正确地进行了从CuDNN层到LSTM / GRU层的转换。 这是从CuDNNLSTM转换为LSTM以及从CuDNNGRU转换为GRU的正确方法吗?还有另一种方法应该做的转换吗?

0 个答案:

没有答案