本周我初步使用了flask框架,将python的深度学习算法部署到web网页中。实现了前端与后端的分离。用户在上传图片后flask框架会把图片的信息传递给后端,由后端的图像识别算法进行图片的识别,然后再将作者及有关信息显示在网页上。
根据ResNet50网络的结构图,参考开源代码,完成了网络构建,根据已有的10位作家的作品集完成了模型的训练,得到了较好的识别准确率。
DataLoader是Pytorch中用来处理模型输入数据的一个工具类。组合了数据集(dataset)+采样器(sampler),并在数据集上提供单线程或多线程(num_workers)的可迭代对象。在DataLoader中有多个参数,这些参数中重要的几个参数的含义说明如下:
\1. epoch:所有的训练样本输入到模型中称为一个epoch;
\2. iteration:一批样本输入到模型中,成为一个Iteration;
\3. batchszie:批大小,决定一个epoch有多少个Iteration;
\4. 迭代次数(iteration)=样本总数(epoch)/批尺寸(batchszie)
\5. dataset (Dataset) – 决定数据从哪读取或者从何读取;
\6. batch_size (python:int, optional) – 批尺寸(每次训练样本个数,默认为1)
\7. shuffle (bool, optional) –每一个 epoch是否为乱序 (default: False);
\8. num_workers (python:int, optional) – 是否多进程读取数据(默认为0);
\9. drop_last (bool, optional) – 当样本数不能被batchsize整除时,最后一批数据是否舍弃(default: False)
\10. pin_memory(bool, optional) - 如果为True会将数据放置到GPU上去(默认为false)
transforms.Resize(size):将图片的短边缩放成size的比例,然后长边也跟着缩放,使得缩放后的图片相对于原图的长宽比不变。
transforms.RandomResizedCrop(size):将原图片随机裁剪出一块,再缩放成相应 (size*size) 的比例
transforms.RandomHorizontalFlip():水平方向上随机翻转
train loss和test loss的关系与作用
train loss 不断下降,test loss不断下降,说明网络仍在学习;(最好的)
train loss 不断下降,test loss趋于不变,说明网络过拟合;(max pool或者正则化)
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;(检查dataset)
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;(减少学习率)
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。(最不好的情况)
检查flask框架中有没有Bug,同时测试一下数据由前端传递给后端后对识别准确率有没有影响。
实现对ART数据集49位画家的画作分类,只需调整参数即可;尝试采用其他网络模型或者检查网络模型的问题,以提高准确率
当前采用的网络准确率在85%-90%之间,似乎并不够高
通过实践,我了解了前后端分离的概念。前后端分离就是把数据操作和显示分离出来。前端专注做数据显示,通过文字,图片或者图标等方式让数据形象直观的显示出来。后端专注做数据的操作。前端把数据发给后端,有后端对数据进行修改.后端提供接口给前端调用,来触发后端对数据的操作。
深入了解了resnet50网络模型的结构并根据资料进行了模型组网,完成了网络的实现并得到了不错的识别准确率,也了解了许多其他网络模型,包括一些复杂网络,如densenet201。通过这次实验,我对神经网络模型尤其是经典的resnet50有了较好地理解。
代码:(网络模型)
#卷积层2(包括卷积,池化,激活)
layer_conv2 = create_convolutional_layer(input=layer_conv1,
num_input_channels=num_filters_conv1,
conv_filter_size=filter_size_conv2,
num_filters=num_filters_conv2)
#卷积层3(包括卷积,池化,激活)
layer_conv3= create_convolutional_layer(input=layer_conv2,
num_input_channels=num_filters_conv2,
conv_filter_size=filter_size_conv3,
num_filters=num_filters_conv3)
#把上面三个卷积层处理后的结果转化为一维向量,提供给全连层
layer_flat = create_flatten_layer(layer_conv3)
#全连接层1
layer_fc1 = create_fc_layer(input=layer_flat,
num_inputs=layer_flat.get_shape()[1:4].num_elements(),
num_outputs=fc_layer_size,
use_relu=True)
#全连接层2
layer_fc2 = create_fc_layer(input=layer_fc1,
num_inputs=fc_layer_size,
num_outputs=num_classes,
use_relu=False)
在本次项目中,虽然我参与编写的部分不多,但是在之前的相关学习中我也了解了很多有关这个项目的其他很多知识。我负责的部分,虽然是整个项目最简单的部分,但是做起来还是有很多问题,从一开始的平台搭建到后面的具体代码书写,一路走来总是磕磕绊绊,但是还好网络中有许多学习资源,对照着网上的教程一点点开始最后还是完成了,看着自己一点点“画”出来的网页,心中还是满感慨的,从这节课的开始到现在也确确实实学到了东西,也对软件工程这门课有了更深入的了解和感悟。
每运行一次程序需要很长时间,调试起来很麻烦