首页
学习
活动
专区
圈层
工具
发布

多注释:用PyTorch实现卷积神经网络对MNIST手写数字数据集的分类

参考链接: 卷积神经网络在mnist数据集上的应用 Python 本文将为尽可能多的代码作注释,用PyTorch实现对手写数字数据集MNIST的分类,我也是一个PyTorch的初学者,如果你也是一个刚学...GPU,跑这个特别慢,我就跑3个epoch意思一下,大概需要两个小时左右,做好心理准备 ########################  数据读取   ########################...(),   #ToTensor()把图片转换成张量形式Tensor,在转化的过程中自动把图片标准化了,也就是说Tensor的范围是0~1,      transforms.Normalize([0.5]...,他得到的是 数据对应的编号 i, 和 数据data         img,label=data         if torch.cuda.is_available():             img...1,不同则会为0 #print (p) #d1 = p.sum() #将所有的值相加,得到的仍是tensor类别的int值 #print (d1) #d2 = d1.item() #转成python数字

1.6K00

cuda编程基础(建站)

大家好,又见面了,我是你们的朋友全栈君。...一:新建CUDA项目流程(VS2013下) 1.新建项目(file->New->Project) 2.在项目列表中可以看见NVIDIA的CUDA项目(前提是你安装了CUDA) 选择项目,添加一些必要的信息...第三阶段(对核函数传递参数) 代码: 结果: 显而易见,上面那段代码是完成的两个整数相加的操作.但是两个整数相加是在GPU上面完成的.这里也开始真正进入了比较烧脑的阶段了....然后就是调用自己定义的核函数(设备函数)add来求和,这里要注意核函数的定义方式.在核函数add的函数体中,c能够解引用*c是因为c本身传入的就是一个设备指针.设备指针能够在设备代码中读写解引用.函数的作用也就是得到的结果放入设备地址开辟的内存中...然后c中的内容就是得到的结果了.只是这个结果有点曲折.(先开辟显存,计算出结果放在显存里面,把结果从显存复制到主机内存) 用cudaFree()函数释放设备的地址.

92410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    PyTorch(总)---PyTorch遇到令人迷人的BUG与记录

    如果输入的为int64的numpy,得到LongTensor类型: ? 如果把int32的数组转换为LongTensor,则会出错: ? 如果把int64的数组转换为LongTensor,正常: ?...我以为显卡除了问题,最后在pytoch#1204中发现一个人的标签中出现-1,发生了类似的错误: ? 而我的标签为1~10,最后把标签定义为1~9,解决这个问题。^_^!...也就是在定义时并没有把weight参数传入gpu中,在调用网络进行计算时,如果传入的数据为GPU数据,则会出现:tensors are on different GPUs 错误,因此使用torch.nn.Module.cuda...可以把定义的网络参数传入gpu中。...在NOTE3中的代码后面增加如下(更新权重参数): ? 其运行结果为: ? 可见使用optimizer.step()实现了网络权重的更新。

    2.9K80

    【ML】机器学习介绍

    在我们理解机器学习之前,让我们先来谈谈为什么需要机器学习,以及我们为什么要关心它? 如果我让你写一个两个数字相加的程序,你可能会写它,但是如果我让你用同一个程序做乘法呢? 它还可以工作吗?...是的 这就是机器学习的用武之地,不需要用硬编码的规则编写程序,让系统理解逻辑并产生期望的结果。 因此证明。 现在让我们谈谈怎么样?? 下面的图片解释清楚 因此,我们给出的不是程序/逻辑,而是输出。...例如,两个数字相加,对于传统的编程,我们给出数据和逻辑,a=2, b=3,然后我们得到答案5。 对于机器学习我们给出a=2 b=3输出= 5所以系统理解它,为什么2,3等于5 ?...加法任务的数据如下。 最后我们问,5,6的结果是什么 我们得到的输出是11(实际上可能是10。989或11。01等等。取决于我们提供的数据)。 "数据越多,结果越好" 那么什么是机器学习呢?...在下一篇文章中,我想谈谈不同类型的机器学习(什么,如何,为什么) 再见!

    61220

    LeetCode 01两数之和&02两数相加

    LeetCode01两数之和 题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。...本题主要有暴力和哈希两种方法: 法一:暴力法 把所有两两配对的问题全部遍历出来,知道找到满足题意得结果为止,时间复杂度O(n2) ?...如果遇到两个同元素就错误了,能不能又正确再简单一点? 答案是可以的,其实我们不需要用hash存储所有,边走边存即可。为什么我们可以这么考虑?...其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。...通过代码第一次比较啰嗦的写法: 当然,如果你遍历链表把各个数字取出来,使用字符串、数字转换然后相加得到一个数字,最后在转成字符串、链表的理论可以,可以自行实现。

    45820

    为什么计算机中的负数要用补码表示?

    在计数的过程中,当某一位满 2 时,就需要向它临近的高位进一,即逢二进一; 八进制和十六进制同理。 那么,为什么计算机要使用二进制数制,而不是人类更熟悉的十进制呢?...机器数才是数字在计算机中的二进制表示。 例如在前面的数字中, +1110 是真值,而 0000, 1110 是机器数。...,而包含负数的加法运算的结果却是错误的,会出现 -14 - 1 = 15 和 14 - 1 = -15 这种错误结果。...所以,带负数的加法运算就不能使用常规的按位加法运算了,需要做特殊处理: 两个正数相加: 直接做按位加法。 两个负数相加: 1、用较大的绝对值 + 较小的绝对值(加法运算); 2、最终结果的符号为负。...和 -1110 转换得到的 0000, 1110 和 1000, 1110 就是原码表示法,所以原码在进行数字运算时会存在前文提到的效率问题; 2、反码: 反码一般认为是原码和补码转换的中间过渡; 3、

    3.5K11

    TASK 6 resnet

    由于我们初始化权重值的时候一般从标准正态分布中采样,所以权重w的绝对值通常小于1,因此我们可以得到: 在深度网络中,为了计算初始层的梯度,我们会累乘多个 再由于公式 最终计算结果将会呈指数级变小,这也就是梯度丢失产生的原因...右图的目的就是为了降低参数的数目:第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复。...然而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。 对于常规ResNet,可以用于34层或者更少的网络中。...install tensorflow-gpu=1.7 为什么解决方案1可行 我最开始有疑惑,安装tensorflow-gpu要求事先安装好相应版本的cudatoolkit和cudnn。...正是因为虚拟机预先安装的cuda和cudnn版本不高,我才只能安装低版本的tf。

    68540

    小 bug 引发大灾难,0.1 + 0.2 的结果竟然是……

    各位观众点进标题看文章的时候,我已经准备打包行李去UC报道啦~ 冷笑话结束,嗯,说正事。 请大家思考一下在 python 控制台输入 0.1 + 0.2 == 0.3 ,返回的结果是什么?...没错 ,不管是在 Python,还是 C++、Java、JavaScript 等其他语言中,都是 False。 为什么会出现这样的结果?...具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。...所以当两个存在误差的数相加,其结果也必定会出现误差,这就解释了在计算机中为什么 0.1 + 0.2 不等于 0.3。...避免在同一个表达式中使用相差太大或太小的数值。将很小的数值和很大数值相加,小的数值很可能被当作 0。

    1K90

    pytorch学习笔记(九):卷积神经网络CNN(基础篇)

    在上一篇中,使用了全连接网络进行手写数字识别的分类。 准确率为97% 本次,将采用卷积神经网络的方法,提升准确率。 目录 1、什么是卷积?...具体过程如下图所示: 2、对RGB图像进行卷积 对一副图像而言,存在RGB三个通道,因此需要三个卷积核,每个卷积核分别对每个通道做卷积,最后把三个通道的卷积结果相加,形成一个矩阵。...3、对N个通道的图像进行卷积 由于卷积核是对每个通道的图像进行卷积运算,因此n个通道必须对应n个卷积核,最后将卷积结果相加到一个通道,所以输出通道数为1。...在程序中,添加stride参数即可 6、池化(Pooling)的概念 池化也叫下采样(这里看到有人说这两个概念不完全等价,不过作为初学者,暂且将其理解为同一个事物) 下采样的“下”即让图像维度向下...320是通过手动计算出来的,在程序中,改成-1,计算机会自动帮我们计算这个数值。

    93031

    为什么0.1+0.2不等于0.3?

    打开你的 Python,输入「0.1+0.2=」,结果是多少?0.30000000000000004 对不对?为什么结果不是 0.3?本文作者给出了详细的解释。...但是,在光怪陆离的计算世界中,运算方式却大相径庭。 我最近开始用 JavaScript 进行编码,在阅读数据类型时,我注意到 0.1 + 0.2 不等于 0.3 的奇怪行为。...我向 Stack Overflow 寻求帮助,在上面找到了一些有用的帖子。如下图所示: ? Stack Overflow 界面图像。 经过大量的研究和数学运算后,我得出结论,这不是错误。...这是数学运算中的浮点运算。让我们进一步了解内在机制。 问题描述: 为什么 0.1 + 0.2 = 0.30000000000000004?...这里,11 代表我们要使用的 64 位表示的指数位数,-4 代表科学计数中的指数。 所以最终数字 0.1 的表示形式是: ? 同理,0.2 表示为: ? 将两个数相加,得到: ?

    2K20

    为什么0.1+0.2不等于0.3?原来编程语言是这么算的……

    打开你的 Python,输入「0.1+0.2=」,结果是多少?0.30000000000000004 对不对?为什么结果不是 0.3?本文作者给出了详细的解释。...但是,在光怪陆离的计算世界中,运算方式却大相径庭。 我最近开始用 JavaScript 进行编码,在阅读数据类型时,我注意到 0.1 + 0.2 不等于 0.3 的奇怪行为。...我向 Stack Overflow 寻求帮助,在上面找到了一些有用的帖子。如下图所示: ? Stack Overflow 界面图像。 经过大量的研究和数学运算后,我得出结论,这不是错误。...这是数学运算中的浮点运算。让我们进一步了解内在机制。 问题描述: 为什么 0.1 + 0.2 = 0.30000000000000004?...这里,11 代表我们要使用的 64 位表示的指数位数,-4 代表科学计数中的指数。 所以最终数字 0.1 的表示形式是: ? 同理,0.2 表示为: ? 将两个数相加,得到: ?

    1.3K10

    你不会知道编程语言会把0.1+0.2算成多少

    开你的 Python,输入「0.1+0.2=」,结果是多少?0.30000000000000004 对不对?为什么结果不是 0.3?本文作者给出了详细的解释。...但是,在光怪陆离的计算世界中,运算方式却大相径庭。 我最近开始用 JavaScript 进行编码,在阅读数据类型时,我注意到 0.1 + 0.2 不等于 0.3 的奇怪行为。...我向 Stack Overflow 寻求帮助,在上面找到了一些有用的帖子。如下图所示: ? Stack Overflow 界面图像。 经过大量的研究和数学运算后,我得出结论,这不是错误。...这是数学运算中的浮点运算。让我们进一步了解内在机制。 问题描述:为什么 0.1 + 0.2 = 0.30000000000000004?...这里,11 代表我们要使用的 64 位表示的指数位数,-4 代表科学计数中的指数。 所以最终数字 0.1 的表示形式是: ? 同理,0.2 表示为: ? 将两个数相加,得到: ?

    1.4K20

    进制的本质

    什么是进制,进制的本质又是什么,为什么在计算的时候都会把十进制作为中间转换,其实这样的思维完全是错误的,进制的本质并不是我们熟悉的十进制。...进制的本质 进制的本质就是查表,与各种的转换没有任何关系,并不是说计算八进制,就把它转为十进制计算后再转回八进制,这种思想本来就是错误的,进制的本质就是写表和查表,我们之所以对十进制的特别熟悉,就是因为我们把十进制相关的表记住了...w=310&h=150&f=png&s=1955] 看图,当前数字为02,需要往后走一位,按照前面0、1、2的顺序来看,接下来,2应该往后走一位,但是后面没有数字了,就需要返回开始的数字重新来一遍,此时应该把这一轮结束的标志记录到前面...,两个5相加,查表的13,加上刚刚进位的1,通过查表可知结果为14,所以倒数第二位结果为4,1向前进位;4和3相加,查表得10,进位得11,结果为1,1向前进位;3和4相加,查表得10,进位得11,结果为...除法也是同样的方法。 变异的三进制运算 前面已经把正常情况下的进制转换和运算说清楚了,但为什么前面一直说它们是正常的,因为那些符合我们平常的运算概念,但是谁又规定三进制必须是0、1、2,我要是选!

    95520

    【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    十进制转化为二进制 假设我们将十进制数120转化为二进制数 得出的结果为1111000 进行转化的方法就是:这个数字%2,得到的余数写在一边,直到最后被除数为0时,再将数字从下往上抄上,这个数字即为十进制数字的二进制数...(在不足三个的前面添0使其补足三个更容易理解) 八进制转化为二进制 就是将每一位拆开,把每一位数字转化为其对应的二进制数字,最后抄在一起就可以了,即二进制转化为八进制的逆过程 二进制转化为十六进制 二进制转化为十六进制与转化为二进制转化为八进制大同小异...,存储在计算机中的数据是补码 三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号位(0表示正,1表示负),剩余的都是数值位。...不存在>>-1等价于的说法 3、补码储存数据的原因 最后我们来说一下为什么计算机中要用补码来储存数据 计算机是一种只会加法的“笨蛋机器”,1-1=1+(-1),将减法转化为加法才能计算,若使用原码储存...两者相加为2,很显然是错误的 若是我们用补码进行计算 相加结果是33bit大小的,int只取32bit,把最左边的1给丢掉了 当然这个相加结果也是补码,最后要转化成原码,当然原码的结果是

    21710

    PyTorch踩坑记

    这个操作是将out和residual相加,然后将结果赋值给out变量。在这个过程中原来out变量指向的那个张量并没有被修改。...那么问题来了,为什么PyTorch官方的实现中,使用+=的写法没有问题,而我自己代码中这样写就有问题了呢?...当然,如果有人遇到这个错误了,第一要检查的是你是不是使用to()或者cuda()方法将模型搬运到GPU上去了。 我的代码已经使用to()将模型复制到GPU上去了,为什么还会有这个问题呢?...通过两天的调试,我发现我的模型大部分参数是位于GPU上的,而模型中的一些层却在CPU上,所以导致了这个问题。 注:在调试程序的时候怎么查看模型是否在GPU上呢?...使用如下函数可以进行测试:next(model.parameters()).is_cuda 我后来发现,是我在设计ResNet的时候使用了list存储我的残差层导致的。

    58830

    数据增强策略(一)

    分布 numpy.random.beta (alpha, alpha),相加时两张图对应的每个像素值直接相加,即 将第 1 步中得到的混合张量 inputs 传递给 model 得到输出张量...outpus,随后计算损失函数时,我们针对两个图片的标签分别计算损失函数,然后按照比例 进行损失函数的加权求和,即 不同的 值得到的结果 ?...代码示例 一份简单的代码实现如下: https://github.com/facebookresearch/mixup-cifar10/blob/master/train.py 这里相当于把输入打乱后的输入进行权重相加...在大部分任务中均有提升 ? 基于 CutMix 的预训练模型可以在 Pascal VOC 上实现性能提升,但它并不是专门为目标检测器设计的。...核心就是对 label 进行 soft 操作,不要给 0 或者 1 的标签,而是有一个偏移,相当于在原 label 上增加噪声,让模型的预测值不要过度集中于概率较高的类别,把一些概率放在概率较低的类别。

    2.2K30

    我看AutoEventWireup

    大家好,又见面了,我是你们的朋友全栈君。 这句代码是自动生成的,在代码的第一句,那么你理解这个 意思吗? 下面,着重说一下AutoEventWireup。...事件中给Textbox1和Textbox2都赋值了,下面我们运行一下: 根据我们设定的结果出现了,现在我们把AutoEventWireup的值设为False看看 其他代码全不变,运行结果: 思考1,...咱们现在把AutoEventWireup的值改为True,其他代码不变,相加一个试试,运行结果: 输入8+8点击求和,可以看到如下页面: 不论输入多少次结果总是1+2=3。...思考2,为什么相加结果不变?如何修改可以得到我们想要的结果? 现在我们就回答以上的两个问题。...在浏览器中查看网页源码能够找到如下代码: 综上,当我们需要赋初始值时,AutoEventWireup这个属性一定要注意,否则很容易犯错误。 个人理解,如有错误,敬请指正!

    98330

    浅析GPU计算——cuda编程

    在《浅析GPU计算——CPU和GPU的选择》一文中,我们分析了在遇到什么瓶颈时需要考虑使用GPU去进行计算。本文将结合cuda编程来讲解实际应用例子。...对于上例中的各个线程的ID算法就更加复杂了,详细的计算规则可以见《CUDA(10)之深入理解threadIdx》。         为什么cuda的线程要设计的这么复杂?...比如我们把问题的维度降低,看看一个Grid只有一个Block,一个Block中N*N个线程,计算两个N*N矩阵相加的例子 // Kernel definition __global__ void MatAdd...而CPU却要串行处理每个元的计算(不考虑CPU中向量计算单元)。         那矩阵相加的什么特性让其成为一个经典的案例呢?那就是“可并行性”!...我们把上面矩阵相加的例子加以改造 // Device code __global__ void VecAdd(float* A, float* B, float* C, int N) { int

    2.7K20

    校验和计算原理_CRC校验原理及代码

    大家好,又见面了,我是你们的朋友全栈君。 校验和思路 首先,IP、ICMP、UDP和TCP报文头都有检验和字段,大小都是16bit,算法基本上也是一样的。 在发送数据时,为了计算数据包的检验和。...应该按如下步骤: 1、把校验和字段设置为0; 2、把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和; 3、把得到的结果存入校验和字段中 在接收数据时,计算数据包的检验和相对简单...,按如下步骤: 1、把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段; 2、检查计算出的校验和的结果是否为0; 3、如果等于0,说明被整除,校验和正确。...特点:关于二进制反码循环移位求和运算需要说明的一点是,先取反后相加与先相加后取反,得到的结果是一样的。...这个问题你可以自己举个例子,用反码求和时,交换16位数的字节顺序,得到的结果相同,只是字节顺序相应地也交换了;而如果使用原码或者补码求和,得到的结果可能就不同。

    2.7K30

    LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解

    在LLM中,x一般是一个句子,如“帮我计算23+20的结果”,y一般是:“等于43”。 基于上面的方程,如果追加一个要求,希望a=1,b=1,x=3的时候y=10呢?...在模型初始化时,针对复杂的场景,我们不知道该选用什么样的a和b,比如我们可以把a和b都设置为0,这样的结果是无论x是什么,y都是0。这样显然是不符合要求的。...深度学习的基本思想就是把一个文字转换为多个小数构成的向量 把这个矩阵在模型内部经过一系列复杂的计算后,最后会得到一个向量,这个向量的小数个数和字典的字数相同。...tensor和tensor的操作(比如相乘、相加等)只能在两个tensor在同一个设备上才能进行。要不然tensor都被存放在同一个显卡上,要不然都放在cpu上。...之后把这些相关程度放在一起计算各自占比,再用占比比例分别乘以对应文字的Tensor并相加起来,得到了一个新的Tensor(这个Tensor是之前所有Tensor的概率混合,可以理解为对句子所有文字的抽象

    1.6K00
    领券