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

项目简介:

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

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

LSTM层: units=100, activation=relu

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

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

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

python 复制代码
# ===================================================================
# 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应用程序开发"这一串字符小于二十, 模型无法完成一次正常的截取, 当然会报错

作者的备注:

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

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

原谅我

相关推荐
Oneforlove_twoforjob12 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
engchina28 分钟前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
向宇it29 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
诚丞成1 小时前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
Smile灬凉城6661 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
lsx2024061 小时前
SQL MID()
开发语言
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶1 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
鸿蒙自习室1 小时前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库