智慧交通day02-车流量检测实现12:基于yoloV3的目标检测

在本章节代码编写中,发现之前的代码所处的环境是python3,因此导致了cv2.dnn.readNetFromDarknet()在代码运行中导致了i[0]的获值失败,故总结如下:

cv2.dnn.readNetFromDarknet()在python3上遇到的问题_李大狗的读研日记-CSDN博客问题描述:代码如下net = cv2.dnn.readNetFromDarknet(configPath,weightsPath)#获取YOLO每一层的名称#getLayerNames():获取网络所有层的名称。ln = net.getLayerNames()# 获取输出层的名称: [yolo-82,yolo-94,yolo-106]# getUnconnectedOutLayers():获取输出层的索引ln = [ln[i[0] - 1] for i in net.getUnconnhttps://blog.csdn.net/qq_39237205/article/details/121344325

正片如下


在这里我们进行的目标检测是基于OPenCV的利用yoloV3进行目标检测,不涉及yoloV3的模型结构、理论及训练过程,只是利用训练好的模型进行目标检测,整个流程如下:

基于OPenCV中的DNN模块

  • 加载已训练好的yolov3模型及其权重参数
  • 将要处理的图像转换成输入到模型中的blobs
  • 利用模型对目标进行检测
  • 遍历检测结果
  • 应用非极大值抑制
  • 绘制最终检测结果,并存入到ndarray中,供目标追踪使用。

代码如下:

1.加载yolov3模型及其权重参数

# 1.加载可以识别物体的名称,将其存放在LABELS中,一共有80种,在这我们只使用car
labelsPath = "./yolo-coco/coco.names"
LABELS = open(labelsPath).read().strip().split("\n")# 设置随机数种子,生成多种不同的颜色,当一个画面中有多个目标时,使用不同颜色的框将其框起来
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(200, 3),dtype="uint8")# 加载已训练好的yolov3网络的权重和相应的配置数据
weightsPath = "./yolo-coco/yolov3.weights"
configPath = "./yolo-coco/yolov3.cfg"# 加载好数据之后,开始利用上述数据恢复yolo神经网络
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
# 获取YOLO中每一网络层的名称:['conv_0', 'bn_0', 'relu_0', 'conv_1', 'bn_1', 'relu_1', 'conv_2', 'bn_2', 'relu_2'...]
ln = net.getLayerNames()
# 获取输出层在网络中的索引位置,并以列表的形式:['yolo_82', 'yolo_94', 'yolo_106']
ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]

2.要处理的图像转换成输入到模型中的blobs

# 2. 读取图像
frame = cv2.imread("./images/car1.jpg")
# 视频的宽度和高度,即帧尺寸
(W, H) = (None, None)
if W is None or H is None:(H, W) = frame.shape[:2]# 根据输入图像构造blob,利用OPenCV进行深度网路的计算时,一般将图像转换为blob形式,对图片进行预处理,包括缩放,减均值,通道交换等
# 还可以设置尺寸,一般设置为在进行网络训练时的图像的大小
blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416), swapRB=True, crop=False)

3.利用模型对目标进行检测

# 3.将blob输入到前向网络中,并进行预测
net.setInput(blob)
start = time.time()
# yolo前馈计算,获取边界和相应的概率
# 输出layerOutsputs介绍:
# 是YOLO算法在图片中检测到的bbx的信息
# 由于YOLO v3有三个输出,也就是上面提到的['yolo_82', 'yolo_94', 'yolo_106']
# 因此layerOutsputs是一个长度为3的列表
# 其中,列表中每一个元素的维度是(num_detection, 85)
# num_detections表示该层输出检测到bbx的个数
# 85:因为该模型在COCO数据集上训练,[5:]表示类别概率;[0:4]表示bbx的位置信息;[5]表示置信度
layerOutputs = net.forward(ln)

4.遍历检测结果,获得检测框

# 下面对网络输出的bbx进行检查:
# 判定每一个bbx的置信度是否足够的高,以及执行NMS算法去除冗余的bbxboxes = []  # 用于存放识别物体的框的信息,包括框的左上角横坐标x和纵坐标y以及框的高h和宽w
confidences = []  # 表示识别目标是某种物体的可信度
classIDs = []  # 表示识别的目标归属于哪一类,['person', 'bicycle', 'car', 'motorbike'....]# 4. 遍历每一个输出层的输出
for output in layerOutputs:# 遍历某个输出层中的每一个目标for detection in output:scores = detection[5:]  # 当前目标属于某一类别的概率classID = np.argmax(scores)  # 目标的类别IDconfidence = scores[classID]  # 得到目标属于该类别的置信度# 只保留置信度大于0.3的边界框,若图片质量较差,可以将置信度调低一点if confidence > 0.3:# 将边界框的坐标还原至与原图片匹配,YOLO返回的是边界框的中心坐标以及边界框的宽度和高度box = detection[0:4] * np.array([W, H, W, H])(centerX, centerY, width, height) = box.astype("int") # 使用 astype("int") 对上述 array 进行强制类型转换,centerX:框的中心点横坐标, centerY:框的中心点纵坐标,width:框的宽度,height:框的高度x = int(centerX - (width / 2))  # 计算边界框的左上角的横坐标y = int(centerY - (height / 2))  # 计算边界框的左上角的纵坐标# 更新检测到的目标框,置信度和类别IDboxes.append([x, y, int(width), int(height)])  # 将边框的信息添加到列表boxesconfidences.append(float(confidence))  # 将识别出是某种物体的置信度添加到列表confidencesclassIDs.append(classID) # 将识别物体归属于哪一类的信息添加到列表classIDs

5.非极大值抑制

# 5. 非极大值抑制
idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3)

6.最终检测结果,绘制,并存入到ndarray中,供目标追踪使用

# 6. 获得最终的检测结果
dets = []  # 存放检测框的信息,包括左上角横坐标,纵坐标,右下角横坐标,纵坐标,以及检测到的物体的置信度,用于目标跟踪
if len(idxs) > 0:  # 存在检测框的话(即检测框个数大于0)for i in idxs.flatten():  #  循环检测出的每一个box# yolo模型可以识别很多目标,因为我们在这里只是识别车,所以只有目标是车的我们进行检测,其他的忽略if LABELS[classIDs[i]] == "car":(x, y) = (boxes[i][0], boxes[i][1])  # 得到检测框的左上角坐标(w, h) = (boxes[i][2], boxes[i][3])  # 得到检测框的宽和高cv2.rectangle(frame, (x, y), (x+w, y+h), (0,255,0), 2)  # 将方框绘制在画面上dets.append([x, y, x + w, y + h, confidences[i]])  # 将检测框的信息的放入dets中
# 设置数据类型,将整型数据转换为浮点数类型,且保留小数点后三位
np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})
# 将检测框数据转换为ndarray,其数据类型为浮点型
dets = np.asarray(dets)plt.imshow(frame[:,:,::-1])

在视频中进行目标检测:

labelsPath = "./yolo-coco/coco.names"
LABELS = open(labelsPath).read().strip().split("\n")# 设置随机数种子,生成多种不同的颜色,当一个画面中有多个目标时,使用不同颜色的框将其框起来
np.random.seed(42)
COLORS = np.random.randint(0, 255, size=(200, 3),dtype="uint8")# 加载已训练好的yolov3网络的权重和相应的配置数据
weightsPath = "./yolo-coco/yolov3.weights"
configPath = "./yolo-coco/yolov3.cfg"# 加载好数据之后,开始利用上述数据恢复yolo神经网络
net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)
# 获取YOLO中每一网络层的名称:['conv_0', 'bn_0', 'relu_0', 'conv_1', 'bn_1', 'relu_1', 'conv_2', 'bn_2', 'relu_2'...]
ln = net.getLayerNames()
# 获取输出层在网络中的索引位置,并以列表的形式:['yolo_82', 'yolo_94', 'yolo_106']
ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]"""
视频处理类
"""# 初始化vediocapture类,参数指定打开的视频文件,也可以是摄像头
vs = cv2.VideoCapture('./input/test_1.mp4')
# 视频的宽度和高度,即帧尺寸
(W, H) = (None, None)
# 视频文件写对象
writer = Nonetry:# 确定获取视频帧数的方式prop = cv2.cv.CV_CAP_PROP_FRAME_COUNT if imutils.is_cv2() \else cv2.CAP_PROP_FRAME_COUNT# 获取视频的总帧数total = int(vs.get(prop))# 打印视频的帧数print("[INFO] {} total frames in video".format(total))
except:print("[INFO] could not determine # of frames in video")print("[INFO] no approx. completion time can be provided")total = -1# 循环读取视频中的每一帧画面
while True:# 读取帧:grabbed是bool,表示是否成功捕获帧,frame是捕获的帧(grabbed, frame) = vs.read()# 若未捕获帧,则退出循环if not grabbed:break# 若W和H为空,则将第一帧画面的大小赋值给他if W is None or H is None:(H, W) = frame.shape[:2]# 根据输入图像构造blob,利用OPenCV进行深度网路的计算时,一般将图像转换为blob形式,对图片进行预处理,包括缩放,减均值,通道交换等# 还可以设置尺寸,一般设置为在进行网络训练时的图像的大小blob = cv2.dnn.blobFromImage(frame, 1 / 255.0, (416, 416), swapRB=True, crop=False)# 将blob输入到前向网络中net.setInput(blob)start = time.time()# yolo前馈计算,获取边界和相应的概率layerOutputs = net.forward(ln)"""输出layerOutsputs介绍:是YOLO算法在图片中检测到的bbx的信息由于YOLO v3有三个输出,也就是上面提到的['yolo_82', 'yolo_94', 'yolo_106']因此layerOutsputs是一个长度为3的列表其中,列表中每一个元素的维度是(num_detection, 85)num_detections表示该层输出检测到bbx的个数85:因为该模型在COCO数据集上训练,[5:]表示类别概率;[0:4]表示bbx的位置信息;[5]表示置信度"""end = time.time()"""下面对网络输出的bbx进行检查:判定每一个bbx的置信度是否足够的高,以及执行NMS算法去除冗余的bbx"""boxes = []  # 用于存放识别物体的框的信息,包括框的左上角横坐标x和纵坐标y以及框的高h和宽wconfidences = []  # 表示识别目标是某种物体的可信度classIDs = []  # 表示识别的目标归属于哪一类,['person', 'bicycle', 'car', 'motorbike'....]# 遍历每一个输出层的输出for output in layerOutputs:# 遍历某个输出层中的每一个目标for detection in output:scores = detection[5:]  # 当前目标属于某一类别的概率"""# scores = detection[5:] ---> [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.#                                 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.#                               0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.#                                 0. 0. 0. 0. 0. 0. 0. 0.]# scores的大小应该是1*80,因为在训练yolo模型时是80类目标"""classID = np.argmax(scores)  # 目标的类别IDconfidence = scores[classID]  # 得到目标属于该类别的置信度# 只保留置信度大于0.3的边界框,若图片质量较差,可以将置信度调低一点if confidence > 0.3:# 将边界框的坐标还原至与原图片匹配,YOLO返回的是边界框的中心坐标以及边界框的宽度和高度box = detection[0:4] * np.array([W, H, W, H])(centerX, centerY, width, height) = box.astype("int") # 使用 astype("int") 对上述 array 进行强制类型转换,centerX:框的中心点横坐标, centerY:框的中心点纵坐标,width:框的宽度,height:框的高度x = int(centerX - (width / 2))  # 计算边界框的左上角的横坐标y = int(centerY - (height / 2))  # 计算边界框的左上角的纵坐标# 更新检测到的目标框,置信度和类别IDboxes.append([x, y, int(width), int(height)])  # 将边框的信息添加到列表boxesconfidences.append(float(confidence))  # 将识别出是某种物体的置信度添加到列表confidencesclassIDs.append(classID) # 将识别物体归属于哪一类的信息添加到列表classIDs# 上一步中已经得到yolo的检测框,但其中会存在冗余的bbox,即一个目标对应多个检测框,所以使用NMS去除重复的检测框# 利用OpenCV内置的NMS DNN模块实现即可实现非最大值抑制 ,所需要的参数是边界 框、 置信度、以及置信度阈值和NMS阈值# 第一个参数是存放边界框的列表,第二个参数是存放置信度的列表,第三个参数是自己设置的置信度,第四个参数是关于threshold(阈值# 返回的idxs是一个一维数组,数组中的元素是保留下来的检测框boxes的索引位置idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3)dets = []  # 存放检测框的信息,包括左上角横坐标,纵坐标,右下角横坐标,纵坐标,以及检测到的物体的置信度,用于目标跟踪if len(idxs) > 0:  # 存在检测框的话(即检测框个数大于0)for i in idxs.flatten():  #  循环检测出的每一个box# yolo模型可以识别很多目标,因为我们在这里只是识别车,所以只有目标是车的我们进行检测,其他的忽略if LABELS[classIDs[i]] == "car":(x, y) = (boxes[i][0], boxes[i][1])  # 得到检测框的左上角坐标(w, h) = (boxes[i][2], boxes[i][3])  # 得到检测框的宽和高dets.append([x, y, x + w, y + h, confidences[i]])  # 将检测框的信息的放入dets中# 设置数据类型,将整型数据转换为浮点数类型,且保留小数点后三位np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})# 将检测框数据转换为ndarray,其数据类型为浮点型dets = np.asarray(dets)

总结

基于OPenCV的DNN模块利用yoloV3模型进行目标检测:

  • 加载已训练好的yolov3模型及其权重参数
  • 将要处理的图像转换成输入到模型中的blobs
  • 利用模型对目标进行检测
  • 遍历检测结果,应用非极大值抑制
  • 绘制最终检测结果,并存入到ndarray中,供目标追踪使用。

yolo.py 【实现对图片的目标检测】

# encoding:utf-8import imutils
import time
import cv2
import numpy as np
import matplotlib.pyplot as plt
#利用yolov3模型进行目标检测
#加载模型相关信息
#加载可以检测的目标的类型#labelPath:类别标签文件的路径
labelPath = "./yolo-coco/coco.names"# 加载类别标签文件
LABELS = open(labelPath).read().strip().split("\n")#生成多种不同的颜色的检测框 用来标注物体
np.random.seed(42)
COLORS = np.random.randint(0,255,size=(200,3),dtype='uint8')#加载预训练的模型:权重 配置信息、进行恢复模型
#weights_path:模型权重文件的路径
weightsPath = "./yolo-coco/yolov3.weights"
#configPath:模型配置文件的路径
configPath = "./yolo-coco/yolov3.cfg"net = cv2.dnn.readNetFromDarknet(configPath,weightsPath)
#获取YOLO每一层的名称
#getLayerNames():获取网络所有层的名称。
ln = net.getLayerNames()
# 获取输出层的名称: [yolo-82,yolo-94,yolo-106]
# getUnconnectedOutLayers():获取输出层的索引
ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]#图像的读取
frame = cv2.imread('./images/car1.jpg')
(W,H)=(None,None)
(H,W)=frame.shape[:2]# 将图片构建成一个blob,设置图片尺寸,然后执行一次前向传播
# YOLO前馈网络计算,最终获取边界框和相应概率
blob = cv2.dnn.blobFromImage(frame,1/255.0,(416,416),swapRB=True,crop=False)
#将blob送入网络
net.setInput(blob)
start = time.time()
#前向传播,进行预测,返回目标框的边界和响应的概率
layerOutouts = net.forward(ln)
end = time.time()#存放目标的检测框
boxes = []
#置信度
confidences = []
#目标类别
classIDs = []# 迭代每个输出层,总共三个
for output in layerOutouts:#遍历每个检测结果for detection in output:# 提取类别ID和置信度#detction:1*85 [5:]表示类别,[0:4]bbox的位置信息 [5]置信度、可信度scores = detection[5:]classID = np.argmax(scores)confidence= scores[classID]# 只保留置信度大于某值的边界框if confidence >0.3:# 将边界框的坐标还原至与原图片相匹配,记住YOLO返回的是边界框的中心坐标以及边界框的宽度和高度box = detection[0:4] * np.array([W, H, W, H])(centerX,centerY,width,height) = box.astype("int")# 计算边界框的左上角位置x = int(centerX-width/2)y = int(centerY-height/2)# 更新目标框,置信度(概率)以及类别boxes.append([x,y,int(width),int(height)])confidences.append(float(confidence))classIDs.append(classID)# 使用非极大值抑制方法抑制弱、重叠的目标框
idxs = cv2.dnn.NMSBoxes(boxes,confidences,0.5,0.3)
#检测框的结果:左上角坐标、右下角坐标
dets = []# 确保至少有一个边界框
if len(idxs)>0:# 迭代每个边界框for i in idxs.flatten():# 提取边界框的坐标if LABELS[classIDs[i]] == "car":(x,y)=(boxes[i][0],boxes[i][1])(w,h)=(boxes[i][2],boxes[i][3])cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)dets.append([x,y,x+w,y+h,confidences[i]])
# 类型设置
np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})
dets = np.asarray(dets)#显示
plt.imshow(frame[:,:,::-1])
plt.show()

结果显示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非线性回归(Non-linear Regression)

非线性回归应用(Logistic Regression Application) 理论实际应用整合到一起链接 import numpy as np import random# 一个函数为梯度下降的算法 def GradientDescent(x,y,theta,alpha,m,numInterations):# m denotes the number of examples here, not…

cv2.dnn.readNetFromDarknet()在python3上遇到的问题

问题描述: 代码如下 net cv2.dnn.readNetFromDarknet(configPath,weightsPath) #获取YOLO每一层的名称 #getLayerNames():获取网络所有层的名称。 ln net.getLayerNames() # 获取输出层的名称: [yolo-82,yolo-94,yolo-106] # …

企业的网站遭受木马攻击了,导致网站目录下所有文件都被篡改了

问题&#xff1a; 一个 lamp 的服务器站点目录下所有文件均被植入如下内容 <script languagejavascript srchttp://luoahong.blog.51cto.com/504977/1827164> 包括图片文件也被植入了&#xff0c;网站打开时就会调用这个地址&#xff0c;造成的影响很恶劣。 实际解决办法…

智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析

1.基于虚拟线圈法的车辆统计 基于虚拟线圈的车流量统计算法原理与交通道路上的常见的传统的物理线圈类似&#xff0c;由于物理线圈需要埋设在路面之下&#xff0c;因此会有安装、维护费用高&#xff0c;造成路面破坏等问题&#xff0c;而采用基于视频的虚拟线圈的车辆计数方法…

ValueError: Found array with dim 4. Estimator expected和ValueError: Expected 2D array, got 1D array i

python3中对numpy数组进行降维或升维 解决报错如&#xff1a; 1.ValueError: Found array with dim 4. Estimator expected 2.ValueError: Expected 2D array, got 1D array instead: 报错1ValueError: Found array with dim 4. Estimator expected——解决方式&#xff1a…

ubuntu 12.04 eclipse 安装

方法二&#xff1a;(优点是安装内容清爽&#xff0c;缺点是配置麻烦) 1、安装JDK&#xff0c;参考 Ubuntu 12.04 下安装 JDK 7 2、下载 Eclipse 从 http://www.eclipse.org/downloads/index-developer.php下载合适版本&#xff0c;如&#xff1a;Eclipse IDE for C/C Develope…

智慧交通day02-车流量检测实现14:代码汇总+问题修正

代码权重文件资源https://download.csdn.net/download/qq_39237205/43072746https://download.csdn.net/download/qq_39237205/43072746 环境要求&#xff1a;python2.7 环境配置&#xff1a;见文末requirements.txt 1.YOLO.py # encoding:utf-8 import imutils import tim…

终端mysql Operation not permitted错误解决方案

前言 前段时间装mysql&#xff0c;就遇到了ln: /usr/bin/mysql: Operation not permitted的错误&#xff0c;网上好多方法都过时了&#xff0c;下边是我的解决方法 原因 这是因为苹果在OS X 10.11中引入的SIP特性使得即使加了sudo&#xff08;也就是具有root权限&#xff09;也…

从资源池和管理的角度理解物理内存

早就想搞一下内存问题了&#xff01;这次正趁着搞bigmemory内核&#xff0c;可以写一篇文章了。本文旨在记录&#xff0c;不包含细节&#xff0c;细节的话&#xff0c;google&#xff0c;百度均可&#xff0c;很多人已经写了不少了。我只是按照自己的理解记录一下内存的点点滴滴…

TypeError: object of type 'zip' has no len()、'zip' object is not subscriptable

TypeError: object of type ‘zip’ has no len()、‘zip’ object is not subscriptable zip 对象没有length属性不可以遍历 代码报错&#xff1a; print(len(training_data)) # TypeError: object of type zip has no len() print(training_data[0][0].shape) # TypeError…

【VBA编程】06.控制语句

【IF...THEN...语句】 If condition Then [statements1] else [statements2] end if condition 为一个逻辑表达式&#xff0c;表示做选择时需要判别的条件&#xff0c;其结果为布尔类型&#xff0c;当其值为真时&#xff0c;执行statements1语句&#xff0c;为假是则执行ELSE中…

从头开始学一个android activity

一、类层次结构&#xff1a; 二、什么是Activity&#xff0c;如何理解Activity 1、 用户与应用程序的交互的接口 2、 控件的容器&#xff0c;我们要把控件摆放在这个容器中 三、如何创建一个Activity 新建一个类&#xff1a; 1、 继承Activity类 [java] view plaincopyprint…

python3 numpy中矩阵np.dot(a,b)乘法运算

python np.dot(a,b)乘法运算 首先我们知道矩阵运算是不满足交换律的&#xff0c;np.dot(a, b)与np.dot(b, a)是不一样的 另外np.dot(a,b)和a.dot(b)果是一样的 1.numpy中数组&#xff08;矩阵&#xff09;相乘np.dot(a,b)运算&#xff1a; 对于两数组a和b &#xff1a; 示例…

MySQL数据库优化的八种方式(经典必看)

引言&#xff1a; 关于数据库优化&#xff0c;网上有不少资料和方法&#xff0c;但是不少质量参差不齐&#xff0c;有些总结的不够到位&#xff0c;内容冗杂 偶尔发现了这篇文章&#xff0c;总结得很经典&#xff0c;文章流量也很大&#xff0c;所以拿到自己的总结文集中&#…

class_create和class_device_create

//主要是在/sys/class/ 下创建一个 “name”的文件夹 &#xff01;从linux内核2.6的某个版本之后&#xff0c;devfs不复存在&#xff0c;udev成为devfs的替代。相比devfs&#xff0c;udev有很多优势&#xff0c;在此就不罗嗦了&#xff0c;提醒一点&#xff0c;udev是应用层的东…

OSError: [Errno 22] Invalid argument:**

OSError: [Errno 22] Invalid argument: 在使用open打开文件时&#xff0c;出现报错 OSError: [Errno 22] Invalid argument: H:\\GitRepository\neural-networks-and-deep-learning\\data\\mnist_expanded.pkl.gzpython3 可以将 \ 换为 / &#xff0c;或者换成 \ 但是最简单…

阅读英文论文的方法总结(三遍法)

1.title 2.abstract 3.introduction 4.method 5.experiments 6.conclusion 第一遍&#xff1a;标题、摘要、结论&#xff0c;看是否自己研究的相关&#xff0c;看完之后可以看部分实验和方法里的关键图和表&#xff0c;这样可以花费十几分钟时间了解到论文是否适合你的研究方向…

ML Backpropagation算法的计算过程举例

Backpropagation计算过程举例 初始权重(initialize weights)是随机产生的(如-1~1之间) 初始化可以选择均值为0&#xff0c;方差为1/n_in的正态分布&#xff0c;n_in为输入的实例个数&#xff0c;Python中可使用np.random.normal函数来初始化权重&#xff1a; np.random.normal…