Python 如何将使用tensorflow构建的模型转换为keras api?

Python 如何将使用tensorflow构建的模型转换为keras api?,python,tensorflow,keras,cnn,Python,Tensorflow,Keras,Cnn,因此,在当前的项目中,我必须从这里修改官方代码,我对tensorflow和他的所有概念都很陌生,我与tf.keras一起工作,但实际代码是用tensorflow编写的(版本1.7,很旧…),我想知道是否有人能解释一下这个模型是如何工作的,或者有没有想法用keras和tensorflow的最新版本(tf版本2)编写一个等价的模型。原始代码就在这里(ConvNCF.py) 预测模型 类别ConvNCF: def_uuinit_uu(self、num_users、num_items、args):#TO

因此,在当前的项目中,我必须从这里修改官方代码,我对tensorflow和他的所有概念都很陌生,我与tf.keras一起工作,但实际代码是用tensorflow编写的(版本1.7,很旧…),我想知道是否有人能解释一下这个模型是如何工作的,或者有没有想法用keras和tensorflow的最新版本(tf版本2)编写一个等价的模型。原始代码就在这里(ConvNCF.py)

预测模型 类别ConvNCF: def_uuinit_uu(self、num_users、num_items、args):#TODO:为什么其他参数有用? self.num\u items=num\u items self.num\u users=num\u users self.embedded\u size=args.embedded\u size self.lr\u embed=args.lr\u embed self.lr_net=args.lr_net #托多:那些东西是什么? Self.HydNythSosial= ARGS。 Self.NC=EVAR(ARGS.NETShanChank) regs=eval(args.regs) self.lambda_双线性=regs[0] self.gamma_双线性=regs[1] self.lambda_weight=regs[2] self.dns=args.dns self.train\u auc=args.train\u auc 自我准备=错误 定义\u创建\u占位符(自): 使用tf.name\u范围(“输入数据”): self.user\u input=tf.placeholder(tf.int32,shape=[None,1],name=“user\u input”) self.item\u input\u pos=tf.placeholder(tf.int32,shape=[None,1],name=“item\u input\u pos”) self.item\u input\u neg=tf.placeholder(tf.int32,shape=[None,1],name=“item\u input\u neg”) self.keep_prob=tf.placeholder(tf.float32,name=“keep_prob”)#TODO:为什么这个东西有用? 定义转换重量(自身、isz、osz): 返回值(权重变量([2,2,isz,osz])、偏差变量([osz])) 定义转换层(自身、输入、P): conv=tf.nn.conv2d(输入,P[0],步幅=[1,2,2,1],padding='SAME') 返回tf.nn.relu(conv+P[1]) 定义创建变量(自): 使用tf.name_范围(“嵌入”): self.embedding\u P=tf.Variable(tf.truncated\u normal(shape=[self.num\u users,self.embedding\u size],mean=0.0,stddev=0.01), name='embedding_P',dtype=tf.float32)#(用户,嵌入大小) self.embedding\u Q=tf.Variable(tf.truncated\u normal(shape=[self.num\u items,self.embedding\u size],mean=0.0,stddev=0.01), name='embedding_Q',dtype=tf.float32)#(项目,嵌入大小) #这里应该有6个ISZ,因为外部产品的尺寸是64x64 iszs=[1]+self.nc[:-1] oszs=self.nc self.P=[] 对于isz,邮政编码中的osz(isz,osz): self.P.append(self.\u conv\u weight(isz,osz)) self.W=权重_变量([self.nc[-1],1]) self.b=权重_变量([1]) 定义创建推理(自身、项目输入): 使用tf.name_范围(“推断”): #嵌入查找 self.embedding\u p=tf.nn.embedding\u查找(self.embedding\u p,self.user\u输入) self.embedding\u q=tf.nn.embedding\u查找(self.embedding\u q,项输入) #P_和Q_i的外积 self.relation=tf.matmul(tf.transpose(self.embedding\u p,perm=[0,2,1]),self.embedding\u q) self.net\u input=tf.expand\u dims(self.relation,-1) #有线电视新闻网 self.layer=[] 输入=self.net\u输入 对于self.p中的p: self.layer.append(self.\u conv\u layer(输入,p)) 输入=自身层[-1] #预测 self.dropout=tf.nn.dropout(self.layer[-1],self.keep_prob) self.output_layer=tf.matmul(tf.reforme(self.dropout,[-1,self.nc[-1]]),self.W)+self.b 返回self.embedding\u p、self.embedding\u q、self.output\u层 def_常规(自身、参数): res=0 对于参数中的参数: res+=tf.reduce_sum(tf.square(param[0]))+tf.reduce_sum(tf.square(param[1])) 返回res def_创建_损失(自身): 具有tf.name_范围(“损失”): #L(θ)的BPR损失 self.p1、self.q1、self.output=self.\u创建\u推理(self.item\u输入\u位置) self.p2、self.q2、self.output\u neg=self.\u创建\u推理(self.item\u input\u neg) self.result=self.output-self.output_neg self.loss=tf.reduce_sum(tf.log(1+tf.exp(-self.result))) self.opt_loss=self.loss+self.lambda_双线性*(tf.reduce_和(tf.square(self.p1))\ +tf.reduce_sum(tf.square(self.q2))+tf.reduce_sum(tf.square(self.q1)))\ +self.gamma_双线性*self._正则([(self.W,self.b)])\ +self.lambda_-weight*(self._-regular(self.P)+self._-regular([(self.W,self.b)]) #在首次对EMGEDDING进行预训练但随机初始化网络时使用 #如果不是,则参数可能为NaN。 定义创建预优化器(自): self.pre_opt=tf.train.adagradeOptimizer(学习率=0.01)。最小化(self.loss) 定义创建优化器(自身): #分离优化器 var_list1=[self.embedding_P,self.embedding_Q] #[self.W1,self.W2,self.W3,self.W4,self.b1,self.b2,self.b3,self.b4,self.P1,self.P2,self.P3] var_list2=列表(set(tf.trainable_variables())-set(var_list1)) opt1=tf.train.adagradeOptimizer(self.lr_嵌入) opt2=tf.train.adagradeOptimizer(self.lr_net) 梯度=tf.梯度(自选择损失,var_列表1+var_列表2) 梯度1=梯度[:len(变量列表1)] 梯度2=梯度[len(变量列表1):] 列车op1=opt1。应用梯度(列表(zip(梯度1,变量列表1))) 序列op2=opt2。应用梯度(列表(zip(梯度2,变量列表2))) self.optimizer=tf.group(列)