Numpy实现RNN

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

class RNN(Layer):

“”"A Vanilla Fully-Connected Recurrent Neural Network layer.

Parameters:


n_units: int

The number of hidden states in the layer.

activation: string

The name of the activation function which will be applied to the output of each state.

bptt_trunc: int

Decides how many time steps the gradient should be propagated backwards through states

given the loss gradient for time step t.

input_shape: tuple

The expected input shape of the layer. For dense layers a single digit specifying

the number of features of the input. Must be specified if it is the first layer in

the network.

Reference:

http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-2-implementing-a-language-model-rnn-with-python-numpy-and-theano/

“”"

def init(self, n_units, activation=‘tanh’, bptt_trunc=5, input_shape=None):

self.input_shape = input_shape

self.n_units = n_units

self.activation = activation_functionsactivation

self.trainable = True

self.bptt_trunc = bptt_trunc

self.W = None # Weight of the previous state

self.V = None # Weight of the output

self.U = None # Weight of the input

def initialize(self, optimizer):

timesteps, input_dim = self.input_shape

Initialize the weights

limit = 1 / math.sqrt(input_dim)

self.U = np.random.uniform(-limit, limit, (self.n_units, input_dim))

limit = 1 / math.sqrt(self.n_units)

self.V = np.random.uniform(-limit, limit, (input_dim, self.n_units))

self.W = np.random.uniform(-limit, limit, (self.n_units, self.n_units))

Weight optimizers

self.U_opt = copy.copy(optimizer)

self.V_opt = copy.copy(optimizer)

self.W_opt = copy.copy(optimizer)

def parameters(self):

return np.prod(self.W.shape) + np.prod(self.U.shape) + np.prod(self.V.shape)

def forward_pass(self, X, training=True):

self.layer_input = X

batch_size, timesteps, input_dim = X.shape

Save these values for use in backprop.

self.state_input = np.zeros((batch_size, timesteps, self.n_units))

self.states = np.zeros((batch_size, timesteps+1, self.n_units))

self.outputs = np.zeros((batch_size, timesteps, input_dim))

Set last time step to zero for calculation of the state_input at time step zero

self.states[:, -1] = np.zeros((batch_size, self.n_units))

for t in range(timesteps):

Input to state_t is the current input and output of previous states

self.state_input[:, t] = X[:, t].dot(self.U.T) + self.states[:, t-1].dot(self.W.T)

self.states[:, t] = self.activation(self.state_input[:, t])

self.outputs[:, t] = self.states[:, t].dot(self.V.T)

return self.outputs

def backward_pass(self, accum_grad):

_, timesteps, _ = accum_grad.shape

Variables where we save the accumulated gradient w.r.t each parameter

grad_U = np.zeros_like(self.U)

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要用Numpy实现RNN进行字符级的文本预测,需要以下步骤: 1. 准备数据:将训练文本转化为数字,建立字符到数字的映射。将训练文本分成输入和输出序列,每个输入序列包含一定数量的字符,每个输出序列包含与其对应的下一个字符。 2. 初始化模型参数:定义模型的超参数,如隐藏层大小、学习率等,并随机初始化权重和偏置。 3. 定义前向传播:使用Numpy实现前向传播,计算每个时间步的隐藏状态和输出。 4. 定义损失函数:使用交叉熵损失函数来衡量预测输出与真实输出之间的差距。 5. 计算梯度:使用反向传播算法计算每个参数的梯度。 6. 更新参数:使用梯度下降算法更新模型的权重和偏置。 7. 重复步骤3-6,直到模型收敛或达到最大迭代次数。 8. 预测文本:使用训练好的模型预测给定输入序列的下一个字符,将其添加到输出序列中,并重复此过程直到预测所需长度的文本。 下面是一个简单的代码示例: ```python import numpy as np # 准备数据 data = open('train.txt', 'r').read() chars = list(set(data)) num_chars = len(chars) char_to_int = { ch:i for i,ch in enumerate(chars) } int_to_char = { i:ch for i,ch in enumerate(chars) } seq_length = 100 input_seqs = [] output_seqs = [] for i in range(0, len(data) - seq_length, 1): seq_in = data[i:i + seq_length] seq_out = data[i + seq_length] input_seqs.append([char_to_int[char] for char in seq_in]) output_seqs.append(char_to_int[seq_out]) num_seqs = len(input_seqs) # 初始化模型参数 hidden_size = 100 learning_rate = 0.1 Wxh = np.random.randn(hidden_size, num_chars) * 0.01 Whh = np.random.randn(hidden_size, hidden_size) * 0.01 Why = np.random.randn(num_chars, hidden_size) * 0.01 bh = np.zeros((hidden_size, 1)) by = np.zeros((num_chars, 1)) # 定义前向传播 def forward(input_seq, hprev): xs, hs, ys, ps = {}, {}, {}, {} hs[-1] = np.copy(hprev) loss = 0 for t in range(len(input_seq)): xs[t] = np.zeros((num_chars, 1)) xs[t][input_seq[t]] = 1 hs[t] = np.tanh(np.dot(Wxh, xs[t]) + np.dot(Whh, hs[t-1]) + bh) ys[t] = np.dot(Why, hs[t]) + by ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t])) loss += -np.log(ps[t][output_seq[t], 0]) return loss, hs[len(input_seq)-1], ps # 定义损失函数 def loss(input_seqs, output_seqs, hprev): loss = 0 for i in range(num_seqs): input_seq = input_seqs[i] output_seq = output_seqs[i] seq_loss, hprev, _ = forward(input_seq, hprev) loss += seq_loss return loss, hprev # 计算梯度 def backward(input_seq, output_seq, hs, ps): dWxh, dWhh, dWhy = np.zeros_like(Wxh), np.zeros_like(Whh), np.zeros_like(Why) dbh, dby = np.zeros_like(bh), np.zeros_like(by) dhnext = np.zeros_like(hs[0]) for t in reversed(range(len(input_seq))): dy = np.copy(ps[t]) dy[output_seq[t]] -= 1 dWhy += np.dot(dy, hs[t].T) dby += dy dh = np.dot(Why.T, dy) + dhnext dhraw = (1 - hs[t] * hs[t]) * dh dbh += dhraw dWxh += np.dot(dhraw, xs[t].T) dWhh += np.dot(dhraw, hs[t-1].T) dhnext = np.dot(Whh.T, dhraw) for dparam in [dWxh, dWhh, dWhy, dbh, dby]: np.clip(dparam, -5, 5, out=dparam) return dWxh, dWhh, dWhy, dbh, dby # 更新参数 def update(input_seq, output_seq, hprev): loss, hs, ps = forward(input_seq, hprev) dWxh, dWhh, dWhy, dbh, dby = backward(input_seq, output_seq, hs, ps) for param, dparam in zip([Wxh, Whh, Why, bh, by], [dWxh, dWhh, dWhy, dbh, dby]): param -= learning_rate * dparam return loss, hs # 训练模型 num_epochs = 100 hprev = np.zeros((hidden_size, 1)) for epoch in range(num_epochs): epoch_loss, hprev = loss(input_seqs, output_seqs, hprev) if epoch % 10 == 0: print('Epoch %d, loss = %f' % (epoch, epoch_loss)) # 预测文本 input_seq = [char_to_int[char] for char in 'hello world'] hprev = np.zeros((hidden_size, 1)) predicted_text = '' for i in range(500): _, hprev, ps = forward(input_seq, hprev) next_char = int_to_char[np.random.choice(range(num_chars), p=ps[-1])] predicted_text += next_char input_seq = input_seq[1:] + [char_to_int[next_char]] print(predicted_text) ``` 注意,这只是一个简单的实现示例,实际上还需要对模型进行调参和优化,才能得到更好的预测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值