andrej kaparthy的recurrentjs库的python实现
recurrent-js-python的Python项目详细描述
#python中的recurrentjs
跟随[andrej kaparthy]的脚步(http://cs.stanford.edu/people/karpathy/),这里是[recurrentjs]的python实现(http://cs.stanford.edu/people/karpathy/recurrentjs/)([github](https://github.com/karpathy/recurrentjs))。
虽然python有很好的自动差异化库,但缺少无编译版本。尤其是recurrentjs非常好地利用回调和垃圾收集来支持backprop穿越时间。在这个实现中,目标是减少对这些抽象的依赖,并有一个简单的backprop step类。最后,如果这很容易实现,那么最终我们将实现一个c++版本,它将使大多数计算步骤都很快,除了一些中间的backprop步骤分配,但这些步骤并不能构成大部分计算,并且保持api和语法清晰。
r/>
在这个实现中,目标很简单:
*move off callbacks
*启用批处理(通过从矩阵中提取行时隐藏的丢失、张量和高级索引)
*形成一个基线,以便在非脚本语言中实现
角色生成演示,并导入相同的文本进行角色模型学习。困惑很快下降到7-8左右(与javascript版本中的行为相似)。
From RecurrentJS import*
output-size=-1
epoch-size=-1
lettertoindex=5
lettertoindex={}
indextoletter={}
hidden-size=[20,20]
generator="lsTM"
vocab=[]
regc=0.000001 L2正则化强度
学习率=0.01学习率
clipval=5.0
全局输入大小
全局输出大小
全局纪元大小
全局字母索引
全局索引器
对所有字符进行计数
d={}
对于已发送的句子:
对于已发送的c:
如果d中的c:
d[c]+=1
否则:
d[c]=1
d创建指针
lettertoindex={}
indextoletter={}
vocab=[]
注意:从一开始,因为我们将有开始和结束标记!
也就是说,开始标记将是模型字母向量中的索引0
;结束标记将是下一个字符softmax中的索引0
q=1
对于d中的ch.keys():
如果d[ch]>;=计数阈值:
将字符添加到vocab
letter to index[ch]=q
indextoleter[q]=ch
vocab.append(ch)
q+=1
x=g.row_cluck(model['wil',ix)
forward prop the sequence learner
如果generator=="rnn":
out_struct=forwardrnn(g,model,hidden_size,x,prev)
否则:
out_struct=forwardlstm(g,model,hidden_size,x,prev)
return out_struct
def initmodel()用法:
model={}
lstm=initlstm(字母大小,隐藏大小,输出大小),如果generator=="lstm"else initrnn(字母大小,隐藏大小,输出大小)
model['wil']=randmat(输入大小,字母大小,0.08)
model.update(lstm)
return model
def costfun(model,sent):
获取一个模型和一个句子,然后计算损失。还返回可用于执行backprop的graph
ix_source=0如果i=-1 else lettertoindex[已发送[i]];第一步:从开始标记开始
ix_target=0如果i==n-1 else lettertoindex[已发送[i+1]];最后一步:以结束标记结束
prev=lh
#将梯度设置为对数概率
log probs=lh.output将输出解释为logprobs
probs=softmax(logprobs)计算softmax概率
log2ppl+=-np.log(probs.w[ix_target,0])并累积基2对数概率并进行平滑ing
成本+=-np.log(probs.w[ix_target,0])
将梯度写入日志概率
logprobs.dw=probs.w
logprobs.dw[ix_target]=1
return g,ppl,cost
text_data=open("paulgraham_text.txt","rt").readlines()
initvocab(text_data,1)
model=initmodel()
ppl_list=[]
median_ppl=[]
tick_iter=0
def tick():
global tick_iter
global ppl_list
global median_ppl
sentix=np.random.randint(0,len(文本数据))
sent=text_data[sentix]
g,ppl,cost=costfun(model,sent)
g.backward()
solver.step(model,learning_rate,regc,clipval)
ppl-list.append(ppl)
tick_iter+=1
如果勾选项%100==0:
中值=np.中值(ppl_list)
ppl_list=[]
中值附加(中值)
javascript代码)
跟随[andrej kaparthy]的脚步(http://cs.stanford.edu/people/karpathy/),这里是[recurrentjs]的python实现(http://cs.stanford.edu/people/karpathy/recurrentjs/)([github](https://github.com/karpathy/recurrentjs))。
虽然python有很好的自动差异化库,但缺少无编译版本。尤其是recurrentjs非常好地利用回调和垃圾收集来支持backprop穿越时间。在这个实现中,目标是减少对这些抽象的依赖,并有一个简单的backprop step类。最后,如果这很容易实现,那么最终我们将实现一个c++版本,它将使大多数计算步骤都很快,除了一些中间的backprop步骤分配,但这些步骤并不能构成大部分计算,并且保持api和语法清晰。
r/>
在这个实现中,目标很简单:
*move off callbacks
*启用批处理(通过从矩阵中提取行时隐藏的丢失、张量和高级索引)
*形成一个基线,以便在非脚本语言中实现
角色生成演示,并导入相同的文本进行角色模型学习。困惑很快下降到7-8左右(与javascript版本中的行为相似)。
From RecurrentJS import*
epoch-size=-1
lettertoindex=5
lettertoindex={}
indextoletter={}
hidden-size=[20,20]
generator="lsTM"
vocab=[]
regc=0.000001 L2正则化强度
学习率=0.01学习率
clipval=5.0
全局输出大小
全局纪元大小
全局字母索引
全局索引器
对所有字符进行计数
d={}
对于已发送的句子:
对于已发送的c:
如果d中的c:
d[c]+=1
否则:
d[c]=1
d创建指针
lettertoindex={}
indextoletter={}
vocab=[]
注意:从一开始,因为我们将有开始和结束标记!
也就是说,开始标记将是模型字母向量中的索引0
;结束标记将是下一个字符softmax中的索引0
q=1
对于d中的ch.keys():
如果d[ch]>;=计数阈值:
将字符添加到vocab
letter to index[ch]=q
indextoleter[q]=ch
vocab.append(ch)
q+=1
x=g.row_cluck(model['wil',ix)
forward prop the sequence learner
如果generator=="rnn":
out_struct=forwardrnn(g,model,hidden_size,x,prev)
否则:
out_struct=forwardlstm(g,model,hidden_size,x,prev)
return out_struct
def initmodel()用法:
model={}
lstm=initlstm(字母大小,隐藏大小,输出大小),如果generator=="lstm"else initrnn(字母大小,隐藏大小,输出大小)
model['wil']=randmat(输入大小,字母大小,0.08)
model.update(lstm)
return model
def costfun(model,sent):
获取一个模型和一个句子,然后计算损失。还返回可用于执行backprop的graph
ix_source=0如果i=-1 else lettertoindex[已发送[i]];第一步:从开始标记开始
ix_target=0如果i==n-1 else lettertoindex[已发送[i+1]];最后一步:以结束标记结束
#将梯度设置为对数概率
log probs=lh.output将输出解释为logprobs
probs=softmax(logprobs)计算softmax概率
log2ppl+=-np.log(probs.w[ix_target,0])并累积基2对数概率并进行平滑ing
成本+=-np.log(probs.w[ix_target,0])
将梯度写入日志概率
logprobs.dw=probs.w
logprobs.dw[ix_target]=1
return g,ppl,cost
text_data=open("paulgraham_text.txt","rt").readlines()
initvocab(text_data,1)
model=initmodel()
ppl_list=[]
median_ppl=[]
tick_iter=0
def tick():
global tick_iter
global ppl_list
global median_ppl
sentix=np.random.randint(0,len(文本数据))
sent=text_data[sentix]
g,ppl,cost=costfun(model,sent)
g.backward()
solver.step(model,learning_rate,regc,clipval)
ppl-list.append(ppl)
tick_iter+=1
如果勾选项%100==0:
中值=np.中值(ppl_list)
ppl_list=[]
中值附加(中值)
javascript代码)