ICANN备稿时debug遇到的问题 当你使用 print 函数打印对象时,Python 会检查是否定义了 extra_repr 方法,如果定义了,则会使用该方法返回的字符串来丰富对象的字符串表示形式。round的梯度是和clip一样的。模块中的Optimizer优化器对象也存在一个state_dict对象,此处的state_dict字典对象包含state和param_groups的字典对象。state_dict.pop(k) 是 Python 字典(dictionary)的一个方法,用于移除字典中键为 k 的项,并返回该项的值。
【反向传播、计算图、梯度】.data .detach() .clone inplace操作等等 pytorch提供的一些inplace选项,如nn.ReLU(inplace=True)、nn.LeakyReLU(inplace=True),这些选项的安全性要高一些,但也需要注意中间变量后续是否需要,如果后面还需要使用中间变量,就应当设置inplace=False。同时,一些常见的操作如x.add_(y)、x.mul_(y)也会直接改变x,除非有特定需求,否则不建议使用这类inplace操作,隐患比前两种情况高很多。还有,非叶子节点也不会去计算梯度的,因为没有意义,只是中间量,不是待优化的参数。
【实验】学习实验debug,以及经验感悟 记录两次独立解决问题的过程:目前来看,问题分为几种:抄代码的时候抄错了,比如dim=1写成dim=0这种逻辑错误,如果两份代码没什么差别的话,那么肯定是逻辑错误。下面的两个问题都是逻辑错误,因为语法错误其实是会报错的,
对目前想法有帮助的论文 《Enabling DeepSpikingNeuralNetworks with Hybrid conversion and SpikeTimingDependent Backpropagation》 - 知乎
关于如何解决问题?代码习惯。 如果你的时间都放到de一个bug上,那我觉得这实际上是纯粹的浪费,debug的时间永远是浪费了的,不如去打把游戏,所以每次debug都是在浪费生命,你要警惕自己在干什么。比如从数据本身入手,数据没问题,看模型,是否是模型的问题,再看是否是训练代码的问题。在代码找bug的过程中,如果确定你某个程序跑的结果不对,不要再继续试别的,想要“撞大运”指望跑着跑着“自己就好了”是不可能的。,比如检测某些指标,证明你这个程序是错的,设计loss,acc实验。养成好的代码习惯,写过的代码一定是对的,至少没有低级的错误。
【杂】解决关于mean(0)理解错误引发的程序bug 解释器设置影响了 VSCode 中运行 Python 脚本、调试、代码补全等功能的行为。VSCode 会根据你选择的解释器来执行这些操作。PyTorch 中的索引张量必须包含整数值。确保 label 是一个整数张量,可以通过使用 .long()发生你在终端激活了一个环境,但 VSCode 依然使用之前的解释器的情况。squeeze是要赋值的,除了extend都要赋值。出错肯定是自己对一些东西的理解出错了,,那就去一点点排查到底哪里出错了。
深度学习好文记录,反复学习 Batch Normalization 在其操作中包含了均值的减去和方差的除以等操作,这些操作本身具有平移和缩放的效果。如果在 Batch Normalization 层之前加上了偏置,它的作用在某种程度上会被 Batch Normalization 的操作所抵消,从而可能减弱 Batch Normalization 的效果。通常,在batch normalization层之前的层中是没有bias的,因为这是无用的,也是对参数的浪费,因为任何常数都会被batch normalization抵消掉。
服务器连接github 比着这个一步步做就行。上传文件可以看这个注意:密钥ssh-keygen设置好之后,以后就不用每次输入账号密码才能访问了。otherwise,每次要输入账号密码。这里可以看到git add .会忽略.gitignore里面的内容(灰色)git push在第一次使用的时候要标清楚<远程>,<本地>这样下次用git push的时候,就默认使用上述的参数。
Python处理Excel表格 pandas读取出来的是Series或者DataFrame,DataFrame是一列列Series加起来的。所以是按照列来组织的。(默认一列的数据类型是一样的)我们可以看到组织形式,首先是ndarray的形式,而不是list,因为项与项之间没有。上面是符合逻辑的,list的特性是内容的数据类型可以不同,所以每一项就是一行。,也可以发现同类型元素是一个小的ndarray,存放着一个字符串类型。[‘2020112001张,2020112001晏’]…:[‘2020112001张,2020112001晏’]
关于维度上的注意事项 self.rnn 的赋值行末尾的逗号将 nn.RNNCell(32, self.hidden_size) 视为一个包含单个元素的元组,而不是一个单独的对象。8*541 = 18,142,976 不符合reshape需要满足的条件,即,我们在reshape之前其实应该知道。,要不就无法保证前后维度的等效性。返回的是经过变换后的tensor。tensor,array啥的。extend无返回值,对。必须加int,是为了。
N——>BatchSize &&数据维度理解和处理(chun, cat, squeeze, unsqueeze) 例如,如果你将形状为[5266, 32, 541, 1]的张量的第3和第4维度交换,你得到的张量仍然包含相同的元素,但它们在张量中的排列方式不同,变成了形状为[5266, 32, 1, 541]的张量。squeeze 函数有一个可选的参数,即 dim,它指定了要挤压的维度。举一个例子,你的目的是要跑RNN,用RNNCELL,那么首先外部循环的肯定是seq_len,每次输入。仅删除指定的维度,如果该维度大小为1。只要你给的数据的维度能对得上就没有任何问题,最主要的是。你的目标也就是得到每次的输入。
pytorch,tf维度理解RNN 在PyTorch中可以使用下面两种方式去调用,分别是torch.nn.RNNCell()和torch.nn.RNN(),这两种方式的区别在于RNNCell()只能接受序列中单步的输入,且必须传入隐藏状态,而RNN()可以接受一个序列的输入,默认会传入全0的隐藏状态,也可以自己申明隐藏状态传入。最大的问题在于忽略了Channel这一维度,其实称之为特征维度:无论是1d,2d,3d都是在描述数据的多少,比如一个序列长度为12,比如一个图片的像素点有12 * 12个。,其中 1 表示时间步维度。
深入理解RNN 当RNN只有一个神经元时,即最简单的one-to-one:youtube上的视频教学,理解是对的,当前的hidden层(别管有几个神经元)一对一的传给下一个状态。,一次只能处理一个序列中的一个单元(如单词),如“I love china”这个序列,RNN网络一次只能处理一个单词,无法并行的处理整句话(多个单词组成的序列)时序逻辑电路在逻辑功能上的特点是:任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态,或者说,还与以前的输入有关。而他的缺点就是:RNN网络不能并行的处理序列。
requirements & pip 对于稍大型的项目来讲,依赖的第三方库很多,所以,如果能够自动生成这个文件,将大大提升我们的工作效率。幸好有 pipreqs 这个工具,能自动生成requirements.txt。python 通过提供 requirements.txt 文件来对项目中依赖的第三方库进行整体安装,用户不用手动的一条条去敲 pip install 命令,只需要执行。pip3,安装了python3之后,会有pip3。如果你的电脑只安装了Python3,那么不管用pip还是pip3都一样的。就可以安装项目所需要的所有软件包。