文章目录
摘要
- 项目:学习了MySql数据库sql语句的使用,并用Python对MySql数据库进行了增删查改等基本操作。用学到的知识改善了爬虫脚本,实现了将爬取的数据存储在MySql数据库中的功能。还未完成将数据从数据中导出为Excel表的功能。
- 深度学习研究:学习了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)。
- 文献:无
- 本科毕设:顺利完成了开题答辩
一、Mysql(项目)
1.1 数据库基本操作
-
连接数据库服务器(命令行窗口输入)
# 1. 可连接本地数据库服务器 mysql -u root -p # 2. 远程连接数据库服务器 # mysql -u root -h <远端服务器ip> -p # 例如: mysql -u root -h 192.1.1.1 -p
-
显示所有数据库(进入数据库后可输入)
# 查看所有数据库 show databases;
-
创建/删除数据库
# 1. 创建数据库 # create database <数据库名> default charset <编码方式>; # 例如: create database school default charset utf8mb4; # 2. 删除数据库 # drop database <数据库名> # 例如: drop database school # 3. 查看创建数据库的过程 # show create database <数据库名> # 例如: show database school
-
进入数据库/显示数据库内所有表
# 1. 进入数据库 # use <数据库名> #进入数据库 # 2. 显示数据库内所有表 # show tables 显示数据库内所有表
-
创建二维表
./ 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 '学生表';
-
表中添加/删除/修改列
# 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 '性别';
-
添加外键约束
# 给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.3 Python操作MySql数据库
在此使用的是python中的pymysql包,来实现对MySql数据库的操作。默认已安装MySql数据库,并已经启动MySql服务。
-
连接数据库
# 连接数据库,返回一个实例化的可以对特定数据库进行操作的对象. conn = pymysql.connect( host='localhost', port=3306, user='root', password='123456', database='demo', charset='utf8mb4')
host: 数据库ip地址,localhost代表本机的ip地址。
port: 数据库服务器的端口号。
user: 数据库服务器登录用户名。
password: 数据库服务器登录密码。
database: 数据库名。
charset: 数据库中存储数据的编码方式。 -
对数据库进行操作
首先,获取游标对象:# 基础版本的获取游标代码 # 获取游标对象 cursor = conn.cursor() # 用完后关闭游标对象 curson.close() # 改进版本的获取游标代码 # 使用上下文语句,使用完后自动释放游标对象 with conn.cursor() as cursor:
-
用游标对象向数据库服务器发送数据
# cursor.execute('<任何数据库语句>') # 例如: # 创建一个名为test的数据库 cursor.execute('create database test;')
二、Pytorch的nn.LSTM层(深度学习)
2.1 nn.RNN层
-
RNN原理:
ht为记忆单元,t时刻的记忆单元值ht=tanh(ht-1 Whh+ xtWxh),(ht-1为t-1时刻记忆单元的值,xt为t时刻的输入); t时刻的输出yt = Whyht。
(如下图)
-
提出猜想
所以,对于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的纬度和输出的纬度。
-
猜想验证
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)
-
提出猜想2
输入(1, 4, 50)代表的意义是总共4个句子,每个句子丢入1个单词到RNN中(时序为1),每个单词用50维的向量表示。当我们丢入时序为5的话,输入为(5,4,50),若每个时序有一个输出,那此时的输出规格应该为(5,4,20),而h的规格和时序应当没关系,h的规格应该仍为(1,4,50)。 -
猜想验证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, 4, 50),那么按照分析RNN的逻辑,c的规格应当为(1,4,20),h的规格应该为(1,4,20),输出的规格为(1,4,20) -
猜想验证
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)
-
提出猜想2
那么当输入为(4, 4, 50), 此时输入含义为有4个句子,每个句子丢入四个词(时序为4)到LSTM中,每个词用50维向量表示,此时c的规格应当为(1,4,20),h的规格应该为(1,4,20),输出的规格为(4,4,20)。 -
猜想验证2