目录 课程课程汇总 作业代码注释(tensorflow版本)EdgeConv修改 课程 课程汇总 作业 代码注释(tensorflow版本) github
EdgeConv修改 增加余弦距离
def get_edge_feature(point_cloud, nn_idx, k=20): """Construct edge feature for each point Args: point_cloud: (batch_size, num_points, 1, num_dims) nn_idx: (batch_size, num_points, k) k: int Returns: edge features: (batch_size, num_points, k, num_dims) """ og_batch_size = point_cloud.get_shape().as_list()[0] point_cloud = tf.squeeze(point_cloud) # B*N*num_dims if og_batch_size == 1: point_cloud = tf.expand_dims(point_cloud, 0) point_cloud_central = point_cloud point_cloud_shape = point_cloud.get_shape() batch_size = point_cloud_shape[0].value num_points = point_cloud_shape[1].value num_dims = point_cloud_shape[2].
可以说这篇博客是对Google量化白皮书的完整解读,篇幅较长,可以收藏慢慢阅读。笔者在翻译的基础上,又补充了帮助理解的内容,但量化的技术点很多,并不限于此篇,且文中有个别点笔者不能完全吃透,故写得不是很详细,望看此文的你可以帮忙指出文中错误且与我一起交流讨论。 一、什么是量化?为什么要量化? 在深度神经网络模型应用中,量化是削减模型大小的一种常用方法。实际上就是把高位宽表示的权值和激活值用更低位宽来表示。为什么要削减模型,是因为硬件平台的自身性能不理想,如计算力低,内存、电量消耗等限制,导致模型推断速度慢、功耗高。 而定点运算指令比浮点运算指令在单位时间内能处理更多数据,同时,量化后的模型可以减少存储空间。当然,也可以将量化后的模型部署在高效的定制化计算平台上以达到更快的推断速度。 二、有哪些量化方法?怎样量化? 具体的量化方案有以下几种: 1.Uniform Affine Quantizer(均匀映射量化) 也叫非对称量化
下图是一个uint8非对称量化的映射过程:
首先,量化前要计算量化因子,包括步长和零点两个量化参数。量化因子就是用来保证浮点区间内的变量都能无一缺漏的映射到要量化bit数的取值区间内。其中,步长和零点的计算公式如下:
这里要重点说下零点z,也叫做偏移,为何这里需要零点?
实际上,浮点型的0会映射到零点,这个零点是一个整型数,用来确保0没有量化误差。具体就是,0有特殊意义,比如padding时,0值也是参与计算的,浮点型的0进行8bit量化后还是0就不对了,所以加上这个零点后,浮点型0就会被映射到0-255这个区间内的一个数,这样的量化就更精确。就相当于让映射后区间整体偏移,浮点最小值对应0。
计算完量化因子,再从浮点区间任取一值的量化过程:
即浮点值除以步长,就近取整,加上零点。再做clamp使量化的区间为(0,Nlevels-1),对于8bit量化,其中Nlevels就是2^8 =256。
注:对于单边分布,范围(Xmin,Xmax)需要进一步放宽去包含0点。例如,范围为(2.1, 3.5)的浮点型变量将会放宽为(0, 3.5),然后再量化。故,这种方式对于极端的单边分布会产生精度损失。
逆量化:
2.Uniform symmetric quantizer(对称量化) 对称量化是映射量化的简化版本。
下图是一个int8对称量化的映射过程:
首先,根据浮点区间的最大最小值计算量化因子(量化步长),然后在该范围内任选一个浮点型变量,利用给出的公式把它映射到8bit区间,即除以量化因子,就近取整,再根据有符号或无符号做一个clamp(截断),确定量化后的区间,当量化为8bit时,Nlevels就是2^8 =256,如果是4bit量化就是2 ^4=16。最后所有的浮点数都被映射在(-127,128)这个区间内,浮点数的最大最小值分别对应128、-127,将零点约束到0的位置。
文中提到:
若想更快的实现SIMD(SingleInstruction Multiple Data 单指令流多数据流),可以进一步约束权重的范围。这时,截断运算可以简化为:
对称量化的逆量化为:
更多对称量化内容查看这篇论文:Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference
以上两个量化方案是比较常用的。
3.Stochastic quantizer(随机量化) 随机量化方法加了一个噪声:
期望情况下,随机量化方法通过对范围外的值进行饱和(既clamp),可以降低浮点型权重的通量。因此,这种方法比较适用于计算梯度。【这个量化不是很懂,后面再补充】
4. 在后向传播中的训练模拟量化建模 还是先放一张非对称量化的图以及模拟量化过程公式:
该模拟量化操作是在训练时就进行量化的(训练时量化后面会说),操作实际包括一个量化再紧跟一个逆量化。具体的,就是在前向传播的时候(forward)模拟了量化的这个过程,在forward时首先会把权值和激活值量化到8bit再反量化回有误差的32bit,整体训练还是浮点,反向传播(backward)的时候求得的梯度是模拟量化之后权值的梯度,用这个梯度去更新量化前的权值。
如上图,选择从左到右数第4个点进行量化,量化后的值为253,然后再进行反量化,就得到它正对着的第5个点,即误差点,实际上用的这个点做的前向推理的,用误差点求梯度去更新原始点,SimQuant就是量化+反量化。
所以对于SGD(随机梯度下降),更新方式如下:
由于模拟量化方程的导数几乎在各个位置均为0(我的理解就是连续的浮点数量化映射成了离散的点),故在反向传播求梯度时无法求得,所以需要在反向传播中构建一个近似量化。在实际工程中一种效果比较好的近似方法是将量化指定为下面公式的形式,这样可以方便定义导数。
上图是: 模拟量化器(顶部),显示量化输出值。 用于导数计算的近似(底部)。
而反向传播可以建模为“直通估计器”,即:
其中
是关于模拟的量化输出的loss的反向传播误差。
具体内容查看这篇论文:Binaryconnect: Training deep neural
networks with binary weights during propagations
本来想修改在火狐浏览器滚动条的样式,但是并没有找到可以修改的方法。
不过倒是找到了可以隐藏滚动条的办法。
火狐: scrollbar-color: transparent transparent; IE: -ms-overflow-style: none;
来源:混沌巡洋舰
昨天龚鹤扬博士在集智的讲座因果学习综述,我借此机会结合我的理解给大家总结客串下这个讲座,和因果学习的核心内容,及巡洋舰一段时间关于因果的文章汇总。
这个讲座分为三部分,第一是什么因果及其哲学基础,第二是统计学中的因果, 第三是机器学习中的因果。
一, 哲学中的因果以及因果科学的定义
因果已经成为我们最重要的认知工具, 而且被认为是下一代AI革命的重要引擎之一。那么究竟什么是因果?用一句话说:因果是当某个变量T改变的时候,在保持其它变量不变的时候, 它是如何导致另一个变量Y改变的(由此我们看出因果的有向性,因果可以独立作用)。
即使是从这个定义里我们也可以立刻看到,如果和相关性进行比较, 我们看到这里的区别一在于改变, 二在于其它变量不变, 这就是说英国是A到B产生的效应,而非仅仅是A
和B的关联, 它具有明确的方向性和干预属性。这种定义的方法包含了干预主义的核心思想,因此也称为interventionist
而古往今来的哲学讨论里,另一个核心观点在于反事实的因果观念, 这个观念说的是当假设过去的其它事情不发生,是否有一个因子导致了最终的结果不会发生。这里我立刻想到类似于法律案件判断的一种基本思维,那就是指定某个人有罪与否的通常思维是假定他没有做出某个行为最后罪行的结果还是否会出现。
然而这种因果思维通常存在严重的漏洞,比如下面的例子:
A和B一起用石头扔瓶子,A的石头恰好击中了瓶子碎了。那么如果A不去用石头打瓶子似乎它也会碎, 你可以因此去说A的石头不是瓶子碎的原因吗?如果我们深思,类似的悖论还很多, 比如你和你女友n次吵架最后分手了, 那么如果没有第n次吵架你们也许不会分手, 你可以说第n次吵架就是分手的原因吗?
因此对于因果问题的定义是一个细思恐极的事情,我们看似懂了实际不懂。然而只要它是一种方便的思维工具, 我们还会每天不假思索的用下去而且不着急。事实上唯一严格定义清晰的因果是在物理学, 物理学的因果的基础是相互作用, 而相互作用的结果只有最终在时间维度上体现, 这和我们日常方便性的因果有着本质的区别。
一个有趣的总结是我们可以把因果分成两类,一个是type causality,一个是actual causality。第一类比较类似自然科学的因果,或者某种事物作用和变化的机制, 比如滥发钞票导致通货膨胀。而另一个则和我说的现实生活中的那些鸡毛蒜皮小事的直接原因,比如刚刚举的吵架导致分手。
最终我对这里的总结是, 因果是一种工具,追求严格定义没有意义,而是取决于使用的语境。
想要初步了解因果的定义,哲学含义,我们为什么需要因果, 巡洋舰积累了不少素材,尤其是围绕Pearl的 重磅级著作 《为什么》
从相关性到因果性-读《The book of why》
自由意志和因果推理-《为什么》书摘
年度必读书-《为什么:关于因果关系的新科学》
二, 统计学上的的因果推断
假定你手里有若干变量的一堆数据,你希望从这些变量里提取出一组因果关系。这你就要做的事情是因果推断。贯穿所有因果问题共通的地方是Judea Pearl的三层框架 ,我们要在我们手里的观察数据里求解出下面三个层次。
事实上为了做到这件事我们可以采用一个非常统一一致的流程,讲这个问题过于枯燥, 这里新冠病毒死亡率是一个极好的例子, 我们知道意大利的新冠病毒死亡率高于中国, 而这是否说明意大利的医疗治愈情况弱于中国呢?好了我们用统计的方法来回答下这个问题:
1, 定义问题,把问题和已知信息转化为因果图,这个图一般是coase-grain的世界模型, 把统计上复杂的分布化作一个节点。其实这一步是非常难的,难就在确定问题相关的因子有哪些,表面上这里只有国家和死亡率两个节点,但是事实上潜在的影响因素有很多,比如年龄,性别,教育程度, 如果你仔细去研究这个问题可能要包含了社会的所有方面。所以这里抬出了统计物理的一个基本思想coase-grain,我们把问题粗粒化最后留下最重要的。最终这里选择了国家,年龄结构和死亡率这三个因素,因为年龄对死亡的影响其实比较显著。比如看下图
2, 形成因果图, 这个因果图一般包含treatment和output, 以及其它的confounder
我们把年龄,国家和死亡率三个要素画出下图的三角C代表国家,A代表年龄,M代表死亡率 然后分析这个图里的因果关系,我们看到国家通过年龄结构影响死亡率,起到了中介变量的作用,因为年纪越大的人死亡率越高。而如果需要分析单纯国家对死亡率的影响(这里包含很多因素,比如国家的医疗条件,空气污染程度),则需要阻断A来分析C到M的影响。
3, 这里就要给出和因果分析和力学里的牛顿第二定律般的do calculus。这里的思维本质就是干预,既然年龄是一个重要的中介因子, 而两个国家的年龄又是不同的。我们如果要求得单纯国家这个因素对死亡率的影响,就要把年龄这个因素控制成一样,来求解国家不同对死亡率的影响。具体的做法是把年龄分布(年龄相对国家的条件概率)假定成相同,求两个不同国家的死亡率在这个相同分布下的期望, 并取其差值。这个控制也可以看作是阻断,它阻断了国家对年龄变量的影响。最终得到了结果的确是意大利的死亡率更低!
4, 另一方面,我们可以计算由中介因子带来的间接因果效应(年龄的影响)
安装EPPlus包
EPPlus is a .NET library that reads and writes Excel files using the Office Open XML format (xlsx). EPPlus has no dependencies other than .NET.
EPPlus只依赖.NET,用于读写xlsx格式的excel
参考:https://github.com/JanKallman/EPPlus
参考abp-demo
Import
class EpPlusExcelImporterBase<TEntity> { public List<TEntity> ProcessExcelFile(byte[] fileBytes, Func<ExcelWorksheet, int, TEntity> processExcelRow) { var entities = new List<TEntity>(); using (var stream = new MemoryStream(fileBytes)) { using (var excelPackage = new ExcelPackage(stream)) { foreach (var worksheet in excelPackage.Workbook.Worksheets) { var entitiesInWorksheet = ProcessWorksheet(worksheet, processExcelRow); entities.
在react项目使用antd组件中的switch功能,设置初始值为变量,所以需要在 Form.Item 标签上添加一个 valuepropname={初始值} 错误示范:
<Form.Item label="开关"> <Switch defaultChecked={data.type} checkedChildren="开启" unCheckedChildren="关闭" onChange={this.onchange} size="default" /> </Form.Item> 记得加上key值,不然浏览器的控制台会报错 正确示范
<Form.Item label="开关" valuepropname={data.type} key={data.type}> <Switch defaultChecked={data.type} checkedChildren="开启" unCheckedChildren="关闭" onChange={this.onchange} size="default" /> </Form.Item> 在触发onchange事件的时候改变switch的值 onchange = async (checked) => { const { data } = this.props; if (checked === false) { data.type = 0; 调用接口修改switch状态 } else if (checked === true) { data.type = 1; 调用接口修改switch状态 } };
cmd到jdk的bin下
keytool -importkeystore -srckeystore mycert.pfx -srcstoretype pkcs12 -destkeystore mycert.jks -deststoretype JKS
mycert.pfx是转前的pfx
mycert.jks是转后的
记得pfx文件要放在bin目录下面
正确的学习方式应该是,遇到不会的就Google及“在线帮助文档”。平时多用,剩下的交给时间!
目录
ELSEVIER LaTex模板下载地址 和 在线帮助文档 备忘记录
1. \fnmark[]
2. \usepackage[numbers]{natbib} 3. \itemize 条目
4 图、表单双栏问题
ELSEVIER LaTex模板下载地址 和 在线帮助文档 利用“说明文档”,可以快速理解模板各部分的功能!
备忘记录 1. \fnmark[<number>] % 作者部分,额外脚注的配套使用 \fnmark[1] \fntext[1]{This is the first author footnote. but is common to third} 2. \usepackage[numbers]{natbib} % 引用宏包,两者冲突,二选一。 \usepackage{cite} \usepackage[numbers]{natbib} % 模板自带 3. \itemize 条目 % 方式一,显示“点” \begin{itemize} \item document style \item baselineskip \item front matter \item keywords and MSC codes \end{itemize} 方式二,显示“数字序号” \begin{enumerate} \itemsep=0pt \item {natbib.
第一种
找到项目中的 main.js页面,Vue.prototype.变量名 = ‘值’;Vue.prototype.baseurl = 'wwww.baidu.com' 然后在使用的页面:this.刚刚定义的变量名;this.baseurl;
问题 EntityFramework Core版本是3.1.
public class Test: Entity { public string Name { get; set; } } public class Test2:Test { public string Add { get; set; } } DbContext
public DbSet<Test> Tests { get; set; } public DbSet<Test2> Test2s { get; set; } public AbcDbContext(DbContextOptions<AbcDbContext> options) : base(options) { } 但是只生成了基类的表。
派生类并没有生成我需要的表 Test2s,且对应的属性成了基类的column。
解决方法 后来用
modelBuilder.Entity<Test2>().ToTable("TestInherits"); 出现错误
The entity type 'Test2' cannot be mapped to a table because it is derived from 'Test'.
python习题 1.求任意三个数的平均值代码截图代码运行结果 2. 用递归求累加和代码截图代码运行结果 3.猜字游戏代码截图:代码:运行结果: 4. 求1-100累加和代码截图:代码:运行结果: 5. 计算1-100的偶数累加和代码截图1:代码1:代码截图2代码2运行结果: 6. 打印星号(正方形)代码截图:代码:运行结果: 7. 打印星号(三角形)代码截图:代码:运行结果: 8.九九乘法表代码截图代码:代码截图: 9.遍历列表的数据代码截图:代码:运行结果: 10.办公室随机分配—有3个办公室,8位老师,将8位老师随机分配到3个办公室代码截图代码运行结果 11.打印多条横线代码截图代码运行结果 12.交换变量值代码截图代码运行结果 1.求任意三个数的平均值 代码截图 代码 """ 题目:任意三个数的平均值 分析:1.求和 2.求平均值 """ #求和 def sum(a,b,c): return a+b+c #求平均值 def avg(a,b,c): result=sum(a,b,c) #调用求和函数 avgs=result/3 #求平均值 return avgs #返回平均值 #输出平均值 pingjun=avg(10,20,30) #调用求平均值的函数 print(f'平均值是{pingjun}') 运行结果 2. 用递归求累加和 代码截图 代码 """ 递归:3以内数字累加和 """ def digui(n): if n==1: #n等于1返回1 return 1 result=n+digui(n-1) #n不为1,使用递归实现累加和 return result jieguo=digui(3) #调用函数,并输出 print(f'累加和是{jieguo}') 运行结果 3.猜字游戏 代码截图: 代码: "
Vue2.0不同于Vue1.0版本,它把$index和$key都移除了,取而代之的是:key属性。
如果还像之前那样写的话会报Property or method "$index" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.之类的错误。
Vue1.0版本的写法为:
<ul id="example"> <li v-for="item in items"> {{$index}} {{$key}} </li> </ul> Vue2.0版本的写法为:
<ul id="example"> <li v-for="(item,index) in items" :key="item.index"> {{item}} {{index}} </li> </ul> 另一个办法是在build处关闭eslint检测(没试过)
...(config.dev.useEslint ? [createLintingRule()] : []), 参考:https://my.oschina.net/u/3986411/blog/2906924
和 https://www.jianshu.com/p/2cf1a0736154
首先来说,ptr是一个指针,首先看一个简单的
int* ptr; void* p1 = (void*)ptr; 表示把整型指针进行强制类型转换成空类型指针 void类型指针接受任何类型的指针变量复制,因为他仅仅接收的是变量的首地址。
float **ptr; int **p = (int **)ptr; // 指针的强制类型转换 指针的类型是指明指针向后偏移多少个字节。
攻击公钥加密 假设由Bob和Alice两个用户,他们之间想要通信,必须首先进行密钥交换: 使用公钥密码,Alice只需要将她的公钥发给Bob,Bob可以生成一个密钥,并用Alice的公钥加密后发送给Alice,由于Alice是唯一可以解密的人,窃听这个通信的攻击者是无法获得密钥的。 中间人攻击: 假设Mallory是一个攻击者,她可以截获Alice与Bob之间的通信并实施攻击:
Mallory实施攻击的过程如下: Mallory截获Alice发送的公钥,用自己的公钥代替Alice的公钥发送给Bob。Bob无法判断公钥的来源,因为消息看起来是来自Alice的,因此他用收到的公钥加密自己生成的随机密钥。Mallory截获Bob的加密消息,由于消息是用她的公钥加密的,因此她可以解密消息,获得随机密钥,随后,她用Alice的公钥将随机密钥加密后发送个Alice。Alice可以解密消息,获得随机密钥,然后Alice与Bob就可以用该密钥来加密他们之间的通信。 由于Mallory以及获得了这个密钥,因此她可以解密Alice与Bob之间的整个通信,并且可以修改他们的通信数据,Alice与Bob之间的通信安全完全被破坏。 防御中间人攻击 中间人攻击的基本问题是Bob收到声称是Alice的公钥,但他没有办法判别这个公钥是否属于Alice。数字签名也是基于公钥密码学的,它用签名者的私钥签名,任何知道签名者公钥的人都可以验证它,如果消息的内容被篡改,数字签名就失效了。可以用数字签名技术防御中间人攻击,因此之前的Alice和Bob可以找一个信任方对他们的身份进行验证,Alice可以到DMV办公室出示她的身份证并提交她的公钥,她必须亲自到DMV办公室,从而保证没有其他人可以截获这个流程,在验证完ID后,DMV办公室会准备一个数字文件,其中包含Alice的名字和公钥,以及一些其他信息,如过期时间等,DMV办公室为这个数字文件进行数字签名,这个数字文件和数字签名称为证书。现在,当Alice发送他的公钥给Bob时,Alice也发送整个证书给Bob,因此公钥与一个经信任机构验证过的名字一起发过来,Mallory仍然可能截获证书,但是她不能用自己的公钥代替Alice的公钥且仍然保持Alice的名字,那将使DMV的签名无效,,如果他将自己的证书发给Bob,Bob将不知道这个公钥属于Alice,因此会终止通信,Mallory没有办法获得一个包含她的公钥和Alice名字的证书,因为作为信任机构知道Mallory不是Alice,它会拒绝签发这样的证书。为了验证DMV在Alice证书上的签名,Bob需要获得DMV的公钥,但是他不能通过网络获得,因为这又得面临潜在的中间人攻击,他也必须亲自到DMV办公室以获得它的公钥。 公钥基础设施 两个重要组件: 认证机构(CA):他们负责验证用户的身份并且提供经由他们签名的数字证书。数字证书:他提供了一个公钥以及与这个公钥相关的信息,认证机构需要在数字证书上签名以证明它核实过证书的内容,数字证书也称为公钥证书。 公钥证书 公钥证书由公钥和它的拥有者,以及认证机构的签名组成。证书接收者可以验证签名以确保证书的完整性,在认证成功后,接收者可以得到公钥真正拥有者。X.509数字证书 Certificate: Data: Version: 3 (0x2) Serial Number: 0e:c3:4e:77:02:57:00:4f:ad:cc:f4:a2:f5:19:d6:0c Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert SHA2 Extended Validation Server CA Validity Not Before: Jan 9 00:00:00 2020 GMT Not After : Jan 12 12:00:00 2022 GMT Subject: businessCategory=Private Organization/jurisdictionC=US/jurisdictionST=Delaware/serialNumber=3014267, C=US, ST=California, L=San Jose, O=PayPal, Inc., OU=CDN Support, CN=www.paypal.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ab:9a:c4:47:e6:4f:4b:f0:7a:29:6f:9a:1d:6b: 4e:d5:04:0e:b2:02:ed:8d:d1:a9:ae:d5:da:20:8c: 7e:8a:49:1a:3c:09:13:f7:72:ee:2e:40:e0:29:41: 02:78:97:55:f8:06:0d:7b:2a:e3:e0:b3:e5:64:f2: de:b8:b8:35:e1:c5:7c:eb:12:e3:68:47:74:6c:bc: 04:25:33:09:17:28:e0:c9:3a:b2:4e:65:50:d0:4a: e4:3b:b2:e1:2e:82:45:cb:52:05:3b:a4:b7:37:eb: c8:29:fc:43:67:cc:66:a9:e5:9f:22:1b:1b:f7:86: 36:35:9b:45:f5:0f:6c:3d:1d:15:55:5d:fe:ca:7d: 5c:ef:1d:76:b7:f0:59:85:89:1a:c9:d2:bf:58:bc: 26:9c:11:75:60:cb:59:e6:74:18:ee:0e:06:bc:54: a1:47:f9:f5:b5:c0:be:ad:6d:ee:dd:99:b6:50:ed: 85:33:f5:bd:93:4b:66:a9:08:f0:67:c7:bd:42:24: c2:3b:e3:7f:f1:e2:51:62:b5:51:ae:21:a8:24:d9: c9:ed:d3:b4:60:17:6a:0c:78:69:c1:96:ad:62:1d: 18:11:a6:ea:f4:83:eb:2d:ae:b0:be:2e:56:9d:cf: 9d:2c:70:5a:df:b2:1e:3a:c7:e4:23:e3:3b:58:e1: fd:9d Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Authority Key Identifier: keyid:3D:D3:50:A5:D6:A0:AD:EE:F3:4A:60:0A:65:D3:21:D4:F8:F8:D6:0F X509v3 Subject Key Identifier: F0:1E:F5:E3:EE:33:53:69:54:6A:27:40:E0:CE:84:B6:69:68:4B:9E X509v3 Subject Alternative Name: DNS:www.
最近调试树莓派,希望开机运行两个程序,其中一个是可执行文件,另一个是 python 脚本,他们都是无限循环的程序,也就是说不关机不会停止运行。中间还是遇到了很多 bug,现在记录一下自启动程序的设置方法以及debug的整个过程。
1. 自启动程序设置方法 网上用的最多的方法就是修改 /etc/rc.local 文件:
sudo nano /etc/rc.local 进入之后在 exit 0 这句话上面添加需要运行的程序。比如我想运行 ~/test/ 文件夹下的可执行文件 runme 和 python 脚本 runhe.py,那么就需要添加下面两个命令
# sleep 5 /home/pi/test/runme & sudo -H -u pi /usr/bin/python3 /home/pi/test/runhe.py & 这里有几个注意事项:
最好都使用绝对路径!如果程序是无限循环(不会终止)的,那么需要在行尾添加 &,如果不是的话可以不加这个 &,这个符号可以理解为允许当前行的程序在后台运行,这样就可以继续启动下一行的程序了。第一行的 sleep 5 表示先暂停 5s,主要是为了防止有的变量或者环境还没有准备好,可以根据情况决定是否添加。运行 python 脚本的时候最好前面用 /usr/bin/python3 xxx.py 而不是直接 python3 xxx.py,后者不一定会报错,但是像前面说的,还是尽量用绝对路径。最重要的一点,也是我的 bug 原因所在:运行 python 脚本的时候,网上大多数教程说的是添加 python3 xxx.py 就行了,但是我 debug 过程中发现必须要使用 sudo -H -u pi /xxx/python3 xxxx.py 来显式的指定用户,否则可能会报错 ModuleNotFoundError: No module named 'XXX',这应该是因为某些包只在某个用户环境中安装了。 2.
问题描述 LeetCode碰到的错误:
第1060行:Char 9:运行时错误:将无符号偏移量添加到0x7fffda1e0e20溢出到0x7fffda1e0e1f(basic_string.h)
(来自百度翻译)
说白了就是越界了,比如数组、字符串。
对操作边界的代码检查一下!
比如字符串s的操作:
while(s[m]==' ')m++; 当m为 s.length()-1 时,再加1就会越界,此时再到while中判断就会报该错误。
实例分割总结 Instance Segmentation Summary 实例分割常用网络总结Mask-RCNN网络PANnetDeep Mask和Sharp MaskCenterMask二阶段(two-stage)实例分割方法一阶段(one-stage)实例分割方法 实例分割常用网络总结 实例分割网络经常接触到有:
Mask-RCNN:基于Faster-RCNN的改进,加了一个语义分割的分支FCN网络,是自顶而下的思想(先检测到包围框实现了分类,再对每一个包围框进行语义分割。检测结果中每一个目标的标签是不同的,实现了区分不同的实例)。
PANNet:也是基于自顶而下的思想,采用自底而上的路径增强手段对特征提取网络部分进行了改进,在mask分支上增加FC辅助分割。
Deep Mask和Sharp Mask:DeepMask的技巧是把分割看成是一个海量的二进制分类问题,实现图像分割;SharpMask优化DeepMask的输出,产生具有更高保真度的能精确框定物体边界的mask;DeepMask不知道具体对象类型,尽管可以框定但不能区分物体,使用一个专门的网络架构来对每一个mask进行分类,也就是MultiPathNet。
Center Mask:是一种自底而上的one-stage实例分割网络(前面几个网络均是two-stage网络)。实现了anchor-free的效果。Center Mask同时包含一个全局显著图生成分支和一个局部形状预测分支,能够在实现像素级特征对齐的情况下实现不同物体实例的区分。
论文名称——CenterMask: single shot instance segmentation with point representation
需要说明的是:
(1) 全局显著图生成分支:预测整个图像的显著性图,实现精确分割并保留精确的空间位置,提供显著性细节,在像素级将前景与背景分离并实现像素级对齐。但是不能区分实例。
(2)局部形状预测分支:它为每个局部区域预测一个粗略的遮罩,可以自动分离不同的实例。为了实现这一点,从目标中心的点表示中提取局部形状信息。局部形状由一个粗掩模表示,该粗掩模将物体与近距离物体分开。
(3)最后,将粗糙但感知实例的局部形状和精确但不感知实例的全局显著性映射组合起来,形成最终的实例掩码。
分割线
Mask-RCNN网络 Mask R-CNN:
改进:
用FPN进行目标检测,并通过添加额外分支进行语义分割(额外分割分支和原检测分支不共享参数),即MaskR-CNN有三个输出分支(分类、坐标回归、和分割)
(1).改进了RoIpooling,通过双线性差值使候选区域和卷积特征的对齐不因量化而损失信息。
(2).在分割时,MaskR-CNN将判断类别和输出模板(mask)这两个任务解耦合,用sigmoid配合对率(logistic)损失函数对每个类别的模板单独处理,比经典分割方法用softmax让所有类别一起竞争效果更好
1、整张图片送入CNN,进行特征提取
2、在最后一层卷积featuremap上,通过RPN生成ROI,每张图片大约300个建议窗口
3、通过RoIAlign层使得每个建议窗口生成固定大小的feature map(ROIAlign是生成mask预测的关键)
4、得到三个输出向量,第一个是softmax分类,第二个是每一类的bounding box回归,第三个是每一个ROI的二进制掩码Mask(FCN生成)
Mask Representation:
mask 编码了 输入的 object 的空间布局(spatial layout)
针对每个 RoI,采用 FCN 预测一个 m×m 的 mask.
mask 分支的每一网络层均可保持 m×m 的 object 空间布局,而不用压扁拉伸成向量形式来表示,导致空间信息损失.
pixel-to-pixel 操作需要保证 RoI 特征图的对齐性,以保留 per-pixel 空间映射关系(映射到ROI原图).
1、进入Visualization模块:
2、选择Result--Options:
3、进入Options界面,拖动即可:
具体的avg=75%的意义参考:
abaqus应力值导出并进行后处理(同一节点多个应力值如何处理?) https://blog.csdn.net/themingyi/article/details/107184504
文章目录 一、配置后端复制文件到 配置 jdk maven环境打包1. jar包2. war包 启动后端jar包启动方式 二. 前端项目复制zip文件到云端安装vue项目依赖生产环境打包配置nginx阿里云设置安全组 项目地址: https://gitee.com/y_project/RuoYi-Vue 一、配置后端 复制文件到 scp -r file root@47.52.19.183:path 配置 jdk maven环境 java 1.8 jdk安装
maven 环境 安装
打包 tips: 打完包记得把包移出来,否则mvn clean会清除打好的包
1. jar包 mvn package # 清除 mvn clean 2. war包 war包的作用是 springboot中带有tomcat,为了使用外部的tomcat来部署项目
启动后端 jar包启动方式 [root@lucky ruoyi]# nohup java -jar ruoyi.jar & [1] 28156 [root@lucky ruoyi]# nohup: 忽略输入并把输出追加到"nohup.out" [root@lucky ruoyi]# ps aux|grep java root 28156 103 10.6 2542152 199664 pts/1 Sl 20:02 0:14 java -jar ruoyi.
比如我要在Scope模块输出三轴加速度的数据,但三轴数据波形混杂在一起不太好看,此时就需要在Scope模块中添加图例来使波形看起来更加清晰明了。
注:我这里使用的Matlab版本为2019a
1.首先在simulink中打开,需要添加图例的Scope,如图示:
2.在Matlab,command窗口输入:
>> set(0,'ShowHiddenHandles','On'); >> set(gcf,'menubar','figure'); 此时你会发现Scope窗口菜单栏多了好几个选项。
3.在【插入】中选择【图例】,同时在【View】中选择【legend】,此时即可在右上角出现图例,点击可修改。