当前位置: 首页 > news >正文

常州网站制作公司响应式网站开发支持ie6解决

常州网站制作公司,响应式网站开发支持ie6解决,2020应该建设什么网站,企业网站框架图文章目录 0 简介1 项目说明2 数据集介绍#xff1a;3 思路分析及代码实现3.1 数据可视化3.2 数据分离3.3 数据可视化3.4 在pytorch下创建数据集3.4.1 创建data-label对照表3.4.2 重写Dataset类3.4.3 数据集的使用 4 网络模型搭建4.1 训练模型4.2 模型的保存与加载 5 相关源码6… 文章目录 0 简介1 项目说明2 数据集介绍3 思路分析及代码实现3.1 数据可视化3.2 数据分离3.3 数据可视化3.4 在pytorch下创建数据集3.4.1 创建data-label对照表3.4.2 重写Dataset类3.4.3 数据集的使用 4 网络模型搭建4.1 训练模型4.2 模型的保存与加载 5 相关源码6 最后 0 简介 优质竞赛项目系列今天要分享的是 基于深度学习的人脸表情识别 该项目较为新颖适合作为竞赛课题方向学长非常推荐 更多资料, 项目分享 https://gitee.com/dancheng-senior/postgraduate 1 项目说明 给定数据集train.csv要求使用卷积神经网络CNN根据每个样本的面部图片判断出其表情。在本项目中表情共分7类分别为0生气1厌恶2恐惧3高兴4难过5惊讶和6中立即面无表情无法归为前六类。所以本项目实质上是一个7分类问题。 2 数据集介绍 1、CSV文件大小为28710行X2305列 2、在28710行中其中第一行为描述信息即“label”和“feature”两个单词其余每行内含有一个样本信息即共有28709个样本 3、在2305列中其中第一列为该样本对应的label取值范围为0到6。其余2304列为包含着每个样本大小为48X48人脸图片的像素值230448X48每个像素值取值范围在0到255之间 3 思路分析及代码实现 给定的数据集是csv格式的考虑到图片分类问题的常规做法决定先将其全部可视化还原为图片文件再送进模型进行处理。 借助深度学习框架Pytorch1.0 CPU穷逼版本搭建模型由于需用到自己的数据集因此我们需要重写其中的数据加载部分其余用现成的API即可。 学长这里使用CNN实现功能因此基本只能在调参阶段自由发挥不要鄙视调参参数也不是人人都能调得好的比如我。 3.1 数据可视化 我们需要将csv中的像素数据还原为图片并保存下来在python环境下很多库都能实现类似的功能如pillowopencv等。由于笔者对opencv较为熟悉且opencv又是专业的图像处理库因此决定采用opencv实现这一功能 3.2 数据分离 原文件中label和人脸像素数据是集中在一起的。为了方便操作决定利用pandas库进行数据分离即将所有label 读出后写入新创建的文件label.csv将所有的像素数据读出后写入新创建的文件data.csv。 ​ # 将label和像素数据分离 import pandas as pd# 修改为train.csv在本地的相对或绝对地址 path .//ml2019spring-hw3//train.csv # 读取数据 df pd.read_csv(path) # 提取label数据 df_y df[[label]] # 提取feature即像素数据 df_x df[[feature]] # 将label写入label.csv df_y.to_csv(label.csv, indexFalse, headerFalse) # 将feature数据写入data.csv df_x.to_csv(data.csv, indexFalse, headerFalse)以上代码执行完毕后在该代码脚本所在的文件夹下就会生成两个新文件label.csv以及data.csv。在执行代码前注意修改train.csv在本地的路径。 3.3 数据可视化 将数据分离后人脸像素数据全部存储在data.csv文件中其中每行数据就是一张人脸。按行读取数据利用opencv将每行的2304个数据恢复为一张48X48的人脸图片并保存为jpg格式。在保存这些图片时将第一行数据恢复出的人脸命名为0.jpg第二行的人脸命名为1.jpg…以方便与label[0]、label[1]…一一对应。 ​ import cv2 import numpy as np# 指定存放图片的路径 path .//face # 读取像素数据 data np.loadtxt(data.csv)# 按行取数据 for i in range(data.shape[0]):face_array data[i, :].reshape((48, 48)) # reshapecv2.imwrite(path // {}.jpg.format(i), face_array) # 写图片以上代码虽短但涉及到大量数据的读取和大批图片的写入因此占用的内存资源较多且执行时间较长视机器性能而定一般要几分钟到十几分钟不等。代码执行完毕我们来到指定的图片存储路径就能发现里面全部是写好的人脸图片。 粗略浏览一下这些人脸图片就能发现这些图片数据来源较广且并不纯净。就前60张图片而言其中就包含了正面人脸如1.jpg侧面人脸如18.jpg倾斜人脸如16.jpg正面人头如7.jpg正面人上半身如55.jpg动漫人脸如38.jpg以及毫不相关的噪声如59.jpg。放大图片后仔细观察还会发现不少图片上还有水印。种种因素均给识别提出了严峻的挑战。 3.4 在pytorch下创建数据集 现在我们有了图片但怎么才能把图片读取出来送给模型呢 最简单粗暴的方法就是直接用opencv将所有图片读取出来以numpy中array的数据格式直接送给模型。如果这样做的话会一次性把所有图片全部读入内存占用大量的内存空间且只能使用单线程效率不高也不方便后续操作。 其实在pytorch中有一个类torch.utils.data.Dataset是专门用来加载数据的我们可以通过继承这个类来定制自己的数据集和加载方法。以下为基本流程。 3.4.1 创建data-label对照表 首先我们需要划分一下训练集和验证集。在本次作业中共有28709张图片取前24000张图片作为训练集其他图片作为验证集。新建文件夹train和val将0.jpg到23999.jpg放进文件夹train将其他图片放进文件夹val。 在继承torch.utils.data.Dataset类定制自己的数据集时由于在数据加载过程中需要同时加载出一个样本的数据及其对应的label因此最好能建立一个data- label对照表其中记录着data和label的对应关系“data-lable对照表”并非官方名词这个技术流程是 有童鞋看到这里就会提出疑问了在人脸可视化过程中每张图片的命名不都和label的存放顺序是一一对应关系吗为什么还要多此一举再重新建立data- label对照表呢笔者在刚开始的时候也是这么想的按顺序0.jpg, 1.jpg, 2.jpg…加载图片和labellabel[0], label[1], label[2]…岂不是方便、快捷又高效结果在实际操作的过程中才发现程序加载文件的机制是按照文件名首字母或数字来的即加载次序是0110100…而不是预想中的0123…因此加载出来的图片不能够和label[0]label[1]lable[2]label[3]…一一对应所以建立data- label对照表还是相当有必要的。 建立data- label对照表的基本思路就是指定文件夹train或val遍历该文件夹下的所有文件如果该文件是.jpg格式的图片就将其图片名写入一个列表同时通过图片名索引出其label将其label写入另一个列表。最后利用pandas库将这两个列表写入同一个csv文件。 执行这段代码前注意修改相关文件路径。代码执行完毕后会在train和val文件夹下各生成一个名为dataset.csv的data-label对照表。 ​ import osimport pandas as pddef data_label(path):# 读取label文件df_label pd.read_csv(label.csv, header None)# 查看该文件夹下所有文件files_dir os.listdir(path)# 用于存放图片名path_list []# 用于存放图片对应的labellabel_list []# 遍历该文件夹下的所有文件for file_dir in files_dir:# 如果某文件是图片则将其文件名以及对应的label取出分别放入path_list和label_list这两个列表中if os.path.splitext(file_dir)[1] .jpg:path_list.append(file_dir)index int(os.path.splitext(file_dir)[0])label_list.append(df_label.iat[index, 0])# 将两个列表写进dataset.csv文件path_s pd.Series(path_list)label_s pd.Series(label_list)df pd.DataFrame()df[path] path_sdf[label] label_sdf.to_csv(path\\dataset.csv, indexFalse, headerFalse)def main():# 指定文件夹路径train_path F:\\0gold\\ML\\LHY_class\\FaceData\\trainval_path F:\\0gold\\ML\\LHY_class\\FaceData\\valdata_label(train_path)data_label(val_path)if __name__ __main__:main() OK代码执行完毕让我们来看一看data-label对照表里面具体是什么样子吧 3.4.2 重写Dataset类 首先介绍一下Pytorch中Dataset类Dataset类是Pytorch中图像数据集中最为重要的一个类也是Pytorch中所有数据集加载类中应该继承的父类。其中父类中的两个私有成员函数getitem()和len()必须被重载否则将会触发错误提示。其中getitem()可以通过索引获取数据len()可以获取数据集的大小。在Pytorch源码中Dataset类的声明如下 ​ class Dataset(object):An abstract class representing a Dataset.All other datasets should subclass it. All subclasses should override__len__, that provides the size of the dataset, and __getitem__,supporting integer indexing in range from 0 to len(self) exclusive.def __getitem__(self, index):raise NotImplementedErrordef __len__(self):raise NotImplementedErrordef __add__(self, other):pyreturn ConcatDataset([self, other])我们通过继承Dataset类来创建我们自己的数据加载类命名为FaceDataset。 ​ import torch from torch.utils import data import numpy as np import pandas as pd import cv2class FaceDataset(data.Dataset):首先要做的是类的初始化。之前的data-label对照表已经创建完毕在加载数据时需用到其中的信息。因此在初始化过程中我们需要完成对data- label对照表中数据的读取工作。 通过pandas库读取数据随后将读取到的数据放入list或numpy中方便后期索引。 ​ # 初始化 def __init__(self, root):super(FaceDataset, self).__init__()# root为train或val文件夹的地址self.root root# 读取data-label对照表中的内容df_path pd.read_csv(root \\dataset.csv, headerNone, usecols[0]) # 读取第一列文件名df_label pd.read_csv(root \\dataset.csv, headerNone, usecols[1]) # 读取第二列label# 将其中内容放入numpy方便后期索引self.path np.array(df_path)[:, 0]self.label np.array(df_label)[:, 0]接着就要重写getitem()函数了该函数的功能是加载数据。在前面的初始化部分我们已经获取了所有图片的地址在这个函数中我们就要通过地址来读取数据。 由于是读取图片数据因此仍然借助opencv库。需要注意的是之前可视化数据部分将像素值恢复为人脸图片并保存得到的是3通道的灰色图每个通道都完全一样而在这里我们只需要用到单通道因此在图片读取过程中即使原图本来就是灰色的但我们还是要加入参数从cv2.COLOR_BGR2GARY保证读出来的数据是单通道的。读取出来之后可以考虑进行一些基本的图像处理操作如通过高斯模糊降噪、通过直方图均衡化来增强图像等经试验证明在本次作业中直方图均衡化并没有什么卵用而高斯降噪甚至会降低正确率可能是因为图片分辨率本来就较低模糊后基本上什么都看不清了吧。读出的数据是48X48的而后续卷积神经网络中nn.Conv2d() API所接受的数据格式是(batch_size, channel, width, higth)本次图片通道为1因此我们要将48X48 reshape为1X48X48。 ​ # 读取某幅图片item为索引号 def __getitem__(self, item):face cv2.imread(self.root \\ self.path[item])# 读取单通道灰度图face_gray cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)# 高斯模糊# face_Gus cv2.GaussianBlur(face_gray, (3,3), 0)# 直方图均衡化face_hist cv2.equalizeHist(face_gray)# 像素值标准化face_normalized face_hist.reshape(1, 48, 48) / 255.0 # 为与pytorch中卷积神经网络API的设计相适配需reshape原图# 用于训练的数据需为tensor类型face_tensor torch.from_numpy(face_normalized) # 将python中的numpy数据类型转化为pytorch中的tensor数据类型face_tensor face_tensor.type(torch.FloatTensor) # 指定为torch.FloatTensor型否则送进模型后会因数据类型不匹配而报错label self.label[item]return face_tensor, label最后就是重写len()函数获取数据集大小了。self.path中存储着所有的图片名获取self.path第一维的大小即为数据集的大小。 ​ 1 # 获取数据集样本个数2 def __len__(self):3 return self.path.shape[0]class FaceDataset(data.Dataset):# 初始化def __init__(self, root):super(FaceDataset, self).__init__()self.root rootdf_path pd.read_csv(root \\dataset.csv, headerNone, usecols[0])df_label pd.read_csv(root \\dataset.csv, headerNone, usecols[1])self.path np.array(df_path)[:, 0]self.label np.array(df_label)[:, 0]# 读取某幅图片item为索引号def __getitem__(self, item):face cv2.imread(self.root \\ self.path[item])# 读取单通道灰度图face_gray cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)# 高斯模糊# face_Gus cv2.GaussianBlur(face_gray, (3,3), 0)# 直方图均衡化face_hist cv2.equalizeHist(face_gray)# 像素值标准化face_normalized face_hist.reshape(1, 48, 48) / 255.0 # 为与pytorch中卷积神经网络API的设计相适配需reshape原图# 用于训练的数据需为tensor类型face_tensor torch.from_numpy(face_normalized) # 将python中的numpy数据类型转化为pytorch中的tensor数据类型face_tensor face_tensor.type(torch.FloatTensor) # 指定为torch.FloatTensor型否则送进模型后会因数据类型不匹配而报错label self.label[item]return face_tensor, label# 获取数据集样本个数def __len__(self):return self.path.shape[0] 3.4.3 数据集的使用 到此为止我们已经成功地写好了自己的数据集加载类。那么这个类该如何使用呢下面笔者将以训练集train文件夹下的数据加载为例讲一下整个数据集加载类在模型训练过程中的使用方法。 首先我们需要将这个类实例化。 ​ 1 # 数据集实例化(创建数据集) 2 train_dataset FaceDataset(rootE:\\WSD\\HW3\\FaceData\\train)train_dataset即为我们实例化的训练集要想加载其中的数据还需要DataLoader类的辅助。DataLoader类总是配合Dataset类一起使用DataLoader类可以帮助我们分批次读取数据也可以通过这个类选择读取数据的方式顺序 or 随机乱序还可以选择并行加载数据等这个类并不要我们重写。 ​ 1 # 载入数据并分割batch 2 train_loader data.DataLoader(train_dataset, batch_size)最后我们就能直接从train_loader中直接加载出数据和label了而且每次都会加载出一个批次batch的数据和label。 ​ 1 for images, labels in train_loader: 2 3 通过images和labels训练模型 4 4 网络模型搭建 通过Pytorch搭建基于卷积神经网络的分类器。刚开始是自己设计的网络模型在训练时发现准确度一直上不去折腾一周后走投无路后来在github上找到了一个做表情识别的开源项目用的是这个项目的模型结构但还是没能达到项目中的精度acc在74%。下图为该开源项目中公布的两个模型结构笔者用的是Model B 且只采用了其中的卷积-全连接部分如果大家希望进一步提高模型的表现能力可以考虑向模型中添加Face landmarks HOG features 部分。 可以看出在Model B 的卷积部分输入图片shape为48X48X1经过一个3X3X64卷积核的卷积操作再进行一次2X2的池化得到一个24X24X64的feature map 1以上卷积和池化操作的步长均为1每次卷积前的padding为1下同。将feature map 1经过一个3X3X128卷积核的卷积操作再进行一次2X2的池化得到一个12X12X128的feature map 2。将feature map 2经过一个3X3X256卷积核的卷积操作再进行一次2X2的池化得到一个6X6X256的feature map 3。卷积完毕数据即将进入全连接层。进入全连接层之前要进行数据扁平化将feature map 3拉一个成长度为6X6X2569216的一维tensor。随后数据经过dropout后被送进一层含有4096个神经元的隐层再次经过dropout后被送进一层含有1024个神经元的隐层之后经过一层含256个神经元的隐层最终经过含有7个神经元的输出层。一般再输出层后都会加上softmax层取概率最高的类别为分类结果。 我们可以通过继承nn.Module来定义自己的模型类。以下代码实现了上述的模型结构。需要注意的是在代码中数据经过最后含7个神经元的线性层后就直接输出了并没有经过softmax层。这是为什么呢其实这和Pytorch在这一块的设计机制有关。因为在实际应用中softmax层常常和交叉熵这种损失函数联合使用因此Pytorch在设计时就将softmax运算集成到了交叉熵损失函数CrossEntropyLoss()内部如果使用交叉熵作为损失函数就默认在计算损失函数前自动进行softmax操作不需要我们额外加softmax层。Tensorflow也有类似的机制。 ​ class FaceCNN(nn.Module):# 初始化网络结构def __init__(self):super(FaceCNN, self).__init__()# 第一次卷积、池化self.conv1 nn.Sequential(# 输入通道数in_channels输出通道数(即卷积核的通道数)out_channels卷积核大小kernel_size步长stride对称填0行列数padding# input:(bitch_size, 1, 48, 48), output:(bitch_size, 64, 48, 48), (48-32*1)/11 48nn.Conv2d(in_channels1, out_channels64, kernel_size3, stride1, padding1), # 卷积层nn.BatchNorm2d(num_features64), # 归一化nn.RReLU(inplaceTrue), # 激活函数# output(bitch_size, 64, 24, 24)nn.MaxPool2d(kernel_size2, stride2), # 最大值池化)# 第二次卷积、池化self.conv2 nn.Sequential(# input:(bitch_size, 64, 24, 24), output:(bitch_size, 128, 24, 24), (24-32*1)/11 24nn.Conv2d(in_channels64, out_channels128, kernel_size3, stride1, padding1),nn.BatchNorm2d(num_features128),nn.RReLU(inplaceTrue),# output:(bitch_size, 128, 12 ,12)nn.MaxPool2d(kernel_size2, stride2),)# 第三次卷积、池化self.conv3 nn.Sequential(# input:(bitch_size, 128, 12, 12), output:(bitch_size, 256, 12, 12), (12-32*1)/11 12nn.Conv2d(in_channels128, out_channels256, kernel_size3, stride1, padding1),nn.BatchNorm2d(num_features256),nn.RReLU(inplaceTrue),# output:(bitch_size, 256, 6 ,6)nn.MaxPool2d(kernel_size2, stride2),)# 参数初始化self.conv1.apply(gaussian_weights_init)self.conv2.apply(gaussian_weights_init)self.conv3.apply(gaussian_weights_init)# 全连接层self.fc nn.Sequential(nn.Dropout(p0.2),nn.Linear(in_features256*6*6, out_features4096),nn.RReLU(inplaceTrue),nn.Dropout(p0.5),nn.Linear(in_features4096, out_features1024),nn.RReLU(inplaceTrue),nn.Linear(in_features1024, out_features256),nn.RReLU(inplaceTrue),nn.Linear(in_features256, out_features7),)# 前向传播def forward(self, x):x self.conv1(x)x self.conv2(x)x self.conv3(x)# 数据扁平化x x.view(x.shape[0], -1)y self.fc(x)return y4.1 训练模型 有了模型就可以通过数据的前向传播和误差的反向传播来训练模型了。在此之前还需要指定优化器即学习率更新的方式、损失函数以及训练轮数、学习率等超参数。 在本次作业中我们采用的优化器是SGD即随机梯度下降其中参数weight_decay为正则项系数损失函数采用的是交叉熵可以考虑使用学习率衰减。 ​ def train(train_dataset, batch_size, epochs, learning_rate, wt_decay):# 载入数据并分割batchtrain_loader data.DataLoader(train_dataset, batch_size)# 构建模型model FaceCNN()# 损失函数loss_function nn.CrossEntropyLoss()# 优化器optimizer optim.SGD(model.parameters(), lrlearning_rate, weight_decaywt_decay)# 学习率衰减# scheduler optim.lr_scheduler.StepLR(optimizer, step_size10, gamma0.8)# 逐轮训练for epoch in range(epochs):# 记录损失值loss_rate 0# scheduler.step() # 学习率衰减model.train() # 模型训练for images, labels in train_loader:# 梯度清零optimizer.zero_grad()# 前向传播output model.forward(images)# 误差计算loss_rate loss_function(output, labels)# 误差的反向传播loss_rate.backward()# 更新参数optimizer.step()4.2 模型的保存与加载 我们训练的这个模型相对较小因此可以直接保存整个模型包括结构和参数。 ​ # 模型保存 torch.save(model, model_net1.pkl) # 模型加载 model_parm model_net1.pkl model torch.load(net_parm)5 相关源码 代码在CPU上跑起来较慢视超参数和机器性能不同一般跑完需耗时几小时到几十小时不等。代码执行时每轮输出一次损失值每5轮输出一次在训练集和验证集上的正确率。有条件的可以在GPU上尝试。 ​ import torchimport torch.utils.data as dataimport torch.nn as nnimport torch.optim as optimimport numpy as npimport pandas as pdimport cv2# 参数初始化def gaussian_weights_init(m):classname m.__class__.__name__# 字符串查找find找不到返回-1不等-1即字符串中含有该字符if classname.find(Conv) ! -1:m.weight.data.normal_(0.0, 0.04)# 人脸旋转尝试过但效果并不好本次并未用到def imgProcess(img):# 通道分离(b, g, r) cv2.split(img)# 直方图均衡化bH cv2.equalizeHist(b)gH cv2.equalizeHist(g)rH cv2.equalizeHist(r)# 顺时针旋转15度矩阵M0 cv2.getRotationMatrix2D((24,24),15,1)# 逆时针旋转15度矩阵M1 cv2.getRotationMatrix2D((24,24),15,1)# 旋转gH cv2.warpAffine(gH, M0, (48, 48))rH cv2.warpAffine(rH, M1, (48, 48))# 通道合并img_processed cv2.merge((bH, gH, rH))return img_processed# 验证模型在验证集上的正确率def validate(model, dataset, batch_size):val_loader data.DataLoader(dataset, batch_size)result, num 0.0, 0for images, labels in val_loader:pred model.forward(images)pred np.argmax(pred.data.numpy(), axis1)labels labels.data.numpy()result np.sum((pred labels))num len(images)acc result / numreturn accclass FaceDataset(data.Dataset):# 初始化def __init__(self, root):super(FaceDataset, self).__init__()self.root rootdf_path pd.read_csv(root \\dataset.csv, headerNone, usecols[0])df_label pd.read_csv(root \\dataset.csv, headerNone, usecols[1])self.path np.array(df_path)[:, 0]self.label np.array(df_label)[:, 0]# 读取某幅图片item为索引号def __getitem__(self, item):# 图像数据用于训练需为tensor类型label用numpy或list均可face cv2.imread(self.root \\ self.path[item])# 读取单通道灰度图face_gray cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)# 高斯模糊# face_Gus cv2.GaussianBlur(face_gray, (3,3), 0)# 直方图均衡化face_hist cv2.equalizeHist(face_gray)# 像素值标准化face_normalized face_hist.reshape(1, 48, 48) / 255.0face_tensor torch.from_numpy(face_normalized)face_tensor face_tensor.type(torch.FloatTensor)label self.label[item]return face_tensor, label# 获取数据集样本个数def __len__(self):return self.path.shape[0]class FaceCNN(nn.Module):# 初始化网络结构def __init__(self):super(FaceCNN, self).__init__()# 第一次卷积、池化self.conv1 nn.Sequential(# 输入通道数in_channels输出通道数(即卷积核的通道数)out_channels卷积核大小kernel_size步长stride对称填0行列数padding# input:(bitch_size, 1, 48, 48), output:(bitch_size, 64, 48, 48), (48-32*1)/11 48nn.Conv2d(in_channels1, out_channels64, kernel_size3, stride1, padding1), # 卷积层nn.BatchNorm2d(num_features64), # 归一化nn.RReLU(inplaceTrue), # 激活函数# output(bitch_size, 64, 24, 24)nn.MaxPool2d(kernel_size2, stride2), # 最大值池化)# 第二次卷积、池化self.conv2 nn.Sequential(# input:(bitch_size, 64, 24, 24), output:(bitch_size, 128, 24, 24), (24-32*1)/11 24nn.Conv2d(in_channels64, out_channels128, kernel_size3, stride1, padding1),nn.BatchNorm2d(num_features128),nn.RReLU(inplaceTrue),# output:(bitch_size, 128, 12 ,12)nn.MaxPool2d(kernel_size2, stride2),)# 第三次卷积、池化self.conv3 nn.Sequential(# input:(bitch_size, 128, 12, 12), output:(bitch_size, 256, 12, 12), (12-32*1)/11 12nn.Conv2d(in_channels128, out_channels256, kernel_size3, stride1, padding1),nn.BatchNorm2d(num_features256),nn.RReLU(inplaceTrue),# output:(bitch_size, 256, 6 ,6)nn.MaxPool2d(kernel_size2, stride2),)# 参数初始化self.conv1.apply(gaussian_weights_init)self.conv2.apply(gaussian_weights_init)self.conv3.apply(gaussian_weights_init)# 全连接层self.fc nn.Sequential(nn.Dropout(p0.2),nn.Linear(in_features256*6*6, out_features4096),nn.RReLU(inplaceTrue),nn.Dropout(p0.5),nn.Linear(in_features4096, out_features1024),nn.RReLU(inplaceTrue),nn.Linear(in_features1024, out_features256),nn.RReLU(inplaceTrue),nn.Linear(in_features256, out_features7),)# 前向传播def forward(self, x):x self.conv1(x)x self.conv2(x)x self.conv3(x)# 数据扁平化x x.view(x.shape[0], -1)y self.fc(x)return ydef train(train_dataset, val_dataset, batch_size, epochs, learning_rate, wt_decay):# 载入数据并分割batchtrain_loader data.DataLoader(train_dataset, batch_size)# 构建模型model FaceCNN()# 损失函数loss_function nn.CrossEntropyLoss()# 优化器optimizer optim.SGD(model.parameters(), lrlearning_rate, weight_decaywt_decay)# 学习率衰减# scheduler optim.lr_scheduler.StepLR(optimizer, step_size10, gamma0.8)# 逐轮训练for epoch in range(epochs):# 记录损失值loss_rate 0# scheduler.step() # 学习率衰减model.train() # 模型训练for images, labels in train_loader:# 梯度清零optimizer.zero_grad()# 前向传播output model.forward(images)# 误差计算loss_rate loss_function(output, labels)# 误差的反向传播loss_rate.backward()# 更新参数optimizer.step()# 打印每轮的损失print(After {} epochs , the loss_rate is : .format(epoch1), loss_rate.item())if epoch % 5 0:model.eval() # 模型评估acc_train validate(model, train_dataset, batch_size)acc_val validate(model, val_dataset, batch_size)print(After {} epochs , the acc_train is : .format(epoch1), acc_train)print(After {} epochs , the acc_val is : .format(epoch1), acc_val)return modeldef main():# 数据集实例化(创建数据集)train_dataset FaceDataset(rootE:\\WSD\\HW3\\FaceData\\train)val_dataset FaceDataset(rootE:\\WSD\\HW3\\FaceData\\val)# 超参数可自行指定model train(train_dataset, val_dataset, batch_size128, epochs100, learning_rate0.1, wt_decay0)# 保存模型torch.save(model, model_net1.pkl)if __name__ __main__:main() 6 最后 更多资料, 项目分享 https://gitee.com/dancheng-senior/postgraduate
http://www.dnsts.com.cn/news/91918.html

相关文章:

  • 上海html5网站制作公司长沙旅游必去的八个景点
  • 长沙做网站建设的做网页素材
  • 成都网站建设公司排名网站上的彩票走势图是怎么做的
  • 济南制作网站公司吗网络规划设计师下午题2023估分
  • 什么网站能看到专业的做面包视频广州网站建设方案
  • 郓城网站建设费用广州网络推广引流
  • 商务网站如何推广哪个网站做不锈钢好
  • 清华大学学生工作做网站如何注册一个企业邮箱
  • 个人网站怎么建外贸网站推广如何做
  • 樱桃企业网站管理系统v1.1-cms优秀企业简介100字
  • 网站域名备案主机名网络服务器配置与管理考试题
  • 秦皇岛海港区建设局网站湖北网站建设网址
  • 网站备案审核流程图专业ppt代做
  • wordpress网站更改主题信息凡科商城官网旗舰店
  • 郑州影楼网站建设WordPress博客系统安装
  • 响应式网站建设品牌全网天下公司注册要求
  • 什么人最需要建设网站vs2015 做网站
  • 网页制作怎么上传到网站奇璐荣获北京十大高端设计公司称号
  • 长乐区建设局网站模版网站有源代码吗
  • 做彩投网站犯法吗火车头wordpress 缩略图
  • 网站建设技术方面论文房屋装修设计师怎么收费
  • 宁波网站建设公司哪有做聊天室cpa用什么类型的网站好
  • 论述网站建设的步骤卡片式网页布局
  • 衡阳市网站建设公司果酱wordpress
  • 旅游网站分析拼多多网站建设合同
  • 上海虹口网站建设公司做网站自己申请域名还是对方
  • 黄村做网站哪家快邢台做网站推广的公司是哪家?
  • 设计之家官方网站相册网站怎么做的
  • 山东做网站建设公司天津城市建设网站
  • dreamwearver可以做网站吗网站主体备案号