def build_keras_model_dm(index_size,vector_size,vocab_size,
context_size,
maxwords,
cbow_mean=False,
learn_doctags=True, learn_words=True, learn_hidden=True,
model=None ,
word_vectors=None,doctag_vectors=None,hidden_vectors=None,
sub_batch_size=1
):
"""
>>> word_vectors=np.array([[1,2],[3,4],[5,6]])
>>> doctag_vectors=np.array([[10,20],[30,40]])
>>> hidden_vectors=np.array([[1,0],[0,1]])
>>> sub_batch_size=2
>>> kerasmodel=build_keras_model_dm(index_size=2,vector_size=2,vocab_size=3,context_size=2,maxwords=2,sub_batch_size=sub_batch_size,word_vectors=word_vectors,doctag_vectors=doctag_vectors,hidden_vectors=hidden_vectors, learn_words=True )
>>> ind=[[0],[1]]
>>> iwd=[[1,0],[1,1]]
>>> ipt=[[1,0],[0,1]]
>>> tmp1=kerasmodel.predict({'index':np.array(ind),'iword':np.array(iwd),'point':np.array(ipt)})['code']
>>> tmp2=np.array([ [(word_vectors[iwd[i]].sum(0)+doctag_vectors[i]).dot(hidden_vectors[j]) for j in ipt[i] ] for i in range(2)])
>>> np.linalg.norm(1/(1+np.exp(-tmp2))-tmp1) < 0.001
True
"""
kerasmodel = Graph()
kerasmodel.add_input(name='index',input_shape=(1,) , dtype=int)
if doctag_vectors is None :
kerasmodel.add_node(Embedding(index_size, vector_size,trainable=learn_doctags,input_length=1 ),name='embedindex', input='index')
else:
kerasmodel.add_node(Embedding(index_size, vector_size,trainable=learn_doctags,input_length=1 ,weights=[doctag_vectors]),name='embedindex', input='index')
kerasmodel.add_input(name='iword',input_shape=(maxwords,), dtype=int)
if word_vectors is None :
kerasmodel.add_node(Embedding(vocab_size, vector_size,trainable=learn_words ,input_length=maxwords ),name='embedword', input='iword')
else:
kerasmodel.add_node(Embedding(vocab_size, vector_size,trainable=learn_words ,input_length=maxwords,weights=[word_vectors ]),name='embedword', input='iword')
kerasmodel.add_input(name='point',input_shape=(sub_batch_size,) , dtype=int)
if hidden_vectors is None :
kerasmodel.add_node(Embedding(context_size, vector_size,trainable=learn_hidden ,input_length=sub_batch_size ),name='embedpoint', input='point')
else:
kerasmodel.add_node(Embedding(context_size, vector_size,trainable=learn_hidden ,input_length=sub_batch_size ,weights=[hidden_vectors]),name='embedpoint', input='point')
if cbow_mean:
kerasmodel.add_node(Lambda(lambda x:x.mean(1),output_shape=(vector_size,)), name='merge',inputs=['embedindex','embedword'], merge_mode='concat', concat_axis=1)
else:
kerasmodel.add_node(Lambda(lambda x:x.sum(1),output_shape=(vector_size,)), name='merge',inputs=['embedindex','embedword'], merge_mode='concat', concat_axis=1)
kerasmodel.add_node(Activation('sigmoid'), name='sigmoid',inputs=['merge','embedpoint'], merge_mode='dot',dot_axes=-1)
kerasmodel.add_output(name='code',input='sigmoid')
kerasmodel.compile('rmsprop', {'code':'mse'})
return kerasmodel
评论列表
文章目录