深度学习-循环神经网络-LSTM对序列数据进行预测

 项目简介:

使用LSTM模型, 对文本数据进行预测, 

每次截取字符20, 对第二十一个字符进行预测, 

LSTM层: units=100, activation=relu

Dense层: units=输入的文本中的字符种类, 比如我使用的文本有644个不同的字符, 那么units=64

                激活函数: 因为是多分类, 使用softmax

                因为这是最后一层, 所以输出神经元的个数也就是644

# ===================================================================
# 1.数据导入和数据预处理
# 读入数据
txt_data= open(r"C:\Users\鹰\Desktop\AI Assistant.txt", encoding='utf-8').read()
# 数据预处理

# 移除换行符
txt_data=txt_data.replace('\n','').replace('\r','').replace('#', '').replace('*','').replace('=','').replace('-','')
# print(txt_data)
# 字符去重
letters = list(set(txt_data))
# print(letters)
letters_num=len(letters)
# print(letters_num)

# 建立字典,让字符与数字对应
# 话说int_to_char这个字典是干嘛的, 到底没看出
int_to_char={a:b for a,b in enumerate(letters)}
# print(int_to_char)

char_to_int={b:a for a,b in enumerate(letters)}
# print(char_to_int)


# 设定time_step=20, 就是每次在文本中截取的字符长度为20, 然后预测第二十一个
time_step=20

# 滑动窗口提取数据--对字符数据进行截取转成列表给x, 将预测数据给y
def extract_char(data, slide):
    x=[]
    y=[]
    for i in range(len(data)-slide):
        x.append([a for a in data[i:i+slide]])
        y.append(data[i+slide])
    return x, y
    
# 批量转化--将字符转化为数字
def char_to_int_data(x, y, char_to_int_dict):
    x_to_int=[]
    y_to_int=[]
    for i in range(len(x)):
        x_to_int.append([char_to_int_dict[char] for char in x[i]])
        y_to_int.append(char_to_int_dict[y[i]])
    return x_to_int, y_to_int

# 实现文章的预处理, 参数--1.要处理的字符数据, 2.每次截取的字符长度, 3.进行转化的信息交换字典
def data_preprocessing(data, slide, letters_num, char_to_int_dict):
    # 提取滑动窗口数据
    char_data = extract_char(data, slide)
    int_data = char_to_int_data(char_data[0], char_data[1], char_to_int_dict)
    
    input_data = int_data[0]
    output_data = int_data[1]
    
    # 转换成 one-hot 编码
    input_reshape = np.array(input_data).reshape(len(input_data), slide)
    new = np.zeros((input_reshape.shape[0], input_reshape.shape[1], letters_num), dtype=bool)  # 使用 bool
    
    for i in range(input_reshape.shape[0]):
        new[i, :, :] = to_categorical(input_reshape[i, :], num_classes=letters_num)
    
    # 将布尔值转换为 0 和 1
    new = new.astype(int)
    
    return new, output_data

# 调用函数
x,y= data_preprocessing(txt_data, time_step, letters_num, char_to_int)

print(x.shape)
print(x[0])
print(len(y))

#数据集分割
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test=train_test_split(x, y, test_size=0.1, random_state=10)

# 对训练集目标值转化为one-hot格式
y_train_category=to_categorical(y_train, letters_num)
print(y_train_category)
# ===================================================================================
# 2.模型搭建和模型训练
# 搭建模型
from keras.models import Sequential
LSTM_model=Sequential()
from keras.layers import LSTM, Dense
# 一会要不要调整一下神经元数量? 
LSTM_model.add(LSTM(units=100, input_shape=(x_train.shape[1], x_train.shape[2]), activation='relu'))
LSTM_model.add(Dense(units=letters_num, activation='softmax'))
LSTM_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
LSTM_model.summary()

# 训练模型
LSTM_model.fit(x_train, y_train_category, epochs=50, batch_size=64)

# ===========================================================================
# 3.基于训练集和测试集进行预测和评估
# 训练集预测+评估
y_predict_base_train=LSTM_model.predict(x_train)
y_predict_base_train=np.argmax(y_predict_base_train, axis=1)
# 以数值类型输出预测结果
# print(y_predict_base_train)
y_predict_base_train_char=[int_to_char[i] for i in y_predict_base_train]
# 以字符类型输出结果
print(y_predict_base_test_char)
# 计算模型预测准确率
from sklearn.metrics import accuracy_score
accuracy_score=accuracy_score(y_train, y_predict_base_train)
print("accuracy is ", accuracy_score)

# 测试集预测+评估
y_predict_base_test=LSTM_model.predict(x_test)
y_predict_base_test=np.argmax(y_predict_base_test, axis=1)
# 以数值类型输出预测结果
# print(y_predict_base_test)

y_predict_base_test_char=[int_to_char[i] for i in y_predict_base_test]
# 以字符类型输出结果
# print(y_predict_base_test_char)

# 计算模型预测准确率
from sklearn.metrics import accuracy_score
accuracy_score=accuracy_score(y_test, y_predict_base_test)
print("accuracy is ", accuracy_score)


# 课外实践, ===========================================================================
# 4.实战预测: 输入"怎么样开发一个ai助手, 可以根据我提出的需求自动进行进行开发网站, 移动端app, 桌面应用程序,可以进行数据获取, 数据分析", 看看效果

x_new="怎么样开发一个ai助手, 可以根据我提出的需求自动进行进行开发网站, 移动端app, 桌面应用程序,可以进行数据获取, 数据分析"
x_new, y_new= data_preprocessing(x_new, time_step, letters_num, char_to_int)
y_new_predict=LSTM_model.predict(x_new)
y_new_predict=np.argmax(y_new_predict, axis=1)
y_new_char=[int_to_char[i] for i in y_new]
print(y_new_char)
y_new_predict_char=[int_to_char[i] for i in y_new_predict]
print(y_new_predict_char)

# 计算模型准确率
from sklearn.metrics import accuracy_score
accuracy_score=accuracy_score(y_new, y_new_predict)
print("accuracy is ", accuracy_score)


# 注意哈, 原来的实战目标是输入"ai应用程序开发", 结果报错了, 因为这个模型之前规定time_step=20, 而"ai应用程序开发"这一串字符小于二十, 模型无法完成一次正常的截取, 当然会报错

作者的备注:

兄弟, 不是不想给你们准备数据集,

而是这个文件里面的数据对我用处很大,

原谅我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

已解决 django.db.utils.OperationalError: (1051, “Unknown table

报错信息: django.db.utils.OperationalError: (1051, "Unknown table bjybolg.tool_submission")python manage.py migrate --fake 命令用于告诉 Django 假装已经应用某个迁移,而不实际执行该迁移的操作。这通常在以下情况下非常有用&#x…

【大模型理论篇】大模型压缩技术之注意力层剪枝以及与MLP层联合剪枝

1. 背景分析 本来打算写一篇关于大模型蒸馏的文章,但刚好看到近期发表的一篇讨论大模型压缩的文章【1】,是关于注意力机制冗余性的讨论,比较有意思,作者分析得出并不是所有的注意力都是必须的,可以通过对模型去除冗余的…

鸿蒙中富文本编辑与展示

富文本在鸿蒙系统如何展示和编辑的?在文章开头我们提出这个疑问,带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容,在日常App 中非常常见,比如微博的发布与展示,朋友圈的发布与展示,都在使用富文…

Elasticsearch 中的高效按位匹配

作者:来自 Elastic Alexander Marquardt 探索在 Elasticsearch 中编码和匹配二进制数据的六种方法,包括术语编码(我喜欢的方法)、布尔编码、稀疏位位置编码、具有精确匹配的整数编码、具有脚本按位匹配的整数编码以及使用 ESQL 进…

Maven 不同环境灵活构建

需求: 使用 Maven根据不同的构建环境(如开发、测试、生产)来定义不同的配置,实现灵活的构建管理。 需要Demo项目的可以参考:我的demo项目 一、项目分层 一般的初创项目不会有特别多的配置文件,所以使用 spring.profile…

【333基于Java Web的考编论坛网站的设计与实现

毕 业 设 计(论 文) 考编论坛网站设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计…

linux下gpio模拟spi三线时序

目录 前言一、配置内容二、驱动代码实现三、总结 前言 本笔记总结linux下使用gpio模拟spi时序的方法,基于arm64架构的一个SOC,linux内核版本为linux5.10.xxx,以驱动三线spi(时钟线sclk,片选cs,sdata数据读和写使用同一…

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目: 样例: 可以看见,唯一特殊的就…

SCI被「On Hold」意味着什么?会有哪些影响?

本文首发于“生态学者”微信公众号! 继Chemosphere在2023年7月被「On Hold」之后,昨晚Science of The Total Environment 被标记为「On Hold」状态在各大公众号和朋友圈被刷屏!(官方网址:https://mjl.clarivate.com/s…

PouchDB - 免费开源的 JavaScript 数据库,轻量易用,用于离线保存数据的场景

这个 JS 工具库可以让我们很容易地实现数据缓存到本地的需求,要写的代码量也很少。 PouchDB 是一个基于 JavaScript 语言开发的轻量级的数据库,可以在浏览器、Node.js 等环境中使用。作者是一位来自国外的女开发工程师 Alba Herreras。 这是一个运行在浏…

el-datepicker禁用未来日期(包含时分秒)type=‘datetime’

文章目录 实现代码方式1:当选中日期的时候去更新一次。方式2: 优化版本,使用 setTimout 每分钟更新一次。(防止选中日期之后过了很久再去选择时分秒时没有根据当前时间去改变) el-datepicker 选择器禁用未来日期,动态禁…

重生之“我打数据结构,真的假的?”--2.单链表(无习题)

C语言中的单链表总结 单链表是一种基础的数据结构,广泛应用于C语言编程中。它由节点组成,每个节点包含数据和指向下一个节点的指针。单链表的优点在于动态内存分配和高效的插入与删除操作。本文将详细探讨单链表的定义、基本操作、应用场景以及相关示例…

Gateway 统一网关

一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问,但有些业务不是对外公开的,这就需要用网关来统一替我们筛选请求,它就像是房间的一道门,想进入房间就必须经过门。而请求想要访问微服务,就必须…

ComfyUI系列——新手安装ComfyUI,就是这么简单

比较Midjoury、WebUI和ComfyUI 在了解ComfyUI的时候,还有其它两款类似的产品,于是就搜集了一下资料,以下是Midjoury、WebUI(通常指的是Stable Diffusion Web UI)和ComfyUI三者之间的异同点对比表。 特性MidjourneySt…

国内短剧系统源码搭建系统平台小程序新玩法

在数字化内容消费日益普及的今天,短剧小程序作为一种新兴的内容平台,其功能设计至关重要。一个好的短句系统不仅需要提供优质的内容展示,还需要具备一系列优秀功能以满足用户和运营者的需求。以下是一些必备的功能特点: 为大家介…

WebGL 添加背景图

1. 纹理坐标(st坐标)简介 ST纹理坐标(也称为UV坐标)是一种二维坐标系统,用于在三维模型的表面上精确地定位二维纹理图像。这种坐标系统通常将纹理的左下角映射到(0,0),而右上角映射到(1,1)。 S坐标&#x…

leetcode_128:最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4 解…

CSS揭秘:7. 伪随机背景

前置知识:CSS 渐变,5. 条纹背景,6. 复杂的背景图案 前言 本篇主要内容依然是关于背景的,无限平铺的背景会显得整齐美观,但又有些呆板,如何实现背景的多样性和随机性,是本篇的核心。 一、四种颜…

AI周报(10.20-10.26)

AI应用-牙科AI产品Pearl Pearl是一家致力于改善牙科患者护理的人工智能驱动型公司,推出了首款获得美国食品药品监督管理局(FDA)批准的人工智能,能够读取牙科X光片并即时识别疾病。今年7月获得5800万美元的B轮融资,以加…

GESP一级真题分析-202303-选择题1-输入输出设备、存储单位、默认数据类型、标识符命名

PDF文档回复:20241026 1 相关知识点 1) 输入输出设备 输入设备 是外界向计算机传送信息的装置。在微型计算机系统中,最常用的输入设备是键盘和鼠标。 此外还有电子光笔、数字化仪、图形扫描仪、触摸屏、麦克风、视频输入设备、条形码扫描等 输出设备 作用是将计…