我正在尝试实现一个内存增强神经网络,其中内存和读/写/使用权重向量根据其先前值的组合进行更新 . 这些重量不同于使用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 ^ 和w_u ^ . 因此,在开始时我必须为这些向量提供有效的初始化 . 最好的方法是什么?我想要的初始化是:

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),并在模型上使用predict()函数,所有次级输出(模型2)到获取要在下一次迭代中使用的变量 . 我还要使用get_weights()和set_weights()将Weigth矩阵从Model 1传递给Model 2 . 正如你所看到的,它变得有点混乱和太慢 .

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

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