神经网络模型以及数据问题
dataset和label可以用TensorDataset来转换为一个可以放入DataLoader的类
permute维度换位,为了适配网络参数输入顺序
解决问题,之前一直用的是torch.Tensor,现在知道tensor也要分类型了,一般图像的数据使用FloatTensor,标签使用LongTensor,这样就不会在计算loss的时候报数据类型的错误了
模型和数据都跑通了,那么接下来的任务就是像mnist那样对数据集进行分割了
参考对mnist数据集分割的代码:
def getDataSetAllocation(dataset_num=200,index=0):
mnistDataSet = GetDataSet('mnist', True)
# 测试集
test_data = torch.tensor(mnistDataSet.test_data)
test_label = torch.argmax(torch.tensor(mnistDataSet.test_label), dim=1)
test_dataset = TensorDataset(test_data, test_label)
# 训练集
train_data = mnistDataSet.train_data
train_label = mnistDataSet.train_label
# 将训练集大小分割为客户端数量
shard_size = mnistDataSet.train_data_size // dataset_num // 2
shards_id = np.random.permutation(mnistDataSet.train_data_size // shard_size)
shards_id1 = shards_id[index * 2]
shards_id2 = shards_id[index * 2 + 1]
data_shards1 = train_data[shards_id1 * shard_size: shards_id1 * shard_size + shard_size]
data_shards2 = train_data[shards_id2 * shard_size: shards_id2 * shard_size + shard_size]
label_shards1 = train_label[shards_id1 * shard_size: shards_id1 * shard_size + shard_size]
label_shards2 = train_label[shards_id2 * shard_size: shards_id2 * shard_size + shard_size]
local_data, local_label = np.vstack((data_shards1, data_shards2)), np.vstack((label_shards1, label_shards2))
local_label = np.argmax(local_label, axis=1)
train_dataset = TensorDataset(torch.tensor(local_data), torch.tensor(local_label))
# 返回类型均为TensorDataset类型,还需要进一步封装入DataLoader
return train_dataset,test_dataset
从model中加载参数
model.load_state_dict(torch.load(model_file_name, map_location=cuda_name))
django与mysql操作
数据库配置
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test1', #数据库名称
'USER': 'user1',
'PASSWORD': 'chy352196487!',
'HOST': 'rm-bp1ocx5t725vc9t85fo.mysql.rds.aliyuncs.com',#数据库地址
'POST': 3306
}
}
接下来是项目目录下的init.py
import pymysql
pymysql.install_as_MySQLdb()
接着把数据库里的表映射到models里面
python manage.py inspectdb>app_name/models.py
文件操作与bytes数据处理
strb = ''
strb = strb.encode()
with open("img/img1.jpg", "rb") as f:
# 循环读取一张图片,一次性读取1024个字节
while True:
strb += f.read(1024)
if strb == b"":
break
接下来尝试使用django往binaryfiled字段存入文件
insert函数
修改原本已经测试 成功的insert函数 尝试访问地址
def insert(request):
# 随机整数 作为学号
# for i in range(0, 5):
# # 从models文件中获取student对象
# hello = Hello()
# # 给对象赋值
# hello.asd = str(i)
# hello.dsa = str(i)
# # 插入数据
# hello.save()
strb = ''
strb = strb.encode()
with open("img/img1.jpg", "rb") as f:
# 循环读取一张图片,一次性读取1024个字节
while True:
a = f.read(1024)
strb += a
if a == b"":
break
fileTest = Filetest()
fileTest.file1 = strb
fileTest.save()
return HttpResponse('数据插入完毕')
结果报了一个文件找不到的错误
尝试打印一下当前目录地址
参考代码:
import sys
print sys.argv[0]#获得的是当前执行脚本的位置(若在命令行执行的该命令,则为空)12
打印结果:
也就是说路径应该是与manage.py处于同一级别的目录下的
在原本基础上加一个app1的路径试试
成功插入!!!
接下来就是研究取出来的问题了
为了便于数据库查询 我给数据库表添加了一项id
当前有一条数据项,是我刚刚添加的文件以及随便写的一个id
在view.py中添加如下代码,并配置路由,访问localhost:8080/find/
即可执行如下代码
find函数
def find(request):
#sql = 'select * from student'
# django 也可以执行原生的sql语句
#result = Student.objects.raw(sql)
# 查询name = tom1的数据
# result = Student.objects.filter(name='tom1')
result = Asd.objects.filter(id=1)
"""
result为<class 'django.db.models.query.QuerySet'>的对象
需要进行数据处理
"""
arr = []
for i in result:
content = {'文件': i.file, 'ID': i.id}
arr.append(content)
#把i.file1字节流写入新的文件f2
with open("app1/img/img1_copy.jpg", "wb") as f2:
f2.write(i.file)
print(arr)
print(type(arr))
return HttpResponse('数据下载完毕')
通过debug可以看到在循环i中获取到的file1属性是一个字节流bytes类型,接下来我们就拿它开刀,将字节流写入某个位置
在find函数中添加写入文件的部分
成功!!!
使用save来update看
k = Example.objects.get(id=481)
k.total_calories = 12
k.save()
非django下的操作
目前已解决django和mysql的文件存取问题,但是由于聚合端并未使用django,所以再接着研究一下如何在非jango框架下进行文件存取操作
#此处为取操作
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', db='django', password='chy352196487')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select * from filetest")
rows = cursor.fetchall()
sql语法
需要使用原生sql(放一张图免得忘记怎么写)
示例
update
from pymysql import *
def main():
# 创建connection连接
conn = connect(host='', port=3306, database='', user='',
password='', charset='utf8')
# 获取cursor对象
cs1 = conn.cursor()
# 执行sql语句
query = "update 表名 set 字段1 = 值1 where 字段2 = '{}'".format(值2)
cs1.execute(query)
# 提交之前的操作,如果之前已经执行多次的execute,那么就都进行提交
conn.commit()
# 关闭cursor对象
cs1.close()
# 关闭connection对象
conn.close()
if __name__ == '__main__':
main()
通过debug可以看出取出来的rows里面也能获取到文件的字节流,这就和前面的模块联系起来了
Pymyql模块的execute()总结
python写法
#! python3
# @Project: mysite - sqlhelper.py
# @Info : 提取sql的基本方法
import pymysql
def get_connection():
"""连接数据库"""
# 连接数据库
connect = pymysql.Connect(
host='localhost',
port=3306,
user='root',
passwd='123456',
db='test1',
charset='utf8'
)
# 获取游标(指定获取的数据格式,这里设定返回dict格式)
return connect, connect.cursor(cursor=pymysql.cursors.DictCursor)
def select_all(sql, args=None):
"""查询所有"""
conn, cursor = get_connection()
cursor.execute(sql, args)
results = cursor.fetchall()
cursor.close()
conn.close()
return results
def select_one(sql, args):
"""查询一个"""
conn, cursor = get_connection()
cursor.execute(sql, args)
result = cursor.fetchone()
cursor.close()
conn.close()
return result
def update(sql, args):
"""修改数据"""
conn, cursor = get_connection()
cursor.execute(sql, args)
conn.commit()
cursor.close()
conn.close()
def create(sql, args):
"""新增数据"""
conn, cursor = get_connection()
cursor.execute(sql, args)
conn.commit()
cursor.close()
conn.close()
def delete(sql, args):
"""删除数据"""
conn, cursor = get_connection()
cursor.execute(sql, args)
conn.commit()
cursor.close()
conn.close()
sql写法
insert into teacher(name) values (%s) 正确
官方文档
模块化
接下来是模块化的工作,这里定义一下需要模块化的功能
1、输入字节流,存入到path中文件
2、输入文件path,获取字节流
def get_bytes_from_path(path):
strb = ''
strb = strb.encode()
with open(path, "rb") as f:
# 循环读取一张图片,一次性读取1024个字节
while True:
strb += f.read(1024)
if strb == b"":
break
return strb
3、输入path,更新数据库文件
def update_db_model2(path):
file = get_bytes_from_path(path)
k = Asd.objects.get(id=1)
k.file = file
k.save()
4、根据id从数据库获取model文件并加载到模型上
format函数用法
print('{我}今天{action}'.format(我='拦路雨',action ='在写博客')) # 通过关键字
购买阿里云MysqlRDS服务后也在远程连接上测试成功
Django模板(环境移植)问题:
pip install django-bootstrap3
套用到目前已有的框架上
每次得到聚合端返回后对数据库中的model进行更新,默认id为1
首先是在现有框架上配置数据库
当前进度
在原有项目框架下,django后端与数据库的文件已交互完成