前言
其他所有部分同上一篇AlexNet一样,所以就不再赘诉,直接看VGG搭建部分。
模型
VGG是第一个采取块进行模块化搭建的模型。
def vgg_block(num_convs,in_channels,out_channels):layers=[]for _ in range(num_convs):layers.append(nn.Conv2d(in_channels,out_channels,kernel_size=3,padding=1))layers.append(nn.ReLU())in_channels=out_channelslayers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)
可选择几个卷积之后再做池化,将这个做为一个块,在模型中多次使用。
conv_arch=((1,64),(1,128),(2,256),(2,512),(2,512))
def vgg(conv_arch):conv_blks=[]in_channels=len(frames_len)for (num_convs,out_channels) in conv_arch:conv_blks.append(vgg_block(num_convs,in_channels,out_channels))in_channels=out_channelsreturn nn.Sequential(*conv_blks,nn.Flatten(),nn.Linear(out_channels*7*7,4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(4096,len(labels))
net=vgg(conv_arch).to_device(device)#cuda
直接跟AlexNet模型替换就能使用。
简单来看一下这个模型,先做两次一个卷积外加一个池化,再做两次两个卷积外加一个池化,将整个网络的深度提升了很多。
结果
刚跑完,todesk就连接不上电脑了,所以就口述一下结果吧。
在上一次的10分类下,test的acc提高了20%左右,并且在增大frames_len的情况下,train的acc为100%,test的acc提升至90%,似乎是有捕获到视频的分类。
在100分类下的效果也还可以,train达到99.75%,test达到71%。
整体来看,VGG对于手语视频的分类是具有一定的效果的,对于其中的特征确实学习到了东西。