# 深度学习100例 | 第2例：人脸表情识别 – PyTorch实现

PyTorch VS TensorFlow

• TensorFlow：简单，模块封装比较好， 容易上手，对新手比较友好。在工业界最重要的是模型落地，目前国内的大部分企业支持TensorFlow模型在线部署，不支持Pytorch。
• PyTorch前沿算法多为PyTorch版本，如果是你高校学生or研究人员，建议学这个。相对于TensorFlow，Pytorch在易用性上更有优势，更加方便调试。

[En]

Of course, if you have plenty of time, I suggest that both models need to be understood, both of which are important.

### 文章目录

🍖 我的环境：

• 语言环境：Python3.8
• 编译器：Jupyter Lab
• 深度学习环境：
• torch==1.10.0+cu113
• torchvision==0.11.1+cu113

## 一、导入数据

from torchvision.datasets   import CIFAR10
from torchvision.transforms import transforms
from torch.utils.data       import DataLoader
from torchvision            import datasets
from torch.optim            import Adam
import torchvision.models   as models
import torch.nn.functional  as F
import torch.nn             as nn
import torch,torchvision
train_datadir = './2-Emotion_Images/train/'
test_datadir  = './2-Emotion_Images/test/'

train_transforms = transforms.Compose([
transforms.Resize([48, 48]),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])

test_transforms = transforms.Compose([
transforms.Resize([48, 48]),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])

train_data = datasets.ImageFolder(train_datadir,transform=train_transforms)

test_data  = datasets.ImageFolder(test_datadir,transform=test_transforms)

train_loader = torch.utils.data.DataLoader(train_data,
batch_size=16,
shuffle=True,
num_workers=1)
test_loader  = torch.utils.data.DataLoader(test_data,
batch_size=16,
shuffle=True,
num_workers=1)

print("The number of images in a training set is: ", len(train_loader)*16)
print("The number of images in a test set is: ", len(test_loader)*16)
print("The number of batches per epoch is: ", len(train_loader))

classes = ('Angry', 'Fear', 'Happy', 'Surprise')
The number of images in a training set is:  18480
The number of images in a test set is:  2320
The number of batches per epoch is:  1155

## 二、VGG-16算法模型

device = "cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))

model = models.vgg16(pretrained=True)
model
Using cuda device

VGG(
(features): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace=True)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace=True)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(6): ReLU(inplace=True)
(7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(8): ReLU(inplace=True)
(9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(11): ReLU(inplace=True)
(12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(13): ReLU(inplace=True)
(14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(15): ReLU(inplace=True)
(16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(18): ReLU(inplace=True)
(19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(20): ReLU(inplace=True)
(21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(22): ReLU(inplace=True)
(23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(25): ReLU(inplace=True)
(26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(27): ReLU(inplace=True)
(28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(29): ReLU(inplace=True)
(30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
(classifier): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace=True)
(2): Dropout(p=0.5, inplace=False)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace=True)
(5): Dropout(p=0.5, inplace=False)
(6): Linear(in_features=4096, out_features=1000, bias=True)
)
)

### 1. 优化器与损失函数

optimizer  = Adam(model.parameters(), lr=0.0001, weight_decay=0.0001)
loss_model = nn.CrossEntropyLoss()
from torch.autograd import Variable

def test(model, test_loader, loss_model):
size = len(test_loader.dataset)
num_batches = len(test_loader)
model.eval()
test_loss, correct = 0, 0
with torch.no_grad():
for X, y in test_loader:
X, y = X.to(device), y.to(device)
pred = model(X)
test_loss += loss_model(pred, y).item()
correct += (pred.argmax(1) == y).type(torch.float).sum().item()
test_loss /= num_batches
correct /= size
print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
return correct,test_loss

def train(model,train_loader,loss_model,optimizer):
model=model.to(device)
model.train()

for i, (images, labels) in enumerate(train_loader, 0):

images = Variable(images.to(device))
labels = Variable(labels.to(device))

optimizer.zero_grad()
outputs = model(images)
loss = loss_model(outputs, labels)
loss.backward()
optimizer.step()

if i % 1000 == 0:
print('[%5d] loss: %.3f' % (i, loss))

### 2. 模型的训练

test_acc_list  = []
epochs = 10

for t in range(epochs):
print(f"Epoch {t+1}\n-------------------------------")
train(model,train_loader,loss_model,optimizer)
test_acc,test_loss = test(model, test_loader, loss_model)
test_acc_list.append(test_acc)
print("Done!")
Epoch 1
[    0] loss: 0.836
[ 1000] loss: 0.438
Test Error:
Accuracy: 71.0%, Avg loss: 0.699544

Epoch 3
[    0] loss: 0.276
[ 1000] loss: 0.294
Test Error:
Accuracy: 75.7%, Avg loss: 0.817064

Epoch 5
[    0] loss: 0.298
[ 1000] loss: 0.111
Test Error:
Accuracy: 76.4%, Avg loss: 0.780474

Epoch 7
[    0] loss: 0.263
[ 1000] loss: 0.285
Test Error:
Accuracy: 79.1%, Avg loss: 0.863850

Epoch 9
[    0] loss: 0.004
[ 1000] loss: 0.545
Test Error:
Accuracy: 78.5%, Avg loss: 1.079087

Done!

## 三、可视化

import numpy as np
import matplotlib.pyplot as plt

x = [i for i in range(1,11)]

plt.plot(x, test_acc_list, label="line ACC", alpha=0.8)

plt.xlabel("epoch")
plt.ylabel("acc")

plt.legend()
plt.show()

Original: https://blog.csdn.net/qq_38251616/article/details/124895432
Author: K同学啊
Title: 深度学习100例 | 第2例：人脸表情识别 – PyTorch实现

(0)

### 大家都在看

• #### Pytorch中nn.Transformer的使用详解与Transformer的黑盒讲解

文章目录 本文内容 将Transformer看成黑盒 Transformer的推理过程 Transformer的训练过程 Pytorch中的nn.Transformer * nn….

人工智能 2023年7月24日
0345
• #### 配置GPU版本的pytorch和torchvision，初学GPU版本torch踩坑

首先我们来了解一些经常用到的词！！在我们学习 pytorch时，都想用GPU跑，因为GPU支持并行，可以大大加快运行速度。那么具体为什么GPU比CPU快呢？看这：为什么GPU能比C…

人工智能 2023年7月21日
0199
• #### 按照C语言程序结构组成数字电路进行计算的计算机

按照C语言程序结构组成数字电路进行计算的计算机按照C语言程序结构组成数字电路进行计算的计算机是一种可以按照C语言程序结构来安排加法器，输出显示电路，输入电路，的数字计算机。它由按键…

人工智能 2023年6月26日
0120
• #### 传统算法（源于微信）个人觉得很有用

来源网页： Original: https://blog.csdn.net/yangjinyi1314/article/details/124548897Author: 曙光_de…

人工智能 2023年7月20日
0122
• #### [Python] numpy fillna() for Dataframe

In the store marketing, for many reason, one stock’s data can be incomplete: We can …

人工智能 2023年6月2日
0171
• #### CVPR2022: Oriented RepPoints论文模型实践（用dota数据集）

CVPR2022: Oriented RepPoints论文模型实践（用dota数据集） 论文：https://arxiv.org/abs/2105.11111github：htt…

人工智能 2023年7月6日
0113
• #### 吴恩达机器学习课后作业Python实现(三)：多类分类与前馈神经网络

目录 多类分类 数据集 数据可视化 正则化逻辑回归 正则化代价函数 正则化梯度 One-vs-all分类 One-vs-all预测 前馈神经网络 模型表示 模型搭建 前馈传播与预测…

人工智能 2023年7月14日
0153
• #### 功能性模块：（10）Spearman‘s rank correlation coefficient的简单理解(含与PCC之间的区别)

Spearman’s rank correlation coefficient的简单理解 1. 背景 在统计学中，斯皮尔曼等级相关系数（Spearman’s…

人工智能 2023年5月31日
0123
• #### 用Unity来下一场雪吧——Particle System 下雪粒子特效

一 制作下雪粒子特效 1 添加Particle System (1)Hierarchy窗口右键 > Effects > Particle System (2)新建一块P…

人工智能 2023年6月26日
0166
• #### 并联四足机器人项目开源教程（五） — 四足机器人相关书籍&论文研读

这个是本人在大三期间做的项目 —- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人，这个项目获得过两个国家级奖项和一个省级奖项。接下来我会将这个机器人的控…

人工智能 2023年7月27日
0181
• #### （免费分享）基于springboot财务管理系统

开发工具IDEA,数据库mysql5.7 源码获取：关注文末gongzhonghao，输入006领取下载链接 package com.bjpowernode.finance.con…

人工智能 2023年6月26日
0159
• #### 【Python数据清洗】pivot_table 与 pivot 的区别——手把手系列

最近在处理数据时会使用到将行转列 或者将列转行的情况，看了很多大神的教程一直提到一个pivot的函数，自己在之前看书的时候有看过一个类似的函数就是pivot_table的函数，出于…

人工智能 2023年7月8日
0136
• #### FB15K-237知识图谱数据集的介绍与分析，Freebase

FB15k-237是知识图谱Freebase的子集，15k表示其中知识库中有15k个主题词，237表示共有237种关系。 一、FB15K-237的知识库 整个Freebase知识图…

人工智能 2023年6月10日
0118
• #### [ML]（回归和分类）

文章目录 误差从哪来？ * Error的来源 估测 – 估测变量x的偏差和方差 为什么会有很多的模型? 怎么判断？ – 偏差大-欠拟合 方差大-过拟合 模型…

人工智能 2023年7月1日
0120
• #### Bert一些重要函数的详解

记录一下 embedding_lookup 词向量 根据词的索引来获取embedding输入是[batch_size,seq_lenth] 输出[batch_size,seq_le…

人工智能 2023年5月30日
0152
• #### 深度剖析Pyechars Graph关系图谱

前言 网上看了好多Graph，基本都是引用官网公示文档。路漫漫其修远兮，吾将上下而求索，花了近一周时间，总结一下自己对Pyechars Graph的理解，深度还原Pyechars …

人工智能 2023年6月1日
0162