文章目录
- 摘要
- 一、Mysql(项目)
- 1.1 数据库基本操作
- 1.2 数据库的增删查改
- 1.3 Python操作MySql数据库
- 二、Pytorch的nn.LSTM层(深度学习)
- 2.1 nn.RNN层
- 2.2 nn.LSTM层
摘要
- 项目:学习了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语句的基本操作链接。
- Sql语句自学网(非常好)
下图红色处,可写入sql语句。 - MySql增删查改
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-1WhhT+ xtWihT),而tanh不影响纬度,为了便于分析,可以写为ht-1=WhhT+ 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