文章目录

  • 摘要
  • 一、Mysql(项目)
  • 1.1 数据库基本操作
  • 1.2 数据库的增删查改
  • 1.3 Python操作MySql数据库
  • 二、Pytorch的nn.LSTM层(深度学习)
  • 2.1 nn.RNN层
  • 2.2 nn.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
  1. 显示所有数据库(进入数据库后可输入)
# 查看所有数据库
show databases;
  1. 创建/删除数据库
# 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. 进入数据库/显示数据库内所有表
# 1. 进入数据库
# use <数据库名> #进入数据库

# 2. 显示数据库内所有表
# show tables 显示数据库内所有表
  1. 创建二维表
./ 
 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. 表中添加/删除/修改列
# 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 '性别';
  1. 添加外键约束
# 给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. pytorch 定义LSTM超参数 一般 pytorch的lstm_mysql

  3. 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: 数据库中存储数据的编码方式。

  1. 对数据库进行操作
    首先,获取游标对象:
# 基础版本的获取游标代码
# 获取游标对象
cursor = conn.cursor()
# 用完后关闭游标对象
curson.close()

# 改进版本的获取游标代码
# 使用上下文语句,使用完后自动释放游标对象
with conn.cursor() as cursor:
  1. 用游标对象向数据库服务器发送数据
# 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-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的纬度和输出的纬度。

  1. 猜想验证
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)

pytorch 定义LSTM超参数 一般 pytorch的lstm_python_02

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

2.2 nn.LSTM层

在RNN中,t时刻的输入只受xt的影响。

在LSTM中,t时刻的输入,可以让LSTM自己决定取多少的当前时刻的输入,和多少上一时刻的输出。

pytorch 定义LSTM超参数 一般 pytorch的lstm_数据库_03


所以,在每一时刻的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)

pytorch 定义LSTM超参数 一般 pytorch的lstm_数据库_04

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