【人工智能基础】RNN实验

一、RNN特性

权重共享

wordi · weight + bais

持久记忆单元

wordi · weightword + baisword + hi · weighth + baish

二、公式化表达

ht = f(h~t - 1~, xt)

ht = tanh(Whhh~t - 1~ + Wxhxt)

yt = Whyht

三、RNN网络正弦波波形预测

环境准备

python 复制代码
import numpy as np
import torch
from torch import nn,optim
from matplotlib import pyplot as plt

# 时间轴采样数
num_time_steps = 50
input_size = 1
hidden_size = 16
output_size = 1
lr = 0.01

RNN类

python 复制代码
class Net(nn.Module):
    def __init__(self,):
        super(Net, self).__init__()
        self.rnn = nn.RNN(
            input_size = input_size, 
            hidden_size = hidden_size, 
            num_layers = 1,
            # 格式为[batch, seq, feature]
            batch_first = True
        )
        for p in self.rnn.parameters():
            nn.init.normal_(p,mean=0.0, std=0.001)
        self.linear = nn.Linear(hidden_size, output_size)

    def forward(self, x, hidden_prev):
        out, hidden_prev = self.rnn(x, hidden_prev)
        # [1, seq, h] => [seq, h]
        out = out.view(-1,hidden_size)
        # [seq, h] => [seq, 1]
        out = self.linear(out)
        # [seq, 1] => [1, seq, 1], 需要和y做均方差
        out = out.unsqueeze(dim=0)
        return out, hidden_prev.clone()

正弦数据构建函数

python 复制代码
def create_image():
    start = np.random.randint(3, size=1)[0]
    time_steps = np.linspace(start, start + 10, num_time_steps)
    data = np.sin(time_steps)
    data = data.reshape(num_time_steps, 1)
    x = torch.tensor(data[:-1]).float().view(1, num_time_steps - 1, 1)
    y = torch.tensor(data[1:]).float().view(1, num_time_steps - 1, 1)
    return time_steps,x, y

训练模型

python 复制代码
model = Net()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr)

hidden_prev = torch.zeros(1,1, hidden_size)
for iter in range(6000):
    time_steps,x, y = create_image()
    output, hidden_prev = model(x, hidden_prev)
    hidden_prev = hidden_prev.detach()

    loss = criterion(output,y)
    model.zero_grad()
    loss.backward()
    for p in model.parameters():
        torch.nn.utils.clip_grad_norm_(p,10)
    optimizer.step()

    if iter % 1000 == 0:
        plt.plot(time_steps[:-1], x.ravel(), c = 'b')
        plt.plot(time_steps[:-1], y.ravel(), c= 'r')
        plt.plot(time_steps[:-1], output.detach().numpy().ravel(), c= 'g')
        plt.show()
        print('Iteration:{} loss {}'.format(iter, loss.item()))

可以看到第二次绘制图像的时候,输出曲线基本拟合了目标曲线

图像预测

python 复制代码
time_steps,x, y = create_image()

predictions = []
# input = x[:, 0, :]
for i in range(x.shape[1]):
    input = x[:, i, :].view(1, 1, 1)
    (pred, hiden_prev) = model(input, hidden_prev)
    input = pred
    predictions.append(pred.detach().numpy().ravel()[0])

x = x.data.numpy().ravel()

y = y.data.numpy()
plt.scatter(time_steps[:-1], x.ravel(), s=90)
plt.plot(time_steps[:-1], x.ravel())

plt.scatter(time_steps[1:],predictions)
plt.show()
    

输出的预测曲线基本与目标曲线相同


p.s. 最后的实验应该是输入一个点,通过这个点来预测出整个正弦曲线,但是我尝试了很多次都失败了,只能修改成根据正弦函数的上一个点来预测下一个点

相关推荐
驴友花雕4 小时前
【花雕动手做】行空板 K10 系列实验之人工智能语音识别小车的10个参考案例
人工智能·单片机·嵌入式硬件·语音识别·行空板 k10 系列实验·花雕动手做·小车的10个参考案例
火山引擎开发者社区5 小时前
DeepSeek-V4 Pro 发布,veStack Day 0 完成模型适配
人工智能
2501_926978335 小时前
AGI 的四种瓶颈:资源型还是发现型--以及DSH的位置
人工智能·经验分享·笔记·ai写作
Q463913495 小时前
线下销售复盘难落地,AI 会话设备能帮上啥忙
人工智能·自然语言处理
ebok.5 小时前
国产大模型落地业务系统的优选载体:京微智枢信创 AI 业务支撑平台
大数据·人工智能·低代码·ai
wujian83116 小时前
怎么用文心生成word文档?从格式错乱到智能导出,AI导出鸭让创作再无后顾之忧
人工智能·ai·word·豆包·deepseek·ai导出鸭
动物园猫6 小时前
猪危险行为目标检测数据集:3类别、5,000+张图像 | 目标检测
人工智能·目标检测·计算机视觉
ai产品老杨6 小时前
AI视频分析并发优化完整流程:解决多路视频并发不足与高延迟排查指南
人工智能·音视频
why技术7 小时前
AI 写的文章,可能都带着手敲一遍都去不掉的“隐形水印”。
前端·人工智能·后端
罗西的思考7 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习