精华内容
下载资源
问答
  • 这里切记下载TensorFlow Models成功后要切换分支,为什么要切换,我自己实践的经验是用直接下载的model训练和测试是没有问题的,但是在用pb转uff的时候出现_Cast node 错误,根据网上查到的解决办法将create_node_...

    c8e13c7a6b143119884df7c23e7adf8b.png

    这里切记下载TensorFlow Models成功后要切换分支,为什么要切换,我自己实践的经验是用直接下载的model训练和测试是没有问题的,但是在用pb转uff的时候会出现_Cast node 错误,根据网上查到的解决办法将create_node_map中的Tofloat改成Cast,但是有会在create_engine时又会出现index error,就是用自己的五类目标训练得到的模型竟然出现预测的目标class_index为coco label中的index,真的很诡异。一直没能解决是哪里的问题,之后切换分支后就一切正常,所以一定要切换分支。

    git checkout ae0a9409212d0072938fa60c9f85740bb89ced7e

    bec3f2d197d5ce2c8713db3418352715.png

    既然model版本回退了,那么现在就要重新安装tensorflow object detection api.

    • 先卸载原先安装的object-detection.
    pip uninstall object-detection
    • 删除成功后重新安装
    cd models/research/
    protoc object_detection/protos/*.proto --python_out=.
    • 安装依赖包
    # From within TensorFlow/models/research/
    pip install .
    • 添加research/slim 到PYTHONPATH
    gedit ~/.bashrc
    # From within tensorflow/models/research/
    export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/slim
    source ~/.bashrc

    至此环境变量起作用了

    • 安装COCO API
    cd Tensorflow/models/research
    git clone cocodataset/cocoapi
    cd cocoapi/PythonAPI
    make
    cp -r pycocotools <PATH_TO_TF>/TensorFlow/models/research/
    • 验证安装是否成功
    cd TensorFlowmodelsresearchobject_detection
    jupyter notebook

    2ed186fffa4fe8a87b578086e7821e30.png

    运行无误说明安装成功。

    这里说明一点,如果你要运行model_builder_test,可能会出现有些例子运行失败,这里不用care这些失败,无视就好了,不影响接下来的训练

    8c93131ca525db16b76a9b2c64e2ef2f.png

    接着训练步骤可以参考我博客详细说明。

    TensorRT成功测试自己的数据集SSD模型二bella722.github.io
    a17e4af3783aaab4ecf226f9a468e098.png
    展开全文
  • 为什么会发生错误? 标准日志记录无法回答这些问题。 但是通过更好的模型,您可以了解应用程序中发生了什么以及为什么发生。 您可以查明性能瓶颈,可以了解什么时候发生了什么,谁叫什么。 这就是艾略特所做的...
  • JVM的内存结构,简单说一下JMM 我们为什么要学习jmm呢?这其实是一种追本溯源的过程,...如此一来,我们就不需要花重心去打理内存的使用,但是Jvm虚拟机内存模型并不是永远不会发生错误,也有内存溢出的情况,那.

    JVM的内存结构,简单说一下JMM

     

    我们为什么要学习jmm呢?这其实是一种追本溯源的过程,对于开发人员来说,需要很清晰的控制每个对象的出生到毁灭,并且需要控制每一个对象的归属,而不是随波逐流。这尤其是C的开发人员。但是对于Java程序员来说,在虚拟机自动内存管理机制的帮助下。我们放宽了很多心,我们类似将整个项目的对象的构造,回收都托管给了第三方,也就是Java虚拟机内存管理模型。

    如此一来,我们就不需要花重心去打理内存的使用,但是Jvm虚拟机内存模型并不是永远不会发生错误,也会有内存溢出的情况,那么在这个时候我们就手足无措了,因为我们对其不关心,认为他是一个助手,当助手出了问题,不会轮到我这个被辅助的人去帮助他。

    就好比,我只是一个炒菜的厨师,如果有一天,煤气罐没气了,我就一点原因都不清楚?只会傻等着换煤气的师父来帮我检查问题吗?各司其职没问题,但是作为一个高级厨师,我们应当有这种觉悟,我们不屑于只做表面的功夫,我们会炒菜,也应该了解火候,而不是只会颠勺。

    那么回到正题,如果jvm层面出了问题,那作为一名合格的Java开发人员,我们应当需要知道他的来龙去脉,以及问题产生,及方案解决。

     

     

     

    Java内存模型都应该有所了解,那就贴张重绘图片吧

    对于启动各个区域,都会有不同的用途,并且每个区域中的对象数据都有着不同的生命周期。

     

    基本上司空见惯的图片,从上述图片内存结构分层来说,我们可以分为三个层:加载、运行数据、执行。当然还有比较细的划分。本质上来说,jmm其实并不存在,只是jvm将其内存抽象为类似的结构模型,对于我们程序员来说,更利于理解,知道他到底做了什么。

     

    那么我们对这张图片进行细粒度的再精细一下,例如:其中的类加载子系统中到底有哪些组成?其中的执行引擎有分为哪几部分呢?还有更关心的,我们的运行数据区中的划分,堆中又分为哪些部分?

    按照网络上的图片结果,我再重绘一下一张图片:

     

    图片呢,都是网络上大佬分析出来的,然后小弟我也进行了一个重绘,便于理解

    当然,在深入理解JVM虚拟机这本书中也有相应的图片,我此处也粘一下

     

    此书也是将运行时数据区划分为类似的5块区域,并且告诉了我们:

    所有线程共享的区域有:“方法区”,通常存放常量,类元数据等数据;还有“堆”空间,就是对象的存储空间。

    然后,线程间相互隔离的数据区域是:“虚拟机栈”:栈空间内存;“本地方法栈”:本地方法空间内存;“程序计数器”:方法的后置方法,返回信息等配置。

     

    这篇文章就到这,只是简单分享一下我们为何需要了解JMM,他有哪些内容,然后和大家分享几张图片,后面我们分别对其进行分析分享。

     

     

     

     

    展开全文
  • 有时我们在进行系统调用时为什么有的立即返回,有的阻塞在那里,而且系统调用的形参都不一样,其实就是因为在设计时采用了不同的I/O机制 阻塞式I/O:  一般我们使用的系统调用接口都是阻塞式的。 此种模式...

    有时我们在进行系统调用时为什么有的会立即返回,有的会阻塞在那里,而且系统调用的形参都不一样,其实就是因为在设计时采用了不同的I/O机制

    阻塞式I/O:

        一般我们使用的系统调用接口都是阻塞式的。 此种模式,如果在只有一个主线程的情况下,线程就会阻塞在那里。导致我们什么其他的事都干不了,只有在数据报到达且被复制到应用进程的缓冲区中或者发生错误,这个系统调用才会返回。

        系统调用接口举例:recvfrom

           

    非阻塞式I/O: 

        这种模式下系统调用后会立即返回,比如说是一个状态, EWOULDBLOCK, 表示数据还没有准备好。所以就要用户写一个循环函数不停的进行系统调用并对状态判断,然后根据状态来决定怎么做。和阻塞式IO不同的地方是,非阻塞式可以做一些事情,但还是会有束缚。

        系统调用接口举例: recvfrom

    I/O复用的实现机制: 

           让select(或者poll)函数作为替身阻塞的等待描述符就绪, 当select返回套接字可读这一条件时,我们调用recvfrom把所读数据复制到应用进程缓冲区(注意此时select返回时,还是要通过recvfrom函数去进行系统调用,其过程就是将内核空间的内容复制到进程空间,此点会和异步IO做区分)。select 在只有一个文件描述符的情况下与非阻塞的相比并没有优势, select的优势在于可以等待多个描述符。


    信号驱动式I/O

           首先开启信号驱动式I/O功能, 并通过sigaction系统调用安装一个信号处理函数。该系统调用将立即返回, 我们的进程继续工 作(没有被阻塞,这是其区别与I/O复用的关键)当数据准备好时, 内核就为该进程准备一个SIGIO信号。我们既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环去处理数据报,也可以立即通知主循环,让它读取数据。

           优势在于数据报到达期间进程不被阻塞。主循环可以继续执行。

    异步I/O:  

            我们调用aio_read函数,给内核传递描述符、缓冲区指针、缓冲区大小和文件偏移、并高速内核整个操作完成时该怎么通知我们。 该信号直到数据已复制到应用进程缓冲区才产生,这一点不同于信号驱动式I/O


    小结:理解的关键在于要懂应用进程空间和内核空间,内核空间的函数可以操作进程空间(在异步IO中,内核函数直接将内容拷贝到进程空间的缓冲区中) 但进程空间必须通过系统调用才可以读取内核空间的内容。

    展开全文
  • // 声明一些变量并初始化它们 var a = 5; let b = "xy"; const c = true; // 分配新值 a = 6;... // 类型错误:不可对常量赋值 ...作为程序员,声明变量、初始化变量(或不...但是当这样做的时候会发生什么呢? JavaScript...

     

     

    // 声明一些变量并初始化它们
    var a = 5;
    let b = "xy";
    const c = true;
    
    // 分配新值
    a = 6;
    b = b + "z";
    c = false; //  类型错误:不可对常量赋值
    

    作为程序员,声明变量、初始化变量(或不初始化变量)以及稍后为它们分配新值是我们每天都要做的事情。

    但是当这样做的时候会发生什么呢? JavaScript 如何在内部处理这些基本功能? 更重要的是,作为程序员,理解 JavaScript 的底层细节对我们有什么好处。

    下面,我打算介绍以下内容:

    • JS 原始数据类型的变量声明和赋值
    • JavaScript 内存模型:调用堆栈和堆
    • JS 引用类型的变量声明和赋值
    • let vs const

    JS 原始数据类型的变量声明和赋值

    让我们从一个简单的例子开始。下面,我们声明一个名为myNumber的变量,并用值23初始化它。

    let myNumber = 23;
    

    当执行此代码时,JS 将执行:

    1. 为变量(myNumber)创建唯一标识符(identifier)。
    2. 在内存中分配一个地址(在运行时分配)。
    3. 将值 23 存储在分配的地址。

    虽然我们通俗地说,“myNumber 等于 23”,更专业地说,myNumber 等于保存值 23 的内存地址,这是一个值得理解的重要区别。

    如果我们要创建一个名为 newVar 的新变量并把 myNumber 赋值给它。

    let newVar = myNumber;
    

    因为 myNumber 在技术上实际是等于 “0012CCGWH80”,所以 newVar 也等于 “0012CCGWH80”,这是保存值为23的内存地址。通俗地说就是 newVar 现在的值为 23

     

     

    因为 myNumber 等于内存地址 0012CCGWH80,所以将它赋值给 newVar 就等于将0012CCGWH80赋值给 newVar

    现在,如果我这样做会发生什么:

    myNumber = myNumber + 1;
    

    myNumber的值肯定是 24。但是newVar的值是否也为 24 呢?,因为它们指向相同的内存地址?

    答案是否定的。由于 JS 中的原始数据类型是不可变的,当 myNumber + 1 解析为24时,JS 将在内存中分配一个新地址,将24作为其值存储,myNumber将指向新地址。

     

     

    这是另一个例子:

    let myString = "abc";
    myString = myString + "d";
    

    虽然一个初级 JS 程序员可能会说,字母d只是简单在原来存放adbc内存地址上的值,从技术上讲,这是错的。当 abc 与 d 拼接时,因为字符串也是 JS 中的基本数据类型,不可变的,所以需要分配一个新的内存地址,abcd 存储在这个新的内存地址中,myString 指向这个新的内存地址。

     

    下一步是了解原始数据类型的内存分配位置。

    JavaScript 内存模型:调用堆栈和堆

    JS 内存模型可以理解为有两个不同的区域:调用堆栈(call stack)堆(heap)

    调用堆栈是存放原始数据类型的地方(除了函数调用之外)。上一节中声明变量后调用堆栈的粗略表示如下。

    在上图中,我抽象出了内存地址以显示每个变量的值。 但是,不要忘记实际上变量指向内存地址,然后保存一个值。 这将是理解 let vs. const 一节的关键。

    是存储引用类型的地方。跟调用堆栈主要的区别在于,堆可以存储无序的数据,这些数据可以动态地增长,非常适合数组和对象。

    JS 引用类型的变量声明和赋值

    让我们从一个简单的例子开始。下面,我们声明一个名为myArray的变量,并用一个空数组初始化它。

    let myArray = [];
    

    当你声明变量“myArray”并为其指定非原始数据类型(如“[]”)时,以下是在内存中发生的情况:

    1. 为变量创建唯一标识符(“myArray”)
    2. 在内存中分配一个地址(将在运行时分配)
    3. 存储在堆上分配的内存地址的值(将在运行时分配)
    4. 堆上的内存地址存储分配的值(空数组[])

     

    从这里,我们可以 pushpop,或对数组做任何我们想做的。

    myArray.push("first");
    myArray.push("second");
    myArray.push("third");
    myArray.push("fourth");
    myArray.pop();
    

    代码部署后可能存在的 BUG 没法实时知道,事后为了解决这些 BUG,花了大量的时间进行 log 调试,这边顺便给大家推荐一个好用的 BUG 监控工具 Fundebug

    let vs const

    一般来说,我们应该尽可能多地使用const,只有当我们知道某个变量将发生改变时才使用let

    让我们明确一下我们所说的“改变”是什么意思。

    let sum = 0;
    sum = 1 + 2 + 3 + 4 + 5;
    let numbers = [];
    numbers.push(1);
    numbers.push(2);
    numbers.push(3);
    numbers.push(4);
    numbers.push(5);
    

    这个程序员使用let正确地声明了sum,因为他们知道值会改变。但是,这个程序员使用let错误地声明了数组 numbers ,因为他将把东西推入数组理解为改变数组的值

    解释“改变”的正确方法是更改内存地址let 允许你更改内存地址。const 不允许你更改内存地址。

    const importantID = 489;
    importantID = 100; // 类型错误:赋值给常量变量
    

    让我们想象一下这里发生了什么。

    当声明importantID时,分配了一个内存地址,并存储489的值。记住,将变量importantID看作等于内存地址。

    当将100分配给importantID时,因为100是一个原始数据类型,所以会分配一个新的内存地址,并将100的值存储这里。

    然后 JS 尝试将新的内存地址分配给 importantID,这就是抛出错误的地方,这也是我们想要的行为,因为我们不想改变这个 importantID的值。

    当你将100分配给importantID时,实际上是在尝试分配存储100的新内存地址,这是不允许的,因为importantID是用const声明的。

    如上所述,假设的初级 JS 程序员使用let错误地声明了他们的数组。相反,他们应该用const声明它。这在一开始看起来可能令人困惑,我承认这一点也不直观。

    初学者会认为数组只有在我们可以改变的情况下才有用,const 使数组不可变,那么为什么要使用它呢? 请记住:“改变”是指改变内存地址。让我们深入探讨一下为什么使用const声明数组是完全可以的。

    const myArray = [];
    

    在声明 myArray 时,将在调用堆栈上分配内存地址,该值是在堆上分配的内存地址。堆上存储的值是实际的空数组。想象一下,它是这样的:

     

    如果我们这么做:

    myArray.push(1);
    myArray.push(2);
    myArray.push(3);
    myArray.push(4);
    myArray.push(5);
    

    执行 push 操作实际是将数字放入堆中存在的数组。而 myArray 的内存地址没有改变。这就是为什么虽然使用const声明了 myArray,但没有抛出任何错误。

    myArray 仍然等于 0458AFCZX91,它的值是另一个内存地址22VVCX011,它在堆上有一个数组的值。

    如果我们这样做,就会抛出一个错误:

    myArray = 3;
    

    由于 3 是一个原始数据类型,因此生成一个新的调用堆栈上的内存地址,其值为 3,然后我们将尝试将新的内存地址分配给 myArray,由于 myArray 是用 const 声明的,所以这是不允许的。

    另一个会抛出错误的例子:

    myArray = ["a"];
    

    由于[a]是一个新的引用类型的数组,因此将分配调用堆栈上的一个新内存地址,并存储上的一个内存地址的值,其它值为 [a]。然后,我们尝试将调用堆栈内存地址分配给 myArray,这会抛出一个错误。

    对于使用const声明的对象(如数组),由于对象是引用类型,因此可以添加键,更新值等等。

    const myObj = {};
    myObj["newKey"] = "someValue"; // 这不会抛出错误
    

    为什么这些知识对我们有用呢

    JavaScript 是世界上排名第一的编程语言(根据 GitHub 和 Stack Overflow 的年度开发人员调查)。 掌握并成为“JS 忍者”是我们所有人都渴望成为的人。

    任何质量好的的 JS 课程或书籍都提倡使用let, const 来代替 var,但他们并不一定说出原因。 对于初学者来说,为什么某些 const 变量在“改变”其值时会抛出错误而其他 const变量却没有。 对我来说这是有道理的,为什么这些程序员默认使用let到处避免麻烦。

    但是,不建议这样做。谷歌拥有世界上最好的一些程序员,在他们的 JavaScript 风格指南中说,使用 const 或 let 声明所有本地变量。默认情况下使用 const,除非需要重新分配变量,不使用 var 关键字(原文)。

    虽然他们没有明确说明原因,但据我所知,有几个原因

    • 先发制人地限制未来的 bug。
    • 使用 const 声明的变量必须在声明时初始化,这迫使程序员经常在范围方面更仔细地放置它们。这最终会导致更好的内存管理和性能。
    • 要通过代码与任何可能遇到它的人交流,哪些变量是不可变的(就 JS 而言),哪些变量可以重新分配。

    希望上面的解释能帮助你开始明白为什么或者什么时候应该在代码中使用 let 和 const 。

    展开全文
  • 默认enable_char_error方法的enable参数True,即打开错字纠正,这种方式可以召回字粒度错误,但是整体准确率低; 如果追求准确率而不追求召回率的话,建议将enable设False,仅使用错词纠正。 加载自定义...
  • 在执行模型预测时发生代码错误:ValueError: Error when checking input: expected embedding_1_input to have shape (100,) but got array with shape (3,) 测试代码: ...
  • 代码语法错误分析工具pclint8.0

    热门讨论 2010-06-29 07:00:09
    PCLint识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要...
  • 思考bug

    2014-01-15 09:23:59
    在思考为什么会发生这些错误时,他能凭直觉找到模型中什么地方不对或发现写的代码跟这个模式什么地方有出入。 Ken教会了我一个极其重要的习惯:纠错前先思考。如果你一头扎进问题中,你只能解决当前代码的问题,但...
  • 面试|说说Java中的异常体系

    千次阅读 多人点赞 2019-07-08 09:30:18
    为什么会有异常? 异常(Exception)是Java语言提出的一种错误报告模型,这种错误报告模型在程序和客户端之间传递异常问题。 我们应该意识到任何代码不可能是完全正确且永久正确,因此代码中必定存在异常或者错误;...
  • 对于深度学习模型的可解释性,也就是我们想要知道它内部的工作机理是什么样的,为什么会发生错误,什么情况下会发生错误,这方面的研究也是很受关注。包括美国的一些相关科研机构都把可解释性的机器学习作为深度学习...
  • 最有价值的编程忠告

    2012-08-20 15:15:04
    纠错前先思考 思考——不看代码的思考——是最好的...在思考为什么会发生这些错误时,他能凭直觉找到模型中什么地方不对或发现写的代码跟这个模式什么地方有出入。 http://www.csdn.net/article/2012-08-20/2808821
  • 所犯的错如果只穿透一层,就不会注意到或是造成什么影响,可视如何这个错误造成的洞穿越多层 的防卫机制,就造成大灾难,这个模型适用于所有因为错误造成致命后果的领域---例如,医药和空中交通 ...
  • 为什么测试?1、对质量可接受性做出判断 2、发现问题 错误:mistake ,在程序中出现的错误称为bug 缺陷:是错误的结果,错误的表现 失效:当缺陷执行时会发生失效 事故:当出现失效时,可能会也可能不会呈现给...
  • 3.1损失函数和优化

    2019-12-24 01:06:09
    如果我们对于SVM所有错误的分数求和会发生什么,如果我们将所有正确的分数求和会发生什么? 损失函数 我们知道线性分类器需要输入数据x和参数w,如果我们想优化w,使模型更精确,如果可以写一个函数自动决定哪些w是...
  • Java PermGen

    2013-06-20 21:11:48
    最近项目中发生了java.lang.OutOfMemoryError: PermGen ...下面讲讲到我为什么会发生这样的错误。  首先,在这里添几个链接,我是在这些文章中提取的找到相应的内容的。  http://www.integratingstuff.com/2011/07/
  • todo-app-april2021-源码

    2021-04-16 11:43:56
    对于这些事件中的每一个,一个一问,“什么时候会发生”。 考虑如何验证您的每个步骤 考虑您的数据模型。 您将使用什么对象? 什么是键/值对? 您需要什么阵列? 本地存储中需要存储什么? 考虑哪些功能取决于...
  • “汉明码”是一种“错误纠正码”,可以用来检测并且纠正数据从发送端发往接收端中发生错误。 汉明码的发明者理查德汉明在1940年代晚期,运用贝尔模型V(Bell Model V)电脑于贝尔实验室(Bell Labs)工作。输入端...
  • PrequelErrorCodes-crx插件

    2021-04-06 21:08:22
    将http错误代码更改预示模型 hello。 您有没有听到HTTTP状态代码的悲剧? 我以为不是。 Sysadmins告诉你不是一个故事。 这是一个www传奇。 HTTP状态代码是如此强大,它们揭示了网站发生什么。 但开发人员拥有...
  • JVM常见问题

    2020-06-05 10:19:49
    2.1 jvm内存模型以及分区,需要详细到每个分区放什么 分区 解释 程序计数器(PC) 存放下一条jvm指令的地址。特点:是 线程私有 的; 不会发生OOM (OutOfMemory,内存溢出) 本地方法栈(Native Method Stacks...
  • 1.1.9 输入 ping IP 后敲回车,发包前会发生什么? 1.2.0 请解释下为什么鹿晗发布恋情的时候,微博系统会崩溃,如何解决? 1.2.1 现有一批邮件需要发送给订阅顾客,且有一个集群(集群的节点数不定,会动态扩容...
  • 为什么我们需要这个? 我开发了该系统,以防止宠物在实习期的前半段在您的屋子里做恶作剧。 宠物主人为什么需要对策? 您可能已经知道在您的住所中装有巧克力,家用电器等大量有害物品。 有时,宠物因此类物品而...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.2 为什么不精确定义标准类型的大小? 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 164
精华内容 65
关键字:

为什么会发生模型错误