Python 如何将自定义初始权重设置为biLSTM图层Keras?

Python 如何将自定义初始权重设置为biLSTM图层Keras?,python,tensorflow,keras,bilstm,Python,Tensorflow,Keras,Bilstm,我目前正致力于构建BiLSTM,并注意使用Antlion算法优化BiLSTM层权重。Antlion Alogrithm在MATLAB代码中,我能够集成Python和MATLAB以获得优化权重,如下所示: #LSTM hidden nodes hidden_nodes=11 import matlab.engine eng = matlab.engine.start_matlab() #call optimised_weights.m [forward_kernel, backward_ker

我目前正致力于构建BiLSTM,并注意使用Antlion算法优化BiLSTM层权重。Antlion Alogrithm在MATLAB代码中,我能够集成Python和MATLAB以获得优化权重,如下所示:

#LSTM hidden nodes
hidden_nodes=11

import matlab.engine
eng = matlab.engine.start_matlab()
#call optimised_weights.m 
[forward_kernel, backward_kernel,forward_recurrent, backward_recurrent]=eng.optimised_weights(int(hidden_nodes),nargout=4)
eng.quit()

## convert to nparray 
forward_kernel=np.array(forward_kernel)
backward_kernel=np.array(backward_kernel)
forward_recurrent=np.array(forward_recurrent)
backward_recurrent=np.array(backward_recurrent)
我目前面临如下模型中创建的BiLSTM层的权重和偏差设置问题(未设置自定义初始权重):

我尝试过以下方法:

model.add(Bidirectional(LSTM(hidden_nodes, return_sequences=True,
weights=[forward_kernel,forward_recurrent,np.zeros(20,),backward_kernel,backward_recurrent,np.zeros(20,)]))) 
但是一旦模型被编译,权重和偏差就会改变…即使内核、递归和偏差初始化器被设置为无

我已经提到了这个链接:但无法将其与我的问题联系起来

如果你们能提供解决这个问题的见解,如果我遗漏了一些基本部分,我将不胜感激。如有需要,我很乐意与大家分享更多细节


谢谢

使用
tf.constant\u初始值设定项
将自定义权重设置为
np.array
。此外,当您使用双向层时,需要使用自定义权重明确指定反向层

layer = Bidirectional(
    LSTM(
        hidden_nodes,
        return_sequences=True,
        kernel_initializer=tf.constant_initializer(forward_kernel),
        recurrent_initializer=tf.constant_initializer(forward_recurrent),
    ),
    backward_layer=LSTM(
        hidden_nodes,
        return_sequences=True,
        kernel_initializer=tf.constant_initializer(backward_kernel),
        recurrent_initializer=tf.constant_initializer(backward_recurrent),
        go_backwards=True,
    ),
)
注意砝码的预期形状。由于层的输入是
(批、时间步、特征)
,因此权重应具有以下形状(以说明LSTM单元中的4个门):

  • 内核:
    (功能,4个隐藏节点)
  • 重复:
    (隐藏节点,4个*隐藏节点)
  • 偏差:
    (4个隐藏节点)

我已经用我的模型测试了你的方法,现在似乎可以工作了……谢谢!
layer = Bidirectional(
    LSTM(
        hidden_nodes,
        return_sequences=True,
        kernel_initializer=tf.constant_initializer(forward_kernel),
        recurrent_initializer=tf.constant_initializer(forward_recurrent),
    ),
    backward_layer=LSTM(
        hidden_nodes,
        return_sequences=True,
        kernel_initializer=tf.constant_initializer(backward_kernel),
        recurrent_initializer=tf.constant_initializer(backward_recurrent),
        go_backwards=True,
    ),
)