'''
Reference:
Yibo Yang, Zhisheng Zhong, Tiancheng Shen, Zhouchen Lin. Convolutional Neural Networks with Alternately Updated Clique. In CVPR, June 2018.
'''
# 引入tensorflow模块
import tensorflow as tf
NUM_CHANNELS=1
OUTPUT_NODE=7
# 定义获取指定形状权重张量的函数,输入为张量形状、正态分布的方差以及l2正则化的正则化系数
def get_weight(shape, std, regularizer):
# 使用截止正态分布对张量进行初始化,该正态分布的方差设为函数给定值,并设置为可训练的变量
w = tf.Variable(tf.truncated_normal(shape, stddev=std))
# 若设置正则项不为空值,则进行l2正则化
if regularizer is not None:
# 正则项不为空,根据函数给定的正则化系数计算该张量的l2范数,加入losses集合,之后会作为结构风险项与经验风险一同构成损失函数
tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))
# 返回该权重张量
return w
# 定义获取指定形状偏置项的函数,输入为该偏置项的形状
def get_bias(shape):
# 将偏置项均初始化为0,并设置为可训练的变量
b = tf.Variable(tf.zeros(shape))
# 返回该偏置项
return b
# 定义2维卷积模块函数,输入为上一层得到的形如[B,H,W,C]的输入张量、卷积核张量以及卷积的步长
def conv2d(x, w, stride=1):
# 根据给定参数返回二维卷积后的张量,其中步长设为给定值,并调整padding使得卷积后feature map与原feature map维度成倍数关系
return tf.nn.conv2d(x, w, strides=[1, stride, stride, 1], padding='SAME')
# 定义全连接层,输入前一层的结点数与后一层的结点数
def fc(x, in_node, out_node, std, regularizer):
# 获取该层全连接层的权重矩阵
w = get_weight([in_node, out_node], std, regularizer)
# 获取该层全连接层的偏置项
b = get_bias([out_node])
# 将权重矩阵与输入向量相乘
x = tf.matmul(x, w)
# 将乘后获得的向量与偏置项进行相加
x = x + b
# 返回经过全连接层后的向量,即对输入向量进行仿射变换
return x
# 定义批归一化层,输入为上一层得到的张量与是否处在训练阶段标识
def bn(x, train=True):
# 调用tensorflow封装的批归一化模块,设定滑动平均率为0.9,并在训练阶段对β值进行学习
x = tf.contrib.layers.batch_norm(x, decay=0.9, scale=True, updates_collections=None, is_training=train)
# 返回批归一化后的张量
return x
# 定义dropout,输入为上一层得到的张量与是否处在训练阶段标识
def dropout(x, train):
# 调用tensorflow封装的dropout模块,设定张量内变量以0.2的几率变为0,在测试阶段则不受影响
x = tf.layers.dropout(x, rate=0.2, training=train)
# 返回dropout后的张量
return x
# 定义了clique块,可以分为stage1与stage2两个阶段,filters参数表示block内每一个连接所需的卷积核个数,layers参数表示block内除输入结点外的结点数
def clique_block(x0, regularizer, in_channel, filters, size, layers, train):
# 得到了输入结点到该block内其他所有结点的连接卷积核,w0[i]即输入结点指向第i+1个结点的连接卷积核张量
w0 = [get_weight([size, size, in_channel, filters], 0.1, regularizer) for i in range(layers)]
# 得到除输入结点外的结点间相互连接的数量,即全排列数A(n,2)
num_w = layers * (layers - 1)
# 得到了该block内除输入结点外的其他所有结点的连接卷积核,从第1个结点到第2、3...个结点卷积核依次为w[0]、w[1]...,之后则依次为第2、3...个结点到其他结点的卷积核,在同一个block中的stage1与stage2阶段,卷积核被重复多次利用
w = [get_weight([size, size, filters, filters], 0.1, regularizer) for i in range(num_w)]
# 进入block内的stage1阶段
x = stage1(x0, w0, w, in_channel, filters, layers, train)
# 进入block内的stage2阶段
x = stage2(x, w, in_channel, filters, layers, train)
# 将stage2的结果与该block的输入在channel维度concat在一起,作为该block提取到的的feature输出
feature = tf.concat([x0, x], axis=3)
# 返回stage2的结果与feature,其中x用于下一个block的输入,进一步提取更深层的特征,而feature则作为不同block的特征来进行融合,从而用于结果的预测
return x, feature
# 定义了stage1阶段
def stage1(x0, w0, w, in_channel, filters, layers=5, train=True):
# 使用输入结点对每一个之外的结点进行初始化
for i in range(layers):
# 如果是第一个结点
if i == 0:
# 就取w0中的第一个张量作为连接输入结点与第一个结点的卷积核
weight = w0[i]
# 第一个结点在stage1只与输入结点相连接
data = x0
# 如果不是第一个结点
else:
# 就取w0中对应的结点以及w中对应的结点拼成之后使用的卷积核
weight = tf.concat([w0[i]] + [w[4 * num + i - 1] for num in range(i)], axis=2)
# 使用拼出的卷积核与前面的结点生成一个新的结点
x = conv2d(data, weight)
# 对数据进行批归一化,加快网络训练,减轻梯度消失
x = bn(x, train)
# 使用ReLU激活函数使得模型非线性
x = tf.nn.relu(x)
# 使用dropout随机使部分结点归零,从而使得模型不易过拟合
x = dropout(x, train)
# 将已经生成的结点concat在一起用于生成下一个结点
data = tf.concat([data, x], axis=3)
# 除去输入结点与第一个结点(第一个结点在stage2的第一步即需要被更新,因此不需要传入下一阶段)
_, x = tf.split(data, [in_channel + filters, filters * (layers - 1)], axis=3)
# 将得到的后面若干个结点传入stage2
return x
# 定义了stage2模块
def stage2(x, w, in_channel, filters, layers=5, train=True):
# 对block内每一个结点进行更新
for i in range(layers):
# 取w中对应的结点拼成卷积核
weight = tf.concat([w[4 * num + i - 1] for num in range(i)] + [w[4 * num + i] for num in range(i + 1, layers)], axis=2)
# 使用拼出的卷积核与最近更新的结点更新最早的结点
data = conv2d(x, weight)
# 对数据进行批归一化,加快网络训练,减轻梯度消失
data = bn(data, train)
# 使用ReLU激活函数使得模型非线性
data = tf.nn.relu(data)
# 使用dropout随机使部分结点归零,从而使得模型不易过拟合
data = dropout(data, train)
# 若不为更新最后一个结点
if i != layers - 1:
# 则将更新最早的结点去除
_, x = tf.split(x, [filters, filters * (layers - 2)], axis=3)
# 将最新更新的结点同其他结点concat在一起,对于非最后结点相当于替换最早更新的结点
x = tf.concat([data, x], axis=3)
# 返回经过stage2后的所有经过更新的结点
return x
# 定义了在多个block之间的转换模块
def transition(x, regularizer, in_channel, out_channel, size, train, use_attention=True):
# 得到之后进行的1✖1卷积的卷积核张量,输入channel与输出channel为给定值,在该网络中由于较浅,因此暂不使用compression机制,输入channel与输出channel数相等
w = get_weight([1, 1, in_channel, out_channel], 0.1, regularizer)
# 根据上述卷积核进行卷积,步长为1,使得feature map维度不变
x = conv2d(x, w, 1)
# 对数据进行批归一化,加快网络训练,减轻梯度消失
x = bn(x, train)
# 使�
没有合适的资源?快使用搜索试试~ 我知道了~
基于TensorFlow+CNN+fer2013实现的人脸表情识别源码+详细代码注释.zip

共8个文件
py:7个
md:1个

1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉

温馨提示
【项目介绍】 基于TensorFlow+CNN+fer2013实现的人脸表情识别源码+详细代码注释.zip 【特别强调】 1、csdn上资源保证是完整最新,会不定期更新优化; 2、请用自己的账号在csdn官网下载,若通过第三方代下,博主不对您下载的资源作任何保证,且不提供任何形式的技术支持和答疑!!! 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。
资源推荐
资源详情
资源评论


























收起资源包目录









共 8 条
- 1
资源评论

- yanzhihuahuo2024-04-30感谢资源主的分享,很值得参考学习,资源价值较高,支持!
- xuncaiwiu2024-05-25内容与描述一致,超赞的资源,值得借鉴的内容很多,支持!

onnx
- 粉丝: 1w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 互联网+背景下信息技术与初中思想品德教学的融合(1).docx
- 人教新起点英语三下Unit16Revisionlesson91省名师优质课赛课获奖课件市赛课一等奖课(1).pptx
- 计算机电子信息技术在工程管理中的应用探讨(1).docx
- 关于中小企业互联网电子商务的应用探析(1).docx
- 基于国产基础软件的重大应用平台与集成环境可行性评估报告(1)(1).doc
- 2014期中考试《软件测试(1).doc
- 计算机网络的安全设计与系统化管理的体现分析(1).docx
- 电子商务公司全套规章制度(1)(1).doc
- 基于单片机的电动轮椅用手柄控制器设计电子信息工程单片机课程设计本科论文(1).doc
- 多角度看互联网创新与经济发展(1).docx
- 于基单片机的指纹识别系统设计大学论文(1).doc
- 信息化教学手段在对外汉语教学中的运用(1).docx
- 【会计经验】电子商务对财务报表审计有哪些影响?(1)(1).pdf
- 矿井自动化监控集成系统(1).doc
- 信息化时代高职教师专业发展研究(1).docx
- 药品GSP计算机系统管理制度(3).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
