python DNN反向链推理
文章目录
- 介绍
- 示例
- 全部代码
介绍
通过学习代码的输入输出,根据输入匹配输出,将代码块自动拼接起来代码中引用的DNN库是我手搓的,---->DNN库。同时需要将字符转换为0-1之间的数字,方便用于DNN训练。
示例
知识库如下,格式固定为[代码];fd:[输入];~[输出]
其中代码加输入限长30字符,输出限长30字符
mds=s[lsr:rsi];fd:s lsr rsi;~mds,middle string lsr=lsi+lsl;fd:lsi lsl;~lsr,left string right position lsl=len(ls);fd:ls;~lsl,left string length rsi=s.find(rs);fd:rs s;~rsi,right string position lsi=s.find(ls);fd:ls s;~lsi,left string position输出示例
模型加载成功,结构: [60, 120, 60] lsl=len(ls) lsi=s.find(ls) rsi=s.find(rs) lsr=lsi+lsl mds=s[lsr:rsi]全部代码
importDNN1asdnnimportnumpyasnp s=""" lsi=s.find(ls) rsi=s.find(rs) lsl=len(ls) lsr=lfi+lsl mds=s[lsr:rfi] mds=s[lsr:rsi];fd:s lsr rsi;~mds,middle string lsr=lsi+lsl;fd:lsi lsl;~lsr,left string right position lsl=len(ls);fd:ls;~lsl,left string length rsi=s.find(rs);fd:rs s;~rsi,right string position lsi=s.find(ls);fd:ls s;~lsi,left string position """token=60deftrans(s):txtn=[]fornins:ifn=="\n":k=97k=ord(n)-30#限英文和键盘字符2-96txtn.append(int(k/10)/10.0)txtn.append((k%10)/10.0)whilelen(txtn)<token:txtn.append(0.01)txtn.append(0.01)returntxtndefots(ln):s=""i=-1forninln:i+=1ifi%2==1:k+=round(n*10)ifint(k)==0:continuec=chr(k+30)s+=c k=round(n*10)*10returnsdeftrainIO():i=[]o=[]fornins.split("\n"):if"~"inn:k=n.find("~")on=trans(n[:k])isn=n[k+1:].split(",")forminisn:i.append(trans(m))o.append(on)returni,odefrun(i,o):ifo[0].__len__()==token:# dnn.X = i# print(i)# dnn.Y = odnn.begin(60,120,60)# 有神经网络文件前先创建神经网络dnn.randomWB()## dnn.load("k1.npz") #用于加载神经网络数据文件dnn.set(i,o)dnn.train(epochs=20000)ot=dnn.test()forminot:si=ots(m[0].tolist()[0])so=ots(m[1].tolist()[0])print(so,"===",si)dnn.save("k1.npz")# 这里用来训练# i,o=trainIO()# run(i,o)#用来使用,可以更改"__main__"为"__main__1"用于注释。if__name__=="__main__":need="middle string"hav="s,ls,rs"fd=[need]linkot=""dnn.load("k1.npz")deflink(find,sc=1000):globalfd,linkot dnn.set(X=trans(find))#改为用set设置神经网络输入ot=dnn.test()s=ots(ot[0][1].tolist()[0])# 用于展示神经网络输出# for m in ot:# si = ots(m[0].tolist()[0])# so = ots(m[1].tolist()[0])# print(si, "===", so)if"fd:"ins:fd.remove(find)m=s.find(";fd:")re=s[:m]linkot=re+"\n"+linkot nfd=s[m+4:-1].split(" ")# print(re,nfd,s)# print(hav,find)forninnfd:ifnnotinhav:fd.append(n)iflen(fd)>0:link(fd[0],sc-1)link(need)print(linkot)