之前做深度学习,用的框架一直都是Keras,从科研角度来说,可以基本满足我的需要。Keras的优势在于可以非常快速的实现一个相对简单的深度学习模型,例如深度神经网络、长短期记忆网络、双向长短期记忆网络等。同时Kera对于刚刚接触深度学习的新手是非常友好的,各个模块都进行了相对应的封装,从模型构建,模型编译到模型训练。我们所做的只需要脑海中有一个模型网络图,然后根据这个图对模型进行搭建,并且将输入调整为模型所接受的输入,设置相应的参数,之后点击run,就ok了。
物极必反,Keras对于模块的过度封装带来的缺点也是显而易见的,即对一些非必要封装的层的可操作性不大。随着研究的深入,总觉得用着Keras会有些局限,于是笔者便寻求一个新的深度学习框架满足研究和学习需求。目前常用的深度学习框架有这主要三种:Keras、Tensorflow以及Pytorch。Tensorflow是由Google开源的深度学习框架,目前已经到2.0版本,但是根据其他组对tensorflow的使用经验和经历来看,tensorflow的使用难度以及因版本迭代而带来的代码不可重复使用情况让我对其有些抗拒。Pytorch是由Facebook开源的一款深度学习框架,前一阵子刚发布了1.0版本,目前已经到了1.0.1版本。Pytorch的优势在于能够非常好的支持GPU,简洁,操作性大,对新手友好。同时Pytorch在用户中的口碑也非常的好,因此,根据我的需求,我将Pytorch作为我学习的第二个深度学习框架。
用Pytorch的第一步便是安装Pytorch,网上的教程有很多,但是!真正能解决问题的很少!在安装Pytorch方面,笔者强烈建议从官网下载.whl文件,然后进行安装,如果使用命令行pip install pytorch,会出现报错(具体错误内容忘记了)。
言归正传,这次的任务是对图片情感进行分类,图片数量为2001,情感类别分为正面、负面和中性,正面、负面和中性的数量分别为712、768和512。笔者利用CV2读取图片,并利用resize方法将图片大小调整为(224,224,3),进行归一化,保存至pickle文件。对于标签,笔者用0表示正面,1表示中性,2表示负面,并调整为[0, 1, 0](表示中性),保存至pickle文件。至此,对图片和标签已经完成。下面笔者利用不同的深度学习框架构建CNNs模型并进行相应的比较。
1. 构建CNNs模型
import torch
import torch.utils.data as U
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
#网络构建;
class ConvNet(nn.Module):
def __init__(self):
super().__init__()
#conv2d所接受的参数;
#nn.conv2d(in_channels, out_channels, kernel_size,
# stride= 1, padding= 0, dilation= 1, groups= 1, bias= True)
#224*224*3
self.conv1=nn.Conv2d(3, out_channels= 10, kernel_size= 5)
#110*110*10
self.conv2=nn.Conv2d(10,20,5) # 128, 10x10
#106*106*20
self.fc1 = nn.Linear(106*106*20,1024)
self.fc2 = nn.Linear(1024,3)