2

我正在尝试实现一个内存增强神经网络,其中内存和读/写/使用权重向量根据它们先前值的组合进行更新。这些权重不同于使用 fit() 函数自动更新的层之间的经典权重矩阵!我的问题如下:如何正确地将这些权重初始化为 keras 张量并在模型中使用它们?我用下面的简化示例更好地解释它。

我的 API 模型类似于:

input = Input(shape=(5,6))
controller = LSTM(20, activation='tanh',stateful=False, return_sequences=True)(input)
write_key = Dense(4,activation='tanh')(controller)
read_key = Dense(4,activation='tanh')(controller)
w_w = Add()([w_u, w_r])                            #<---- UPDATE OF WRITE WEIGHTS
to_write = Dot()([w_w, write_key])
M = Add()([M,to_write])
cos_sim = Dot()([M,read_key])
w_r = Lambda(lambda x: softmax(x,axis=1))(cos_sim) #<---- UPDATE OF READ WEIGHTS
w_u = Add()([w_u,w_r,w_w])                         #<---- UPDATE OF USAGE WEIGHTS
retrieved_memory = Dot()([w_r,M])
controller_output = concatenate([controller,retrieved_memory])
final_output = Dense(6,activation='sigmoid')(controller_output)`

你可以看到,为了计算 w_w^t,我必须首先定义 w_r^{t-1} 和 w_u^{t-1}。所以,一开始我必须为这些向量提供一个有效的初始化。最好的方法是什么?我想要的初始化是:

M = K.variable(numpy.zeros((10,4)))       # MEMORY
w_r = K.variable(numpy.zeros((1,10)))     # READ WEIGHTS
w_u = K.variable(numpy.zeros((1,10)))     # USAGE WEIGHTS`

但是,类似于#2486 (entron) 中所说的,这些命令不会返回包含所有需要的元数据的 keras 张量,因此会返回以下错误:

AttributeError:“NoneType”对象没有属性“inbound_nodes”

我还考虑在每次迭代中使用旧的 M、w_r 和 w_u 作为进一步的输入,并类似地输入相同的变量来完成循环。但这意味着我必须使用 fit() 函数在线训练仅将目标作为最终输出的模型(模型 1),并在具有所有辅助输出(模型 2)的模型上使用 predict() 函数来获取要在下一次迭代中使用的变量。我还必须使用 get_weights() 和 set_weights() 将模型 1 的权重矩阵传递给模型 2。正如你所看到的,它变得有点混乱而且太慢了。

你对这个问题有什么建议吗?

PS 请不要过多关注上面的 API 模型,因为它是完整模型的简化(几乎毫无意义)版本,我跳过了几个关键步骤。

4

0 回答 0