![cover](https://img-blog.csdnimg.cn/img_convert/7bc0b398d41f4dbc81d31b9dedc4e172.png)
numpy实现RNN和LSTM循环神经网络产生古诗
实现的github,每一层输出都单独和pytorch对齐了训练codes,由于是CPU训练所以速度较慢写了些个好几个模型,主要是sequence的长度,以及字符训练,或者hanlp分词训练的,或者动态训练*_dynamic的档案,是动态rnn或者lstm,输入长度和输出长度都是变化的*_V2_Embedding.py的档案,输入长度和输出长度固定且相等,而且输出后移一个字符或者一个词2layer_
numpy实现RNN和LSTM循环神经网络产生古诗
实现的github,每一层输出都单独和pytorch对齐了
训练codes,由于是CPU训练所以速度较慢
写了些个好几个模型,主要是sequence的长度,以及字符训练,或者hanlp分词训练的,或者动态训练
*_dynamic的档案,是动态rnn或者lstm,输入长度和输出长度都是变化的
*_V2_Embedding.py的档案,输入长度和输出长度固定且相等,而且输出后移一个字符或者一个词
2layer_Embedding的档案,输入长度固定,输出是后一个字符或者一个词,也就是输出只有一个的
可以正常训练的,还支持保存模型和加载模型重训
总共实现了这几个层:
numpy实现RNN层的前向传播和反向传播 - 知乎 (zhihu.com)
numpy实现embedding层的前向传播和反向传播 - 知乎 (zhihu.com)
numpy实现LSTM层的前向传播和反向传播 - 知乎 (zhihu.com)
损失函数的前向传播和反向传播 - 知乎 (zhihu.com)
全连接层的前向传播和反向传播 - 知乎 (zhihu.com)
字符
在这使用写好的RNN\LSTM进行了实践,输出的效果还可以的,使用了26个英文字母做字符的predict训练,使用了26个英文字母的,然后train的时候,是给定sequence=10,每次拿10个字符,然后label往后移动一个字符
输入是:inputs_character = "abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz "
train以后使用保存的模型predict,输入“c”,就能得到相应的输出“defghijklmnopqrst”
见:
RNN、LSTM which using numpy,can train and generate Chinese poetry,embedding, full connect, etc. train normally, save model, restore model
github.com/ZouJiu1/numpy_lstm_RNN
然后还使用字符训练了诗词,数据是来自:Werneror/Poetry: 非常全的古诗词数据,收录了从先秦到现代的共计85万余首古诗词。 (github.com)
最开始用的字符级别产生,one-hot字向量,发现不能收敛,loss一直不下降的呢,而且train速度很慢的呢,然后使用了embedding层,numpy实现embedding层的前向传播和反向传播
使用embedding以后训练速度好了很多的,但不管是rnn或者是使用lstm,都不能收敛的,考虑到没有对词频进行statistic,导致了long tail分布,对词频进行statistic排序然后拿前多少个词频,也就是拿到排在前面的词频,后面的词频较小的词,包括小词频的句子所在行都被删除了,所以训练集只包括词频在前的句子,若是直接训练,会发现训练很难收敛,主要是词频太小的句子,训练次数太少,不能收敛的,而且词频小的词还挺多的,导致了不能收敛
statistic词频以后然后删掉低频词所在的句子,训练以后就可以正常收敛了。但是输出的句子没有句意,虽说可以输出了。
输入和输出的:残星落檐外
残月江花来,
山明水开不。
色月山无知,
花明中限处。
诗句
Werneror/Poetry: 非常全的古诗词数据,收录了从先秦到现代的共计85万余首古诗词。 (github.com)
字符的train发现输出不太好,字和字之间没有relation,输出完全没有句子意思,使用hanlp分词以后效果才变好的,hanlp分词使用的是这个模型-FINE_ELECTRA_SMALL_ZH,细腻度分词的。拿到了每句对应的分词,以及id2char,char2id的dictionary
train的时候发现输出的很多都是EOS符号,EOS也就是结束符号的,主要是填充的时候使用了很多的EOS符号,所以train梯度不太对了,这边对梯度进行了缩放,EOS的梯度*0.001,EOS的梯度缩小了1000倍。就可以正常训练了的,loss也正常下降的,使用了RNN和LSTM训练,RNN训练算正常的。
这边给出几个Example:
输入:暮云千山雪
暮云千山雪,
春行复深上。
风无流鸟树,
清客鸟归还。
输入:朝送山僧去
朝送山僧去,
莫君在梦何。
不知山不知,
山中我欲幸。
输入:携杖溪边听
携杖溪边听,
抱我树月知。
故山中常更,
鸟中应上鬓。
输入:楼高秋易寒
楼高秋易寒,
凭谁暮云云,
添我下来衣,
知一别来云,
输入:残星落檐外
残星落檐外,
馀月罢窗来,
水白先成秋,
霞暗未成不,
输入:月在画楼西
月在画楼西,
烛故是愁来。
何转知此山,
花常更花中。
参考:
https://blog.csdn.net/SHU15121856/article/details/104387209
https://hanlp.hankcs.com/docs/api/hanlp/pretrained/tok.html
https://github.com/hankcs/HanLP
https://github.com/Werneror/Poetry
https://discuss.pytorch.org/t/how-nn-embedding-trained/32533/11
https://zhuanlan.zhihu.com/p/247970862
https://zhuanlan.zhihu.com/p/147685918
https://zhuanlan.zhihu.com/p/28054589
https://zhuanlan.zhihu.com/p/371849556
https://zhuanlan.zhihu.com/p/54868269
https://zhuanlan.zhihu.com/p/488710218
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
https://blog.csdn.net/zhaojc1995/article/details/80572098
https://github.com/wzyonggege/RNN_poetry_generator
https://github.com/stardut/Text-Generate-RNN
更多推荐
所有评论(0)