WDK学习笔记_Python操作MySql+Pytorch的LSTM使用

摘要

  1. 项目:学习了MySql数据库sql语句的使用,并用Python对MySql数据库进行了增删查改等基本操作。用学到的知识改善了爬虫脚本,实现了将爬取的数据存储在MySql数据库中的功能。还未完成将数据从数据中导出为Excel表的功能。
  2. 深度学习研究:学习了pytorch框架中nn.RNN,nn.LSTM的详细原理,并掌握了如何使用。以LSTM为例,如输入数据为(7, 4, 10),该数据的具体含义为,有4个检测站点,每个站点有7个单位时间的数据(7个时间戳),每个站点单位时间的数据用10维向量表示;训练过程是,按时间顺序,将数据输入,若hiddle的size为5,则记忆单元C的size为(1, 4, 5),h的size为(1,4,5),输出的size为(7,4,5)。
  3. 文献:无
  4. 本科毕设:顺利完成了开题答辩

一、Mysql(项目)

1.1 数据库基本操作

  1. 连接数据库服务器(命令行窗口输入)

    # 1. 可连接本地数据库服务器
    mysql -u root -p 
    
    # 2. 远程连接数据库服务器
    # mysql -u root -h <远端服务器ip> -p 
    # 例如:
    mysql -u root -h 192.1.1.1 -p
    
  2. 显示所有数据库(进入数据库后可输入)

    # 查看所有数据库
    show databases; 
    
  3. 创建/删除数据库

    # 1. 创建数据库
    # create database <数据库名> default charset <编码方式>;
    # 例如:
    create database school default charset utf8mb4;
    
    # 2. 删除数据库
    # drop database <数据库名>
    # 例如:
    drop database school
    
    # 3. 查看创建数据库的过程
    # show create database <数据库名>
    # 例如:
    show database school
    
  4. 进入数据库/显示数据库内所有表

    # 1. 进入数据库
    # use <数据库名> #进入数据库
    
    # 2. 显示数据库内所有表
    # show tables 显示数据库内所有表
    
  5. 创建二维表

    ./ 
     create table <表名> (
     	<列名> <数据类型> <约束> comment <'注释'>, 
     	..., 
    	primary key (<列名>)
     )engine=<建表引擎> comment <'注释'>
     ./
     例如:
    create table tb_student
    (
    	stu_id int unsigned not null comment '学号', 
    	stu_name varchar(20) not null comment '姓名',
    	stu_sex boolean default 1 comment '性别',
    	stu_birth date comment '出生日期',
    	primary key (stu_id)
    )engine=innodb comment '学生表';
    
  6. 表中添加/删除/修改列

    # 1. 添加列
    # alter table <表名> add colum <列名> <建列语句>;
    # 例如:
    alter table tb_student add column stu_addr vatchar(50) default "";
    
    # 2. 删除列
    # alter table <表名> drop column <列名>;
    # 例如:
    alter table tb_student drop column stu_addr;
    
    # 3. 修改列
    # alter table <表名> <change/modify> column <列名> <建列语句>;
    # 例如(修改列名):
    alter table tb_student change column stu_sex stu_gender boolean default 1 comment '性别';
    # 例如(修改列的数据类型):
    alter table tb_student modify column stu_sex char(1) default '男' comment '性别';
    
  7. 添加外键约束

    # 给tb_student表添加外键约束,约束名叫`fk_student_col_id`,参考表tb_college(col_id)
    alter table tb_student add constraint fk_student_col_id 
    foreign key (stu_col_id) references tb_college(col_id);
    

1.2 数据库的增删查改

sql语句使用方式变化较灵活,所以不在此详述了,附上在线练习sql语句的网站链接,及sql语句的基本操作链接。

  1. Sql语句自学网(非常好)
    下图红色处,可写入sql语句。
    在这里插入图片描述

  2. MySql增删查改

1.3 Python操作MySql数据库

在此使用的是python中的pymysql包,来实现对MySql数据库的操作。默认已安装MySql数据库,并已经启动MySql服务。

  1. 连接数据库

    # 连接数据库,返回一个实例化的可以对特定数据库进行操作的对象.
    conn = pymysql.connect( host='localhost', 
    						port=3306,
    						user='root', 
    						password='123456',
    						database='demo',
    						charset='utf8mb4')
    

    host: 数据库ip地址,localhost代表本机的ip地址。
    port: 数据库服务器的端口号。
    user: 数据库服务器登录用户名。
    password: 数据库服务器登录密码。
    database: 数据库名。
    charset: 数据库中存储数据的编码方式。

  2. 对数据库进行操作
    首先,获取游标对象:

    # 基础版本的获取游标代码
    # 获取游标对象
    cursor = conn.cursor()
    # 用完后关闭游标对象
    curson.close()
    
    # 改进版本的获取游标代码
    # 使用上下文语句,使用完后自动释放游标对象
    with conn.cursor() as cursor:
    
    
  3. 用游标对象向数据库服务器发送数据

    # cursor.execute('<任何数据库语句>')
    # 例如:
    # 创建一个名为test的数据库
    cursor.execute('create database test;')
    

二、Pytorch的nn.LSTM层(深度学习)

2.1 nn.RNN层

  1. RNN原理:
    ht为记忆单元,t时刻的记忆单元值ht=tanh(ht-1 Whh+ xtWxh),(ht-1为t-1时刻记忆单元的值,xt为t时刻的输入); t时刻的输出yt = Whyht
    (如下图)
    在这里插入图片描述

  2. 提出猜想
    所以,对于RNN中,我们有一个外部的输入xt,两个输出ht和yt。它们之间的维度存在着什么关系呢?在Pytorch中RNN的计算公式为ht=tanh(ht-1Whh T+ xtWihT),而tanh不影响纬度,为了便于分析,可以写为ht-1=Whh T+ xtWihT当输入纬度为(2, 10)时,若hiddle的规格取5,则Wih的纬度为(5,10),则 Wxhxt的纬度为(2,5),ht-1纬度为(2,5),Whh纬度为(5,5)。
    用pytorch构建RNN模型:

    rnn = nn.RNN(input_size=50, hidden_size=20)
    

    若搭建以上model,可以知道输入xt为纬度为(a,50),hidden_size=20,则Wih的纬度为(20,50),ht-1的规格为(a, 20),Whh规格为(20,20)。于是我们可以得出结论,受输入x的纬度中a影响的只有h的纬度和输出的纬度。

  3. 猜想验证

    import torch
    import torch.nn as nn
    rnn = nn.RNN(input_size=50, hidden_size=20)
    x = torch.ones(1, 4, 50)
    out, h = rnn(x)
    print("输入的规格: ", x.shape)
    print("Wih的规格: ", rnn.weight_ih_l0.shape)
    print("ht-1的规格: ", h.shape)
    print("Whh的规格: ", rnn.weight_hh_l0.shape)
    print("输出的规格", out.shape)
    

    在这里插入图片描述

  4. 提出猜想2
    输入(1, 4, 50)代表的意义是总共4个句子,每个句子丢入1个单词到RNN中(时序为1),每个单词用50维的向量表示。当我们丢入时序为5的话,输入为(5,4,50),若每个时序有一个输出,那此时的输出规格应该为(5,4,20),而h的规格和时序应当没关系,h的规格应该仍为(1,4,50)。

  5. 猜想验证2
    在这里插入图片描述

2.2 nn.LSTM层

在RNN中,t时刻的输入只受xt的影响。
在LSTM中,t时刻的输入,可以让LSTM自己决定取多少的当前时刻的输入,和多少上一时刻的输出。
在这里插入图片描述
所以,在每一时刻的LSTM中,外部输入有一个xt,输出有记忆单元的输出Ct(RNN中叫ht),传到下一时刻的输出ht,和直接的输出yt(注意:ht=yt)。
于是,其中Ct就相当于RNN中的ht,ht相当于RNN中单层的输出,其纬度和Ct一样。所以在LSTM中,构建如下model:

lstm = nn.LSTM(input_size=50, hidden_size=20)
  1. 提出猜想
    若我们的输入是(1, 4, 50),那么按照分析RNN的逻辑,c的规格应当为(1,4,20),h的规格应该为(1,4,20),输出的规格为(1,4,20)

  2. 猜想验证

    import torch
    import torch.nn as nn
    from torch import nn
    x = torch.ones([1, 4, 50])
    lstm = nn.LSTM(input_size=50, hidden_size=20)
    out, (h, c) = lstm(x)
    
    print("输入的规格: ", x.shape)
    print("c的规格: ", c.shape)
    print("h的规格: ", h.shape)
    print("输出的规格", out.shape)
    

    在这里插入图片描述

  3. 提出猜想2
    那么当输入为(4, 4, 50), 此时输入含义为有4个句子,每个句子丢入四个词(时序为4)到LSTM中,每个词用50维向量表示,此时c的规格应当为(1,4,20),h的规格应该为(1,4,20),输出的规格为(4,4,20)。

  4. 猜想验证2
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sunningzhzh/article/details/121864842