范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

AI算法卷积神经网络CNN原理与实现

  1 算法思想
  卷积神经网络通过所设计的卷积核与图像进行卷积操作,提取图像中的某些特征。通过卷积网络层数的加深,提取的特征从局部到整体,从而对物体进行识别。 2 算法推导2.1 边缘特征检测示例
  图1. 图像边缘检测
  假如有一张图像,想让计算机搞清楚图片上有什么物体,可以做的事情是检测图像的水平边缘与垂直边缘。
  (1)卷积操作
  如图1所示,是一个6*6的灰度图像,构造一个3*3的矩阵,在卷积神经网络中,通常称为filter(过滤器),对6*6的图像进行卷积操作得到4*4的矩阵。
  图2. 卷积操作
  如图2所示,3*3的filter与6*6的灰度图像左上角3*3区域进行卷积3*1+0*0+1*(-1)+1*1+5*0+8*(-1)+2*1+7*0+2*(-1)=-5,从而得到4*4左上角的-5。
  (2)边缘提取
  图3. 垂直边缘提取
  为什么这种卷积操作可以得到图像的边缘?
  如图3所示,原图是6*6的灰度图像,10的部分为亮区域,0的部分为暗区域。从10->0为垂直边缘。用一个3*3的过滤器,对图像进行卷积操作,得到图像中间亮,两边暗。亮暗交接处为边缘。
  (3)过滤器类型
  图4. 垂直过滤器与水平过滤器
  ​  通过图4的垂直过滤器与水平过滤器可实现垂直边缘与水平边缘检测。
  图5. 过滤器类型
  ​  图5列出了一些常用的过滤器,如sobel算子,scharr算子等。在卷积神经网络中,把这些过滤器当成我们要学习的参数, 卷积网络训练的目标就是去理解过滤器的参数。 2.2 边缘填充padding
  图6. padding示意图
  ​  (1)为什么进行padding?
  按照上述的描述,图片每经过一次卷积运算,会存在以下两个问题: 图片会缩小导致无法进行深层卷积运算; 原始图片边缘信息对输出贡献得少,输出图片丢失边缘信息。
  (2)怎样进行padding? 假设输入的图片大小:
  过滤器的大小:
  两个水平与垂直边缘padding大小:
  则经过卷积操作的输出:
  2.3 卷积步长stride
  图7. 卷积步长为2对于input=7*7,filter=3*3,stride=2,padding=0; 经卷积操作输出: ; 通用表示: ,  表示向下取整。 2.4 彩色图像的卷积
  以上讲述的卷积都是灰度图像的,如果想要在RGB图像上进行卷积,过滤器的大小不再是3*3,而是3*3*3,最后的3对应为通道数(channels)。卷积生成图像中,每个位置的像素值,为3*3*3的过滤器与图像相应位置相乘 累加。 如图8所示,过滤器依次在RGB图像上滑动,最终生成的图像大小为4*4。
  图8. 单一filter彩色图像卷积
  ​  另外一个问题是,如果我们在不仅仅在图像总检测一种类型的特征,而是要同时检测垂直边缘、水平边缘、45度边缘等,也就是多个过滤器的问题。如果有两个过滤器,最终生成图像为4*4*2的立方体,这里的2来源于我们采用了2个过滤器。
  图9. 多个filter彩色图像卷积
  写成通用的形式: 输入维度:
  每个滤波器的维度:
  权重维度:
  偏置维度:
  输出维度:
  其中:
  2.5 池化层Pooling
  图10. Max pooling示意图
  ​  在卷积神经网络中,除了使用卷积层外,还使用池化层来缩减模型大小,提高计算速度。池化层分为最大池化层(max pooling)与平均池化层(average pooling)。池化层中的max pooling是求每个过滤器滑动区域内的最大值;average pooling是求每个过滤器滑动区域内的平均值。 经过padding后的输出:
  一般情况下padding=0,输出表示:
  2.6 简单卷积神经网络示例LeNet-5
  LeNet(LeNet-5)由两个卷积层和三个全连接层构成。 这两卷积层的卷积核均为5*5,第一个卷积层的输出通道为6,第二卷积层的输出通道为16。 每个池化层窗口的大小为2*2,步长为2。 三个全连接层分别有120、84和10个输出。 3 算法实现
  (1)下载数据集 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms import time from matplotlib import pyplot as plt   pipline_train = transforms.Compose([     #随机旋转图片     transforms.RandomHorizontalFlip(),     #將圖片尺寸resize到32x32     transforms.Resize((32,32)),     #將圖片轉化為Tensor格式     transforms.ToTensor(),     #正則化(當模型出現過擬合的情況時,用來降低模型的複雜度)     transforms.Normalize((0.1307,),(0.3081,)) ]) pipline_test = transforms.Compose([     #將圖片尺寸resize到32x32     transforms.Resize((32,32)),     transforms.ToTensor(),     transforms.Normalize((0.1307,),(0.3081,)) ]) #下載数据集 train_set = datasets.MNIST(root="./data", train=True, download=True, transform=pipline_train) test_set = datasets.MNIST(root="./data", train=False, download=True, transform=pipline_test) #載入数据集 trainloader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True) testloader = torch.utils.data.DataLoader(test_set, batch_size=32, shuffle=False)
  (2)搭建LeNet-5网络结构,并确定前向传递过程 class LeNet(nn.Module):     def __init__(self):         super(LeNet, self).__init__()         self.conv1 = nn.Conv2d(1, 6, 5)         self.relu = nn.ReLU()         self.maxpool1 = nn.MaxPool2d(2, 2)         self.conv2 = nn.Conv2d(6, 16, 5)         self.maxpool2 = nn.MaxPool2d(2, 2)         self.fc1 = nn.Linear(16*5*5, 120)         self.fc2 = nn.Linear(120, 84)         self.fc3 = nn.Linear(84, 10)      def forward(self, x):         x = self.conv1(x)         x = self.relu(x)         x = self.maxpool1(x)         x = self.conv2(x)         x = self.maxpool2(x)         x = x.view(-1, 16*5*5)         x = F.relu(self.fc1(x))         x = F.relu(self.fc2(x))         x = self.fc3(x)         output = F.log_softmax(x, dim=1)         return output
  (3)将定义好的网络结构部署至CPU/GPU上,并定义优化器 #建立模型,部署gpu或cpu device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = LeNet().to(device) #定义优化器 optimizer = optim.Adam(model.parameters(), lr=0.001)
  (4)定义训练过程 def train_runner(model, device, trainloader, optimizer, epoch):     #訓練模型, 啟用 BatchNormalization 和 Dropout, 將BatchNormalization和Dropout置為True     model.train()     total = 0     correct =0.0      #enumerate迭代已載入的数据集     for i, data in enumerate(trainloader, 0):         inputs, labels = data         #把模型部署到device上         inputs, labels = inputs.to(device), labels.to(device)         #初始化梯度         optimizer.zero_grad()         #儲存訓練結果         outputs = model(inputs)         #計算損失和         #多分類情況通常使用cross_entropy(交叉熵損失函式), 而對於二分類問題, 通常使用sigmoid         loss = F.cross_entropy(outputs, labels)         #获取最大概率的預測結果         #dim=1表示返回每一行的最大值對應的列下標         predict = outputs.argmax(dim=1)         total += labels.size(0)         correct += (predict == labels).sum().item()         #反向傳播         loss.backward()         #更新参数         optimizer.step()         if i % 1000 == 0:             #loss.item()表示當前loss的數值             print("Train Epoch{} 	 Loss: {:.6f}, accuracy: {:.6f}%".format(epoch, loss.item(), 100*(correct/total)))             Loss.append(loss.item())             Accuracy.append(correct/total)     return loss.item(), correct/total
  (5)定义测试过程 def test_runner(model, device, testloader):     #模型驗證, 必須要寫, 否則只要有輸入数据, 即使不訓練, 它也會改變權值     model.eval()     #統計模型正確率, 設定初始值     correct = 0.0     test_loss = 0.0     total = 0     #torch.no_grad將不會計算梯度, 也不會進行反向傳播     with torch.no_grad():         for data, label in testloader:             data, label = data.to(device), label.to(device)             output = model(data)             test_loss += F.cross_entropy(output, label).item()             predict = output.argmax(dim=1)             #計算正確數量             total += label.size(0)             correct += (predict == label).sum().item()         #計算損失值         print("test_avarage_loss: {:.6f}, accuracy: {:.6f}%".format(test_loss/total, 100*(correct/total)))
  (6)执行训练与测试 if __name__=="__main__":     epoch = 5     Loss = []     Accuracy = []     for epoch in range(1, epoch + 1):         print("start_time", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))         loss, acc = train_runner(model, device, trainloader, optimizer, epoch)         Loss.append(loss)         Accuracy.append(acc)         test_runner(model, device, testloader)         print("end_time: ", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())), " ")     print(model)     torch.save(model, "./models/model-mnist.pth") #儲存模型     print("Finished Training")     plt.subplot(2, 1, 1)     plt.plot(Loss)     plt.title("Loss")     plt.show()     plt.subplot(2, 1, 2)     plt.plot(Accuracy)     plt.title("Accuracy")     plt.show()
  (7)保存网络模型 print(model) torch.save(model, "./models/model-mnist.pth") #儲存模型

2022年,财税专家提出房产税新方案?人均免征40平,有人交3。6万众所周知,房产税提出了很多年,但是截止目前还没有全面落地,只是有部分城市在搞试行,其主要原因就是因为自进入2022年以来,楼市突如其来的下跌导致这个关键点不适合大面积覆盖房产税。但房贷利率普降,部分城市低至2。6!算算能省多少钱对于贷款买房的消费者来说房贷利率是购房决策中的重要考量因素还贷年限多长房贷利率多高一定程度上影响着消费者的购房意愿近日,随着人民银行银保监会发布关于阶段性调整差别化住房信贷政策的通今年螃蟹价格缘何两重天?大皖新闻讯金九银十,正是吃蟹的好时候,肥美的大闸蟹引得无数食客尽垂涎。今年螃蟹的供应量销量以及价格情况如何?10月19日,大皖新闻记者以合肥为例进行了探访调查。直播间螃蟹销售火爆但2022年4050补贴正在发放,谁能申请?补贴标准?准备哪些材料?虽然灵活就业人员参加职工社保后,享受的退休待遇与在职员工退休一模一样,无奈灵活就业人员社保缴费全部由个人承担,缴费压力比较大。随着全口径城镇就业人员平均工资的提高,灵活就业人员社保一年开店10000家,中国零售之王闷声发财中国便利店市场这块巨大的蛋糕,迟早要诞生一个千亿巨头。01hr广东,每隔一百米就有一家美宜佳罗森便利店居然在广州开业了。今年国庆假期前,罗森便利店进驻广州,开了本地第一家门店。9月科普动起来天干物燥森林火险等级高,火灾隐患突出森林防火形势严峻,为此小编特意为大家准备了一些森林防火小知识,快来一起学习吧01森林防火的含意是什么?是指森林林木和林地火灾的预防和扑救。02森交易笔记仅供本人自己操作参考,他人不作为依据。自己对自己的交易行为负责。1。pk,日线级别,近期走势能否看作一个完整的三浪上行?我认为不能看做完整的三浪上行,这一波下跌并没有跌破第二浪回调学生党入手一加AcePro一个月实际体验如何?原神定制版建议闭眼入上个月,手上的iPhoneSE电池终于扛不住了,一天三充都搞不定,加上屏幕确实太小,就决定换机。不过作为一个精打细算的大学生,换手机也得追求高质量高性价比,在经过多番对比和了解后,地球上的无尽深渊,每年狂吞30亿吨海水,都去了哪里?宇航员从太空回望地球,映入眼帘的是一颗蓝色星球,地球表面70被海水所覆盖,即使在太阳系内地球上的含水量也是可以排上号的。水是生命之源,诞生生命和生命发展的必要条件之一就是必须要拥有被华人拯救的国家毛里求斯一个国家发行纸币,上面印什么都是很讲究的,要么印风景名胜,要么印重要领导人,又或者印国家的精神象征。但是这个世界上,除了我们中国的纸币印着中国人之外,还有一个国家都印了中国人在上面邮政发展切勿急功近利忘本丢根寄递业务市场竞争越来越激烈,民营公司不断推出提时限降资费的方法和手段,对邮政寄递业务市场形成了强大冲击,邮政寄递业务发展压力巨大,受市场竞争的因素,不断做出应对措施,强化自身能力,
钱查尔人们认为小迈克尔波特不能防守,但是他可以今天NBA常规赛掘金主场迎战快船的比赛已经结束。全场战罢,掘金以12291战胜快船。本场比赛,掘金球员弗拉特科钱查尔出战26分钟,12投6中,其中三分球3投1中,罚球2投2中,得到CBA最新排名辽宁反超排第二,首钢虐菜小能手,马布里下课6连败CBA联赛继续上演了多场经典较量,在这一轮比赛结束之后,积分榜发生了较大的变化,不少传统强队也都在第二阶段当中拿到稳定的战绩,排名有了较大的提升。下面就给大家带来关于CBA联赛最新徐梦桃出书张伟丽打CALL刘兰芳开讲河南日报客户端记者黄晖北京冬奥会自由式滑雪女子空中技巧决赛,31岁的徐梦桃在自己的第四次冬奥之旅中惊险夺冠后哭着大喊我是第一吗?观者无不动容。出征,失意,再出征在北京收获一枚冬奥金西甲联赛赫罗纳22巴列卡诺图亚尼读秒绝杀被吹本场西甲联赛由主场赫罗纳对上巴列卡诺客队,北京时间12月30日对战正式敲响,最终双方以22的比分由赫罗纳战平巴列卡诺本场西甲联赛平局结束。赫罗纳总体西甲攻防数据在西甲联赛中排名12好酸!C罗好友梅西会拿世界杯来交换一份C罗在沙特的合同1月6日消息,在C罗加盟沙特豪门利雅得胜利之后,他的好友西班牙六台的记者EduAguirre接受了节目专访,他表示,梅西会拿世界杯来交换C罗的这份合同。12月31日,C罗宣布加盟沙盘点国内几个最值得去的大熊猫基地,这里还有机会野外偶遇哦!说到大熊猫,相信大家首先想到的就是它的外表,看起来呆萌可爱,但实际上却是个一巴掌能拍出相当于500公斤重量的糙汉子。但却不妨碍大家对大熊猫的喜爱。它的出现其实比人类还要早,但现如今同时拥有iPhone14Pro和小米11的机主,现在心态崩了大家留意到最新消息没有?iPhone14Pro疑似烧屏,出现屏幕损坏的迹象。大概情况是这样的,灵动岛烧屏留下了明显的黑色痕迹,可能是灵动岛长时间处于激活状态导致,才会导致这个情况,今年赚钱不多,但是幸福感越来越强2022你存下钱了吗今年赚钱不多,没有存下钱,但是幸福感越来越强,根源不过就是内外兼修的期践不断降低欲望不断提升自己的认知能力今年学会的一个功课,就是拒绝无效社交。更多时间陪伴家人还记得詹姆斯上一次得分不足10分是什么时候吗?勒布朗詹姆斯以其不可思议的能力而闻名,他能在职业篮球生涯中的任何时刻回忆特定的时刻,无论是几分钟前还是几年前。但本周早些时候,当被问及他周四达到的里程碑时,詹姆斯被难住了。他在常规女神胡美净身出户,独自抚养两儿子,朱芳雨再婚生子,身价过亿说起朱芳雨,相信大家都是非常熟悉的,他是中国男篮历史上最优秀的小前锋之一,拥有一手非常出众的进攻技术,由于身体强壮,防守能力也很强,完全不怵很多欧美的球员,值得一提的是,朱芳雨曾经ampamplt萨克拉门托国王ampampgt你甚至不愿叫我一声绝杀之王篮球比赛中绝杀的定义是球队在最后时刻或接近最后时刻投进了关系胜败的球它的重要之处在于,在比赛接近结束却比分落后对手的情况下,得到反超比分的分数,不给对手留下反超的机会,以此反败为胜