共计 1695 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | 这篇文章主要介绍了 numpy 实现 RNN 原理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 |
首先说明代码只是帮助理解,并未写出梯度下降部分,默认参数已经被固定,不影响理解。代码主要实现 RNN 原理,只使用 numpy 库,不可用于 GPU 加速。
import numpy as np | |
class Rnn(): | |
def __init__(self, input_size, hidden_size, num_layers, bidirectional=False): | |
self.input_size = input_size | |
self.hidden_size = hidden_size | |
self.num_layers = num_layers | |
self.bidirectional = bidirectional | |
def feed(self, x): | |
''' | |
:param x: [seq, batch_size, embedding] | |
:return: out, hidden | |
''' | |
# x.shape [sep, batch, feature] | |
# hidden.shape [hidden_size, batch] | |
# Whh0.shape [hidden_size, hidden_size] Wih0.shape [hidden_size, feature] | |
# Whh1.shape [hidden_size, hidden_size] Wih1.size [hidden_size, hidden_size] | |
out = [] | |
x, hidden = np.array(x), [np.zeros((self.hidden_size, x.shape[1])) for i in range(self.num_layers)] | |
Wih = [np.random.random((self.hidden_size, self.hidden_size)) for i in range(1, self.num_layers)] | |
Wih.insert(0, np.random.random((self.hidden_size, x.shape[2]))) | |
Whh = [np.random.random((self.hidden_size, self.hidden_size)) for i in range(self.num_layers)] | |
time = x.shape[0] | |
for i in range(time): | |
hidden[0] = np.tanh((np.dot(Wih[0], np.transpose(x[i, ...], (1, 0))) + | |
np.dot(Whh[0], hidden[0]) | |
)) | |
for i in range(1, self.num_layers): | |
hidden[i] = np.tanh((np.dot(Wih[i], hidden[i-1]) + | |
np.dot(Whh[i], hidden[i]) | |
)) | |
out.append(hidden[self.num_layers-1]) | |
return np.array(out), np.array(hidden) | |
def sigmoid(x): | |
return 1.0/(1.0 + 1.0/np.exp(x)) | |
if __name__ == '__main__': | |
rnn = Rnn(1, 5, 4) | |
input = np.random.random((6, 2, 1)) | |
out, h = rnn.feed(input) | |
print(f'seq is {input.shape[0]}, batch_size is {input.shape[1]}', 'out.shape', out.shape, 'h.shape', h.shape) | |
# print(sigmoid(np.random.random((2, 3)))) | |
# | |
# element-wise multiplication | |
# print(np.array([1, 2])*np.array([2, 1])) |
到此这篇关于 numpy 实现 RNN 原理实现的文章就介绍到这了。
正文完
星哥玩云-微信公众号
