我正在尝试实现一种内存增强神经网络,其中内存和读/写/使用权重向量根据其先前值的组合进行更新。这些重量不同于使用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),并在模型上使用predict()函数,所有次级输出(模型2)到获取在下一次迭代中使用的变量。我还要使用get_weights()和set_weights()将Weigth矩阵从Model 1传递给Model 2。正如你所看到的,它变得有点混乱和太慢。
你对这个问题有什么建议吗?
P.S。请不要过多关注上面的API模型,因为它是完整版本的简化(几乎无意义)版本,我跳过了几个关键步骤。