文章目录 1. 题目描述2. 求解原理(1)算法模型(2)算法原理 3.编程实现(1)环境说明(2)实验方案(3)Python实现 1. 题目描述 设计一个三层神经网络解决手写数字的识别问题。
要求:
(1)三层神经网络如图:784-15-10结构
(2)使用随机梯度下降算法和MNIST训练数据。
http://yann.lecun.com/exdb/mnist/
2. 求解原理 (1)算法模型 利用BP神经网络,这里有输入层、隐藏层、输出层共三层,包括两个阶段,
第一阶段是输入信息的正向传播,其中隐藏层节点的输出为:
输出层节点的输出:
第二阶段是误差反向传播阶段
第p个样本的误差:
p个样本的总误差:
(2)算法原理 BP算法可以描述如下:
(1)工作信号正向传播:输入信号从输入层经隐藏层,传向输出层,在输出端产生输出信号,这是工作信号的正向传播。在信号的向前传递过程中网络的权值是固定不变的,每一层神经元的状态只影响下一层神经元的状态。如果在输出层不能得到期望的输出,则转入误差信号反向传播。正向传播的数学模型为:
其中n为样本数,w为权值,θ为偏置,
为激活函数,这里选择sigmoid函数为激活函数。
(2)误差信号反向传播:网络的实际输出与期望输出之间差值即为误差信号,误差信号由输出端开始逐层向前传播,这是误差信号的反向传播。在误差信号反向传播的过程中,网络的权值由误差反馈进行调节。通过权值的不断修正使网络的实际输出更接近期望输出。
在反向传播中,第p个样本的误差为:
p个样本的总误差:
梯度为:
其中:
3.编程实现 (1)环境说明 python3.7
tensorflow2.1.0
(2)实验方案 数据来源:
手写数字图片数据集MNIST,它包含了0-9共10种数字的手写图片,每种数字一共7000张图片,采样自不同书写风格的真实手写图片,一共70000张图片,其中60000张图片作为训练集,用来训练模型,剩下的10000图片作为测试集,用来预测或者测试,训练集和测试集共同组成了MNIST数据集。
考虑到手写数字图片包含的信息比较简单,每张图片均被缩放到28 × 28的大小,同时
只保留了灰度信息。这些图片由真人书写,包含了如字体大小、书写风格、粗细等丰富的样式,确保这些图片的分布与真实的手写数字图片的分布尽可能的接近,从而保证了模型的泛化能力。
实验计划和流程:
(1)网络搭建。搭建784-15-10结构的神经网络,激活函数类型为 ReLU。
(2)模型训练。使用交叉熵作为损失函数。
验证和测试:
手写数字图片 MNIST 数据集的训练误差曲线如图所示,由于 3 层的神经网络表达能力较强,手写数字图片识别任务相对简单,误差值可以较快速、稳定地下降。其中,把对数据集的所有样本迭代一遍叫作一个Epoch,我们可以在间隔数个 Epoch 后测试模型的准确率等指标,方便监控模型的训练效果。
通过简单的 3 层神经网络,训练固定的 200 个 Epoch 后,我们在测试集上获得了91.59%的准确率。模型的训练误差曲线如图一所示,误差函数为交叉熵,其值越小,模型预测效果就越好。测试准确率曲线如图二所示。
如果使用复杂的神经网络模型,增加数据增强环节,精调网络超参数等技巧,可以获得更高的模型性能。
图一 训练误差 图二 准确率 (3)Python实现 import tensorflow as tf # 导入TF库 from tensorflow import keras # 导入TF子库keras from tensorflow.
初步了解“树”
开发工具与关键技术:Visual Studio 2015 初步了解“树”
作者:李国旭
撰写时间:2020年5月15日
什么是“树”?我们就疑问了。它并不是指路边的那些树木,只是它的的长相像一颗树而已。比如说一个家庭有4名成员:张三有俩个儿子,大儿子张青,次子张虹,大儿子张青的儿子叫张寻,这个家庭父子之间的关系就可以用树型结构表示,如下图表示。
树型结构的数据元素之间呈现分支、分层的特点。树型结构在我们的日常生活中都可以见到的:一个家族、公司、组织等等…都可以用我们的树来表示。还有就是我们的操作系统中的目录树、数据库中信息的组织,下面就是一幅省、市、区的树形图结构图。还有我们电脑上面经常看到的文件目录,根目录里面又有很多子目录和文件,子目录下再包含子目录和文件,这些都是很常见的树关系。
首先,我们先了解一下关于树的概念:树是由n(n>=0)个结点构成的有限集合T,当n=0时T称为空树;否则,在任一非空树T中;(1)有且仅有一个特定的特点,它没有前驱结点,称其为根结点;(2)剩下的结点可分为m(m>=0)个互不相交的子集T1,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树。(注意:树的定义具有递归性,即“树中还有树”。树的递归定义揭示出了树的固有特性)下图来自朱亚兴老师的
而且在我们的计算机中,就只有顺序存储和链式存储,它的表示方法有很多种;我们就来看看树的三种主要的表示方法(a双亲表示法、b孩子表示法、c孩子兄弟表示法)而树呢!是一个(非线性结构)。
(1)双亲(数组)表示法是一种顺序储存结构,这种表示法用一维数组来存储树的有关信息,它会将树中的结点从上到下,从左到右的顺序存放在一个一维数组中,每个数组元素中存放一个节点信息。树的双亲表示法的定义如下:
//树的双亲表示法节点结构定义 #define MAX_TREE_SIZE 100 typedef int ElemType; typedef struct { ElemType data; //节点位置 int parent; //双亲位置 }PTNode; typedef struct { PTNode nodes[MAX_TREE_SIZE]; int r; //根的位置 int n; //节点数目 }PTree; 但是,对于该种表示方法,已知孩子节点寻找双亲非常简单,时间复杂度为O(1),但是对于已知某双亲节点寻找某孩子节点,就需要遍历整个树结构。
当然可以对上述结构进行改进从而克服该缺点,就是对于每个孩子节点,再附设指示其孩子节点在数组中位置的元素,但是由于各个节点的孩子数不同,就需要根据节点度的最大值来决定需要附设几个指示元素,当然会造成空间的浪费,应了那句话“提高空间效率便会增加时间复杂度,提高时间效率便会增加空间复杂度。”这句话,对于研究算法就有着重要的一个因素,如何在解决某个问题的时候,实现效率和复杂度的最优化,找到最好的平衡点。
(2)孩子表示法:类比于上面的双亲表示法,该方法无非就是在每个节点附设存放孩子位置的指示。但是它就存在一个问题,也就是在上面也曾经提到过,就是每个节点的孩子的数目是不一定相同的,甚至差别较大,此时如果单纯按照节点度的最大值来声明足够的空间,则必然造成很大的浪费,因为有很多的指针域是空的。针对以上这个问题,此时我们可以想到另一种表示方法,就是在每个节点中存储节点的度,按照节点的度来申请空间,但是还是不行啊,这种结构不好统一处理,而且初始化和维护起来难度大,用这个树的孩子链表示法。(下图来自朱亚兴老师),如图所示:
#define MAX_TREE_SIZE typedef char ElemType //孩子节点 typedef struct CTNode {int child; //孩子节点下标 struct CTNode *next; //指向下一个孩子节点的指针 }*childPtr; //表头节点 typedef struct { ElemType data; //存放在树中的节点的数据 int parent; //存放双亲的下标 childPtr firstChild; //指向第一个孩子的指针 }CTBox; //树结构 typedef struct { CTBox nodes[MAX_TREE_SIZE]; //节点数组 int r; //根的位置 int t; //节点数目 }CTree; (3)孩子兄弟表示法:上面两种方法分别从孩子的角度来表示树的存储结构,可以很快的找到结点的双亲或孩子,但是呢找结点的兄弟就会比较困难。任意一棵树的结点,如果他的第一个孩子和它的右兄弟如果存在,必定是唯一的,因此我们就可以设置两个指针,分别是指向孩子和此节点的兄弟data是数据域,firstchild是储存该节点第一个孩子结点的存储地址,rightsibling是储存该节点的右兄弟结点的存储地址。如下表格所示:
1.在使用selenium打开chrome时同时打开了两个标签页,且页面停留在chrome的设置页面,页面打开链接后data页面也没有消失。 如下图:
处理方式:
win+r 运行 regedit , ctrl+f 搜索 TriggeredReset ,或者直接找下面路径
HKEY_CURRENT_USER\Software\Google\Chrome\TriggeredReset
删除 即可
2.自动化打开浏览器时,顶部显示“正受自动测试软件控制” 解决方法-Java:
//去除Chrome正受自动测试软件的控制 ChromeOptions option =new ChromeOptions(); option.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"}); 3.xml配置文件快捷注释键 注释:CTRL + SHIFT + /
取消注释:CTRL + SHIFT + \
当我们使用IDEA运行SpringBoot的项目的时候,我们会发现控制台出现找不到或无法加载主类的错误,当然了如果出现了这个错误那么你的SpringBoot项目肯定是无法运行的,那么我们应该如何解决这个问题的呢?
错误信息
详细解决步骤 1 . 点击IDEA最右边的Maven我们可以看到我们的项目。
2 . 找到springboot --> Lifecycle。
3 . 我们点击clear清空我们的加载配置文件等。
4 . 点击install重新加载相关文件。
5 . 找不到或无法加载主类的问题已经解决,我们可以正常运行我们的项目了。
a、添加表字段:ALTER TABLE 表名 ADD 字段名 字段类型(字段长度);
示例:ALTER TABLE "user" ADD gid1ype numeric(50);
b、给字段添加注释:COMMENT ON COLUMN "表名"."字段名" IS '注释内容';
示例:COMMENT ON COLUMN "user"."gid1ype" IS '类型 1为普通 2为高级';
c、修改表名:alter table table_name(表名) rename to new_table_name(新表名);
示例:alter table "user" rename to "ts_user";
d、修改字段名称:ALTER TABLE "表名" alter COLUMN 字段名 type 字段类型(长度) ;
示例:ALTER TABLE "ts_user" alter COLUMN gid1ype type VARCHAR(50) ;
更多学习内容请移步到: https://www.processon.com/view/60504b5ff346fb348a93b4fa#maphttps://blog.csdn.net/qq_28245087/article/details/112061984
概述 KKfile文件预览是一款开源的文档在线预览项目。项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,Excel,pdf,txt,zip,rar,图片等等。
项目特性 支持word excel ppt,pdf等办公文档
支持txt,java,php,py,md,js,css等所有纯文本支持zip,rar,jar,tar,gzip等压缩包支持jpg,jpeg,png,gif等图片预览(翻转,缩放,镜像)支持mp3,mp4,flv等多媒体文件预览使用spring boot开发,预览服务搭建部署非常简便rest接口提供服务,跨平台特性(java,php,python,go,php,....)都支持,应用接入简单方便支持普通http/https文件下载url、http/https文件下载流url、ftp下载url等多种预览源提供zip,tar.gz发行包,提供一键启动脚本和丰富的配置项,方便部署使用提供Docker镜像发行包,方便在容器环境部署抽象预览服务接口,方便二次开发,非常方便添加其他类型文件预览支持最最重要Apache协议开源,代码pull下来想干嘛就干嘛 部署指南 项目下载 可从码云中下载最新发行版本到本地:https://gitee.com/kekingcn/file-online-preview/releases
将项目导入至IDEA。根据需求修改配置文件application.properties。具体参考文档:https://kkfileview.keking.cn/zh-cn/docs/config.html将项目打包放入linux服务器中,第一次打包可直接将生成的压缩包上传上去并解压。因为压缩包中包含了许多项目需要的配置文件以及启动命令,可以省去我们许多工作。 项目启动:Windows下以管理员身份运行startup.bat,Linux以root用户运行startup.sh。如果不是root用户启动项目初始化启动时会失败。 使用指南 当您的项目内需要预览文件时,只需要调用浏览器打开本项目的预览接口,并传入须要预览文件的url。
注意,如果要预览的url里包含需要转义的特殊字符,如下表格,请encodeURIComponent(url)转义
1. 普通文件下载url预览 var url = 'http://127.0.0.1:8080/file/test.txt'; //要预览文件的访问地址window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(url));
2. http/https下载流url预览 很多系统内不是直接暴露文件下载地址,而是请求通过id、code等参数到通过统一的接口,后端通过id或code等参数定位文件,再通过OutputStream输出下载,此时下载url是不带文件后缀名的,预览时需要拿到文件名,传一个参数fullfilename=xxx.xxx来指定文件名,示例如下
var originUrl = 'http://127.0.0.1:8080/filedownload?fileId=1'; //要预览文件的访问地址var previewUrl = originUrl + '&fullfilename=test.txt'window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(previewUrl));
3. FTP下载url预览 1). FTP匿名访问 如果要预览的FTP url是可以匿名访问的(不需要用户名密码),则可以直接通过下载url预览,示例如下
var url = 'ftp://127.0.0.1/file/test.txt'; //要预览文件的访问地址window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(url));
2). 非匿名访问,确定只有访问一台FTP服务器 如果预览服务只访问一台FTP服务器,只需要在配置文件中 配置FTP链接信息 ,则可以直接通过下载url预览,示例如下
var url = 'ftp://127.0.0.1/file/test.txt'; //要预览文件的访问地址window.open('http://127.0.0.1:8012/onlinePreview?url='+encodeURIComponent(url));
3). 非匿名访问,不只访问一台FTP服务器 如果预览服务要访问多台FTP服务器,且用户名密码不一致,可以通过在url中加入用户名密码等参数预览(url参数中的优化于配置文件中的),示例如下,
var originUrl = 'ftp://127.0.0.1/file/test.txt'; //要预览文件的访问地址var previewUrl = originUrl + '?
解决:在项目外部的build.gradle中增加
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
buildscript { repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } google() jcenter() } }
一、Nacos简介 Nacos(Naming和Configuration的前2个字母,s为Service),一个更易于构建云原生应用的动态服务发现、配置管理和服务管理的平台。
注册中心+配置中心的组合。
Nacos = Eureka + Config + Bus。
《Nacos 英文文档》
《Nacos 中文文档》
二、Nacos的下载、安装和使用 本次使用的环境为:nacos-server-1.2.1、windows、jdk1.8。
《nacos-server-1.2.1下载地址(含windows和linux)》
下载、解压之后,启动 \nacos-server-1.2.1\bin 下的 startup.cmd 即可启动。
访问 http://localhost:8848/nacos ,账号密码均为 nacos。
如果不想使用 8848 端口或者不想使用 /nacos ,可以在 conf/application.properties 中进行配置或修改。
三、Nacos做服务注册中心的配置相关 本次采取Maven特有的父子项目模式实现开发,方便代码的汇总和管理。
针对不知道如何创建父子工程的,可以参考以下博客:
《使用eclipse搭建maven多module项目(构建父子项目)》
如果大家使用的是idea,可以参考以下博客:
《idea配置maven环境》
《idea创建多级Springboot父子工程》
3.1、父工程的创建 父工程作为一种公用依赖的汇总和管理,只需要配置好共有的pom即可。
<artifactId>Spring-Cloud-Alibaba-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>cloudalibaba-Consumer-9001</module> <module>cloudalibaba-Product-9102</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> <druid.version>1.1.16</druid.version> <druid.spring.boot.starter.version>1.1.10</druid.spring.boot.starter.version> <spring.boot.version>2.2.2.RELEASE</spring.boot.version> <spring.cloud.version>Hoxton.SR1</spring.cloud.version> <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version> </properties> <!-- 子模块继承之后,提供作用:锁定版本 + 子module不用谢groupId和version --> <dependencyManagement> <dependencies> <!
使用VS code调试Clang VS code是一款非常好用的开发工具,是远程开发的必备利器。Clang虽是编译器,但对于程序员来说也是一个app,所以自然也可以使用gdb来调试。为了更好的学习Clang的代码,推荐使用VS code + gdb的方式直接debug Clang的代码,结合文档说明做到深入学习理解。
编译Clang 可以参考LLVM官网使用CMake命令编译,由于要debug,所以必须编译Debug版本的Clang。可参考使用下列编译命令:
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="Debug" -DBUILD_SHARED_LIBS=True -DLLVM_USE_SPLIT_DWARF=True -DCMAKE_INSTALL_PREFIX="/home/user/prefix-test" -DLLVM_OPTIMIZED_TABLEGEN=True -DLLVM_BUILD_TESTS=True -DLLVM_TARGETS_TO_BUILD="X86" -DLLVM_ENABLE_PROJECTS="clang;llvm;compiler-rt" -DLLVM_ENABLE_ASSERTIONS=On ../llvm 配置VS code VS code需要预先安装C++的插件,然后点击“RUN”---->“Open Configrations”,仅需要配置“program”和“args”两项即可
"version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/out/stage2-install/bin/clang++",//配置Clang编译结果路径 "args": ["--target=riscv64 -o ${workspaceFolder}/test_c++.cpp.o -c++ ${workspaceFolder}/test_c++.cpp"], //Clang参数 "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", 调试 完成以上步骤,就可以F5直接调试了!
运行前先在Clang的main函数打个断点,位置在
llvm-project/clang/tools/driver/driver.cpp
文章目录 赋值语句翻译算数表达式含数组引用的翻译类型转换 总结赋值语句翻译 赋值语句翻译 算数表达式 属性文法略
翻译模式:
S→id:=E { p:=lookup(id.name);
if p!=nil then emit(p ‘:=’ E.place)
else error }
E→E1+E2 { E.place:=newtemp;
emit(E.place ‘:=’ E1.place ‘+’ E2.place)}
E→E1E2 { E.place:=newtemp;
emit(E.place ‘:=’ E 1.place ‘’ E 2.place)}
E→-E1 { E.place:=newtemp;
emit(E.place‘:=’ ‘uminus’ E 1.place) }
E→(E1) { E.place:=E1.place }
E→id { p:=lookup(id.name);
if p!=nil then E.place:=p
else error }
E用来表示产生终结符。
相关属性说明:
place:综合属性,表示存放E值单元的名字或地址
code:综合属性,三地址代码。
相关函数说明:
newtemp:产生一个中间临时变量,如T1,T2…
emit:产生三地址代码(可能使用四元式形式表达,也可能是原始的三地址代码形式)
lookup:在符号表中查找相应入口
观察此翻译模式得到如下结论:
1、简单算数表达式的文法共6个产生式,注意其中“-”为单目运算符,即表示求相反数,取负号,不是减法。
关注上方“深度学习技术前沿”,选择“星标公众号”,
资源干货,第一时间送达!
作者:清雨卢
知乎链接:https://zhuanlan.zhihu.com/p/138523753
本文仅供参考学习,如有侵权,请联系删除!
本人非科班,本科所学为如何搬砖。18年跨考到浙大计算机,因为跨专业(其实主要是自己菜。。。)导致复试完后找导师四处碰壁,最后找到AI方向的导师后满心欢喜地以为自己捡了漏。后来怀着对学术的满腔热情来到了浙大,却被现实打击的不行,原来老板早在多年前就已经不做学术,一心搞行政,所有科研全部靠自己。那么作为一个刚跨考过来还想搞算法的菜鸡而言,有多凉凉可想而知。
个人认为自己还算是一个挺有想法的人,但是科研光靠想法多并没有什么卵用。没有一个靠谱的引路人帮你指引方向、把关ideal的话,想要做出成果难如登天。最初也想着认命了,认为反正作为一个浙大计算机的研究生而言,至少工作不用担心了。所以,当刚入学的时候,师姐意味深长地问我们想继续做算法还是做开发的时候,曾经信誓旦旦地表示誓于AI共存亡!然而研一面试网易实习的失利,以及接下来接二连三的海投但简历基本毫无回应地时候,残酷地现实还是彻底地把我敲醒了。后经过各方打听,才发现现在各行各业,学机械的、学自动化的、学船舶的。。。等等,哦对,还有学中文的,基本只要是个专业就有很大一部分人在搞算法,搞CV,毕竟有着算法高级码农,事少钱多高大上的说法,导致当前市场上上算法岗严重供过于求。
于是乎,招聘市场流传起了算法岗找工作必须人手一篇顶会的传说。那么,事实是否真是如此呢?没有那么夸张!没有那么夸张!没有那么夸张!这里划重点!如上所述,本人研究生期间基本没有什么正儿八经科研地经历,也只有两个比较水的项目,但没有发过任何论文。至于实习经历,也基本为零。但是!今年春招本人还是有幸拿到腾讯AI平台部的算法实习offer。接下来本文将从几个方面来介绍本人在疫情期间春招算法时的一点经验,希望能对大家有些用处。
信心篇 首先,找工作前第一点需要具备的就是强大的内心(大佬如果是offer收割机请自动忽略),需要相信自己一定没问题。虽然相比于其他岗位而言,算法岗确实要难上一个量级,但也完全没有达到人手一篇顶会的地步。大厂招聘时,如果有顶会论文的确会相当加分。但是!一来,研究生期间能够发篇顶会的人真的时凤毛麟角,就算是我们院这一级我知道的发过顶会的也绝对没到两手之数,这一部分神人基本都已经被各大公司的研究院,如阿里达摩院,腾讯AIlab等顶级部门挖走,我们这等凡人基本没有和他们同台竞技的机会。二来,像腾讯阿里这样的大厂,他们需要的是一群有创造力,能解决问题的年轻人。之所以更喜欢要发过顶会的同学,其实更主要是因为顶会是对一位同学是否有足够的创新能力以及解决问题的能力的很好证明。但另一方面,这些能力却并非只有顶会才能证明,也就是说,如果在面试过程你更够表现出自己的这些能力,再加上基础知识扎实,编程能力过关,基本一个算法offer跑不掉了。
恰好,这些所谓的面试时表现得能力,知识,编程全部都是可以通过一段时间的准备获得,或者更赤裸裸的说,只要是面试就永远是可以速成的。以下,则是我的算法面试速成之路。
经验篇 面试,尤其是算法岗的面试总有一个固定的套路(不排除个别公司,个别面试官会不走寻常路),即自我介绍,项目经历,算法基础知识,编程题这四大项。接下来,本文将从这四个方面的准备进行阐述。
1 自我介绍
自我介绍是所有面试都会有的一个环节,很多人会觉得这个环节一般最多三分钟,甚至觉得面试官可能也不太会看重这些,毕竟该有的简历上都有了,因此往往会忽视其重要性,进而草草准备、直接上场。倒不是说,自我介绍不好就一定会跪,只能说这么多年检验下来所有面试都放在第一个的环节,对于一个经验丰富的面试官而言,他一定是会看重的。
一个没有用心准备的自我介绍,或者说一个不好的自我介绍往往会有以下三种模式:
1. 照本宣科型。
简历上写了什么,就像流水账一样从上到下念下来。干嘛呢?干嘛呢?人家面试官稀罕听你的富有磁性的声音从头到尾念一下简历啊?面试官的时间是宝贵的,人家自己扫一眼就能看完不香嘛?
2. 内容干瘪型。
上来就说自己性格开朗,有很强的科研能力等等。So?你倒是说说你怎么就性格开朗了呀?你说你开朗面试官就觉得你开朗了?那你要是说你飞机开得好呢?。。。一个良好的介绍或阐述永远是有论点支撑的。
3. 夸夸其谈型。
觉得该说的东西简历上面都有了,应该说一些简历上没有的来彰显自己与众不同的。各方面去阐述自己有强大的沟通能力,组织能力,各种唱歌、演讲比赛出类拔萃等等。如果内心活动能转化成表情包,面试官此时一定是个超大的黑人问号脸。。。我们公司招个算法工程师,你会唱歌会演讲过来干啥来了?方便自己拍个视频做成数据集??
那么一个良好的自我介绍究竟如何准备呢。其实,好的自我介绍和一个吸引人的演讲是一样的,需要关注的永远是听众更想听什么,然后把你想说的东西用听众喜欢的方式表达出来。那么对于面试的自我介绍而言,我们需要关注的就应当是面试官想要招一个什么样的员工,然后对应的去组织自己的语言。所以,一般一个好的自我介绍的核心内容往往就是三段式:
1.首先,面试官招聘的很有可能以后就是他的同事,所以他一定希望面试者是一个有趣的人。毕竟谁愿意整天面对着一个面瘫脸工作呢,因此自我介绍里面一定要有能体现自己性格开朗,沟通能力等软实力方面的内容。但是严防出现大段这类话的形况,防止喧宾夺主,毕竟人家招的还是技术岗,技术最重要。
2.和其他行业不同,IT届的技术岗非常重视你的技术实力,因此自我介绍中用简短的语言介绍你的技术以及科研经历、能力也非常重要。
3.计算机技术日新月异,迭代的速度完全不是其他任何行业可以比拟的。因此工作的时候需要不断地学习新知识,否则根本无法适应不断提升地业务需要。所以面试官希望的面试者还是一个对于技术、新鲜事物有强烈好奇心的骚年。
但需要这三段,并不是说只要包含这三个内容就足够了。表达的方法也很重要,不能像第二种类型一样,只是干瘪的介绍。每一个论述都需要有论点的支撑,最好的方法就是每个你想介绍的方面都选取你的经历中最典型的,能表现这一方面的用几句话概括起来,然后加上所以我觉得沟通能力还不错之类的总结。这样才能让自我介绍更加丰满,让面试官感觉好像听故事一样。
同时,自我介绍的时候语气也非常重要!!首先全程一定要用中气十足的语气,让人觉得你很有自信,千万千万不要蔫儿蔫儿的。对于不同的内容,要注意情绪的转换,比如说自己幽默、性格开朗的时候,你就需要用一种积极向上的,话里都带着笑得语气表达出来,千万不要像白开水水一样让人感觉你在背书。否则,你的内容准备得再好也没有半毛钱用处。
项目经历 不同于外企,国内的互联网非常非常重视项目经验,又或者说是因为面试官在面试过程中,往往从聊项目中可以看到得东西最多。因此,一般一轮60分钟的面试有45-50分钟基本都是在问项目,我腾讯的三面甚至于就只问我的其中一个项目就问了一个小时,可想而知面试官对于项目的问题问的有多么深入。但同样的,对于项目经历这一环节仍然有套路可循(当然前提是你有项目,啥项目都没有的。。。emmm)。
首先,项目在精,不在多。千万不要把自己曾经做过的大大小小的项目一股脑地全都放到简历上去,因为你简历上的每一个项目都有可能被面试官当成重点,抽丝拨茧式进行提问,如果你因为对这个项目准备得不够充分而某几个问题回答的不够好,基本这轮面试结束就是可以去准备别的公司了。因此,每把一个项目写到简历上之前,你都需要确保这个项目你能把它弄得非常透彻,达到任何一个细节都了如执掌的地步才可以。
那对于一个项目该如何进行面试前的准备呢?同样,对于这个问题,仍旧需要先站在面试官的角度,思考面试官想要从和你交流项目的过程中知道什么。还是那句话,面试官需要招聘的是基础知识扎实、有能力解决问题的、富有创造性的、同时又有一定沟通能力的人。因此,接下来的准备过程中,都需要处处以能展现这几点为目的。面试官问项目的时候也往往遵循着一个套路:简单整体介绍项目,你的创新点是什么?项目中用到的某个网络或者某个技术你了解吗?这个项目你遇到了哪些困难、你是如何解决的?这个项目的评价标准是什么?最终达到什么样的性能?咋一看似乎这些问题不是很有规律可言,但其实就像拔萝卜的过程一样:
1. 从宏观上认识萝卜。
也就是你首先要用简短的语言,几句话将你的萝卜整体展现给面试官。一般这几句话我们往往会依照STAR法则去组织语言,即在什么背景(Situation)下,为了解决什么问题(Target),采取了什么方法(Action),最后达到了什么效果(Result). 2. 把主体拔出来。
一般面试官会让你介绍你项目中所用到的网络,此时作为面试者就可以按照:为什么用这个网络,网络结构和特点是什么,训练和测试的差别等进行回答。例如我其中的一个项目用到了一个检测网络SSD,那我就会从速度要求引出one_stage和two_stage的区别,因此使用较快的SSD。然后介绍其网络结构和其全卷积、先验框、多尺度的特点,最后解释测试时NMS的处理等等。
3. 把细小末梢一点点抽出来。
只准备到能够将主体拔出来的水平仍然不够,你需要做到的是对于其有可能会牵引出来的一切问题都尽可能准备的足够充分。例如,第二点所提到的目标检测,训练过程中如何区分正样本?既然提到了two stage,那么two stage 网络中的ROI-pooling 又是怎么回事?为了让准备的过程中更有逻辑性且考虑更加全面,可以画一棵树,树的主干是此项目所用的主要方法,分出的枝干是所有细节的技术,叶子又是细节技术所牵引出来的其他技术知识。一般也就是准备到两级问题就没基本可以了。如果面试官问到三级、四级。。。那这个面试官真是毫无人性啊,怼他!
4. 对于拔萝卜的评价。
评价问题就非常好准备了,主要为两类评价:
对方法的性能的评价,一般会问你用的评价指标是什么,达到什么水平。例如我的一个项目用到了灵敏度、特异性、AUC,基本所有面试官都问了我这些指标的含义,如何计算,以及的方法达到了什么程度。
在拔萝卜过程中的创新点有哪些,和现有的方法好在哪些方面。在这个过程中遇到了哪些困难,你是如何解决的。(此问题尤为重要!)
基本按着这四点进行准备,项目经历这一块就没什么问题了。当然,还需要重复的一点语气!语气!语气!重要的问题说三遍!同样的话,被不同人,用不同的语气说出来,说服力也完全不一样,哪怕你觉得你的项目就是个渣渣,其实没有任何创新型可言,效果也贼烂,但你在与面试官的交流过程中也一定要底气十足。你需要不停的催眠自己,我做的东西就是最棒的!这一点非常重要!
基础知识 算法面试过程中,还有的非常看重的一点就是对于基础知识的掌握。这些基础知识有可能是在项目经历的交流过程中在第二级问题的时候问,也可能在项目之外单独问,但这些问题其实说来说去也就那么点,无非是如何处理过拟合问题,BN是怎么回事?怎么去理解SVM和逻辑斯蒂回归的区别等等。这些只要花时间认真准备,对每一个问题准备的尽可能充分就妥妥的了。
那么。。。问题来了,想把这些问题都准备地很充分这得多久,时间来得及吗?答,还是挺费时的,对于一个问题如果仅仅简单的概述式的介绍给面试官,那基本是凉了的,那到底怎么样才算是准备的足够高充分了呢?
简单举个栗子,面试官问你知道Batch Normalization吗?你需要这么回答:
BN的背景是什么(即为什么会提出这种方法)
BN的基本原理是什么,以理解的方式介绍大概步骤
训练和测试时的方差和均值选取的差别
BN的多卡同步又是怎么回事?
甚至,你可以进一步了解下,BN所针对的激活函数一般是sigmoid,可以将参数拉离饱和区,那么如果换成Relu的话,BN是否还有效呢?再进一步的话还可以了解下主流的规范化方法有哪些?(这种程度的问题就知道个名字就好了,不知道也没问题)。
如果你能对一个问题理解到这种程度,基本面试官只要不是压根看你不爽,基本都会觉得你很棒棒了。But! 这么准备下来,一个问题都得准备好久,岂不是根本来不及了?因此!要懂得借用集体的智慧,比如我就组织了我们实验室的五个小伙伴建立一个讨论小组,每天轮流三个人每个人准备一个问题,把问题准备到上面的那个地步,将自己组织好的问题答案共享到腾讯文档,然后每天晚上八点半大家一起讨论。这样还有一个好处就是一个人去理解一个问题的时候往往很容易陷入牛角尖,理解的也很容易片面,但大家一起讨论之后,基本就能很快豁然开朗了。这么准备起来,每天其实只要花很少的时间就可以在相对较短的时间内把这个环节准备的非常充分了。以下是我们讨论小组准备的材料部分预览,我们5个花了大约一个月的时间,共讨论了约70+的问题,约四万五千字的文档使我在面试过程中,基本没有遇到过没讨论过的问题。这些问题可以自己觉得重要的,或者去牛客网上找面经中的问题,同时也非常推荐《百面机器学习》这本书,我们的很多问题也是直接在这本书上找的。
在小组讨论的过程中,千万千万不要存在”留一手“的心思。你要知道,你的竞争对手永远不是你身边的这几个人,而是成千上万的其他面试者,最后你们几个一起打下了坚实的基础,一起拿到大厂offer岂不美哉。
编程能力 如果你能按照上面三点贯彻地执行下来,可以说就已经离大厂的offer很近了。但仍有一个坎,如果没有把它买过去的话,之前的所有努力仍有可能付之东流,那就是编程能力。在这个问题上,就没有任何捷径可以走了,只能刷题!刷题!刷题!如果时间不够的话,可以先刷剑指offer,基本面试中碰到的大部分问题都在里面,时间充足的话,就可以按照类别或者其他任何方式,刷大量的leetcode,至于到底多大量算是够了。。。只能说越多越好吧。当然对于ACM大佬而言,应该是不需要怎么刷了。。。随便来几题找找手感可能就好了吧。
el-select中加入filterable属性,就开启了搜索功能,然后我们用:filter-method="dataFilter"可以自定义一个搜索筛选条件,在这里来写我们自己的逻辑代码。监听输入框里面输入文字后,自动调用后台接口获取下拉框的数据
<template> <section class="p-10"> <el-select clearable v-model="value" placeholder="请选择" filterable :filter-method="dataFilter"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </section> </template> <script> export default { data() { return { optionsCopy: [{ value: '1', label: 'meat' }, { value: '2', label: 'drink' }, { value: '3', label: 'food' }, { value: '4', label: '龙须面' }, { value: '5', label: '北京烤鸭' }], options: [{ value: '1', label: 'meat' }, { value: '2', label: 'drink' }, { value: '3', label: 'food' }, { value: '4', label: '龙须面' }, { value: '5', label: '北京烤鸭' }], value: '' }; }, methods: { dataFilter(val) { this.
虚拟机有一段时间没用,开机发现linux系统卡在开机画面了,不能正常开机
开始分析排查问题
1.du启动虚拟机,按任意键进入GUN界面
按e进入
移到第二项,按e进行编辑
把rhgb quiet删掉,回车,按b重新引导系统。
结果执行到一半又不动了,整个人都不好了
2. 直接快捷键 ctrl+alt+f2进入命令行模式,使用root账号登录,修改一下启动级别,不使用图形化界面了
使用vim /etc/inittab 命令
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
最近工作中和第三方进行单点登录联调的时候遇到一个小坑,关于http请求问题。在请求链接中有了特殊符号例如
#字符在后台request取值时候为空。可以用字符的转义,当然也可以用post请求来解决参数问题。
案例:
(1)请求连接包含#,后边的参数获取都为空。
http://localhost:8080/ierp/?formId=pc_main_console#/dform&apptype=FACA&ticketId=18681569615
(2)将#号转义获取值正确。
http://localhost:8080/ierp/?formId=pc_main_console%23/dform&apptype=FACA&ticketId=18681569615
url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值。
解决办法
将这些字符转化成服务器可以识别的字符,对应关系如下:
URL字符转义
用其它字符替代吧,或用全角的。
+ URL 中+号表示空格 %2B 空格 URL中的空格可以用+号或者编码 %20 / 分隔目录和子目录 %2F ? 分隔实际的URL和参数 %3F % 指定特殊字符 %25 # 表示书签 %23 & URL 中指定的参数间的分隔符 %26 = URL 中指定参数的值 %3D
事件中心模块
本篇文章只是用来记录学习的笔记。
单例模式基类
知识点:
Dictionary,委托,观察者模式
委托和事件详解
作用:
降低程序耦合性,减小程序复杂度
按照这张图来创建4个脚本以及对象
Monster
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Monster : MonoBehaviour { void Start() { Dead(); } /// <summary> /// 死亡方法 /// </summary> void Dead() { Debug.Log("怪物死亡"); //玩家得奖励 GameObject.Find("Player").GetComponent<Player>().MonsterDeadDo(); //任务记录 GameObject.Find("Task").GetComponent<Task>().TaskWaitMonsterDeadDo(); //其它 GameObject.Find("Other").GetComponent<Other>().OtherWaitMonsterDeadDo(); //等等 } } Player
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { /// <summary> /// 怪物死亡时要做些什么 /// </summary> /// <param name="info"></param> public void MonsterDeadDo() { Debug.
SuperMap怎么实现距离测量
开发工具与关键技术:Visual Studio 2015 SuperMap怎么实现距离测量
作者:李国旭
撰写时间:2020年4月29日
在SuperMap中怎么去实现这个功能呢?那么在做这个功能之前,第一个要做的就是把地图加载出来,没有地图是操作不了的;无论是距离测量、面积量算、范围查询等等…这些都是在有地图的基础上做出来的。“SuperMap.Include.js”先把这个超图的js的脚本文件引用
1、首先,声明“rangingLayer, polygonLayer, drawLine”这三个参数,第二创建好标记图层和矢量图层,还有画线的控件;具体的内容请看下方的代码。
var map, layerWorld, rangingLayer, polygonLayer, drawLine function onPageinit() { //新建面标记图层//新建面矢量图层 rangingLayer = new SuperMap.Layer.Markers("Markers", { displayInLayerSwitcher: false }); polygonLayer = new SuperMap.Layer.Vector("polygonLayer"); //创建画线控制,图层是lineLayer;这里DrawFeature(图层,类型,属性);multi:true在将要素放入图层之前是否现将其放入几何图层中 drawLine = new SuperMap.Control.DrawFeature(polygonLayer, SuperMap.Handler.Path, { multi: true }); drawLine.events.on({ "featureadded": drawCompletedLine }); //初始化地图 map = new SuperMap.Map("map", {//要绑定的html标签ID controls: [new SuperMap.Control.Navigation() , new SuperMap.Control.Zoom() ]}); //初始化图层 layer = new SuperMap.Layer.TiledDynamicRESTLayer("China", url, null,{maxResolution:"auto"}); //监听图层信息加载完成事件 layer.events.on({"layerInitialized":addLayer}); } function RangLayer () { clearLayer(); map.
1、创建页面时即生效 我写在了首页,保证一进入系统即开始接收
created() { // 连接webSocket,用于接收后台实时报警信息推送 this.webSocket(); }, 2、websocket具体操作
methods: { webSocket() { const that = this; if (typeof (WebSocket) == 'undefined') { this.$notify({ title: '提示', message: '当前浏览器无法接收实时报警信息,请使用谷歌浏览器!', type: 'warning', duration: 0 }); } else { // 获取token保存到vuex中的用户信息,此处仅适用于本项目,注意删除或修改 store.dispatch('GetInfo').then(info => { // 实例化socket,这里我把用户名传给了后台,使后台能判断要把消息发给哪个用户,其实也可以后台直接获取用户IP来判断并推送 const socketUrl = 'ws://127.0.0.1:8868/websocket/' + info.username; this.socket = new WebSocket(socketUrl); // 监听socket打开 this.socket.onopen = function() { console.log('浏览器WebSocket已打开'); }; // 监听socket消息接收 this.socket.onmessage = function(msg) { // 转换为json对象 const data = JSON.
文章目录 题目代码PythonC++ 题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
代码 Python class CQueue: def __init__(self): # A存储, B辅助 self.A, self.B = [], [] def appendTail(self, value: int) -> None: self.A.append(value) def deleteHead(self) -> int: # B非空 if self.B: return self.B.pop() # A为空 if not self.A: return -1 # A非空 while self.A: self.B.append(self.A.pop()) return self.B.pop() # Your CQueue object will be instantiated and called as such: # obj = CQueue() # obj.
对于习惯了使用 Markdown 写作的人来说,实在受不了微信公众号原生的排版功能。
因此出现了一批在线工具,能够将 Markdown 格式的文章直接转成适用于微信公众号排版的格式,比如:Md2All(http://md.aclickall.com/ 和 wechat-format(https://lab.lyric.im/wxformat/)。
但是,
对于追求高效、个性与颜值的人来说,这些工具还不够好,于是集众家之所长的 Markdown Nice 出现了。
Markdown Nice Markdown Nice 是一个为了解决微信公众号排版而生的 Markdown 编辑器,当前有在线编辑器和 Chrome 插件 2 种产品形态。
基本信息
工具名称Markdown Nice在线版本https://mdnice.com/Chrome 插件Markdown NiceGitHub 地址https://github.com/mdnice/markdown-nice 在线编辑器: https://mdnice.com/ 在线编辑器是一种比较流行的解决方案,Markdown Nice 做的更开放更漂亮更精致一些。
主要功能特性有:
可导入导出 Markdown 文件,或直接粘贴 Markdown 内容。可将 Html 转成 Markdown ( 菜单栏:功能 → SitDown → 输入 HTML → 得到 Markdown)有多款漂亮的主题可供选择,也可以自定义主题。可将文章转换成匹配微信公众号、知乎或掘金的格式。 实例演示 假设有一个写好的 Markdown 文件名为 test.md,我们要把它转换成微信公众号格式的文章。
操作步骤:
STEP 1. 打开在线编辑器 https://mdnice.com/
左边是编辑器,右边是预览区。
STEP 2. 把 Markdown 内容粘贴到左边的编辑区
今天写了一个一对多的查询用到了collection,首先是这样的
<resultMap id="userParamMap" type="com.veoer.mind.entity.UserParam"> <id column="u_id" jdbcType="VARCHAR" property="id" /> <result column="company_id" jdbcType="VARCHAR" property="companyId" /> <result column="name" jdbcType="VARCHAR" property="name" /> <result column="sex" jdbcType="INTEGER" property="sex" /> <result column="mobile" jdbcType="VARCHAR" property="mobile" /> <result column="email" jdbcType="VARCHAR" property="email" /> <result column="id_card" jdbcType="VARCHAR" property="idCard" /> <result column="work_code" jdbcType="VARCHAR" property="workCode" /> <result column="position" jdbcType="VARCHAR" property="position" /> <result column="if_delete" jdbcType="INTEGER" property="ifDelete" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="supplier_user_id" jdbcType="VARCHAR" property="supplierUserId" /> <result column="supplier_id" jdbcType="VARCHAR" property="supplierId" /> <collection property="