Tomcat总体设计 Tomcat总体结构 Tomcat两个核心组件:Connector和Container;Connector组件可以被替换,一个Container选择对应过个Connector,二者构成一个Service;Server提供生存环境;
Connector负责对外交流,Container主要处理Connector接受的请求,主要处理内部事务(婚姻比喻很恰当)
Server提供一个接口让其他程序访问这个service集合,同时维护所包含的所有Service的生命周期,包括如何初始化、如何结束服务、如何找到别人访问的Service。
Tomcat中组件的生命周期通过LifeCycle接口来控制的,组件只要继承这个接口并实现其中的方法可以统一被拥有它的组件控制了。 Connector组件 主要任务负责接收浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据,然后产生线程处理这个请求并把Request和Response对象传给处理这个请求的线程,处理这个请求的线程就是Container组件要做的事了。
Servlet容器Container Container是容器的父接口,所有子容器都必须实现这个接口,Container容器的设计用的是典型的责任链的设计模式,由Engine、Host、Context和Wrapper四个组件构成。是增增递减的父子关系。
Tomcat中的设计模式 门面模式 主要用在在一个大系统中有多个子系统时,这时多个子系统肯定要相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其他系统,不然没有必要划分子系统。每个子系统设计成门面, ,访问通过这个门面。
观察者模式 也叫做发布-订阅模式,就是事件监听机制。
命令设计模式 主要作用就是封装命令,把发出命令的责任和执行命令的责任分开,也是一种功能的分工。不同模式可以对同一个命令做出不同的解释。
责任链设计模式 责任链模式就是很多对象由每个对象对其下家的引用而连接形成一条链,请求在这条链上传递,直到链上的某个对象处理请求,或者每个对象都可以处理请求,并传递给“下家”,知道终止链上每个对象都处理完。
最近做全站仪项目,涉及到了一些道路桥梁设计方面的知识点。所以写博文留着记录。
目前客户方提供数据为xls数据,如下所示:
上表中记录的为一段交通道路设计中曲线的交点坐标系和里程数据。
如上图所示,在xls表格中记录了QD坐标和默认里程为0,ZD坐标值和里程值。直缓点的里程,还原点的里程,缓直点的里程在xls中均能相加减计算得到,无具体坐标系。
里程为实际黑色线的长度。
需要根据以上数据,计算ZH,HY,YH,HZ点的坐标系。
因为上面是空间平面坐标,且不一定就和N(Y),E(X)坐标系平行垂直,所以必须引用向量概念,确定线的走向,先从QD和JD1计算ZH点的平面坐标系。
每次计算,都是以前一个坐标作为参考,计算△X,△Y再来求出坐标系。
在根据下方公式(我国规定交通道路必须添加缓和曲线),收集好久,唯一能用得上的,计算第一个HY点的控件坐标。
HY点的坐标系计算,实现代码如下:
其中有一部分是常量,根据上述公式计算。精确度越高,就要扩大平方数。
因为缓和曲线的特殊性,ZH点/JD点/HZ点构建为一个等腰三角形,根据JD1交点坐标系和JD2坐标系构建的直线和已知JD1到HZ点的距离,计算HZ点的空间坐标系。
计算实现HZ点的坐标系代码,如下:
另外一边的的缓和曲线和之前的计算一致,但是需要考虑的是JD2到交点2的向量问题,不然可以两边生成。
【H5】两种加密解码方法:
encodeURI(); //加密
decodeURI(); //解密
加密成base64编码格式
btoa() 加密
atob() 解密
实现代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script> // encodeURI 编码与 decodeURI 编码; const str = "帅德布耀布耀滴小雯老公"; let strm = encodeURI( str ) console.log( encodeURI( str ) ) //加密后就是str1 const str1 = '%E5%B8%85%E5%BE%B7%E5%B8%83%E8%80%80%E5%B8%83%E8%80%80%E6%BB%B4%E5%B0%8F%E9%9B%AF%E8%80%81%E5%85%AC' console.log( decodeURI( str1 ) ) //解密后就是str //btoa 加密 atob 解密 base64编码格式 const str2 = encodeURI("帅德布耀布耀滴小雯老公") console.
MSQL开机 High Severity Error 错误图片:
错误原因:
mysql的一个配置文件错误,settiongs.config
错误配置:
<?xml version="1.0" encoding="utf-16"?> <MySQLNotifier> <UpdateCheck /> <WorkbenchMigrationLastAttempt /> <WorkbenchMigrationSucceeded>True</WorkbenchMigrationSucceeded> <AutoAddPattern /> <MachineList><?xml version="1.0" encoding="utf-16"?> <ArrayOfMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /></MachineList> <UseColorfulStatusIcons /> <CheckForUpdatesFrequency /> <AutoCheckForUpdates /> <PingServicesIntervalInSeconds /> <FirstRun>False</FirstRun> <MySQLInstancesList /> <NotifyOfStatusChange /> <WorkbenchMigrationRetryDelay>0</WorkbenchMigrationRetryDelay> <AutoAddServicesToMonitor /> <ServiceList /> <NotifyOfAutoServiceAddition /> <ServiceSettingsList /> </MySQLNotifier> 正确配置:
<?xml version="1.0" encoding="utf-16"?> <MySQLForExcel> <UpdateCheck /> <WorkbenchMigrationSucceeded /> <AutoAddPattern /> <MachineList><?xml version="1.0" encoding="utf-16"?> <ArrayOfMachine xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Machine AutoTestConnectionInterval="10" AutoTestConnectionIntervalUnitOfMeasure="Minutes" MachineId="
四、SpringBoot的配置文件 4.1 SpringBoot配置文件类型
4.1.1 SpringBoot配置文件类型和作用
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用
application.properties或者application.yml(application.yaml)进行配置。
SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件 其中,application.properties文件是键值对类型的文件,之前一直在使用,所以此处不在对properties文件的格式
进行阐述。除了properties文件外,SpringBoot还可以使用yml文件进行配置,下面对yml文件进行讲解。
4.1.2 application.yml配置文件
4.1.2.1 yml配置文件简介
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数
据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导
入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简
洁。
YML文件的扩展名可以使用.yml或者.yaml。
4.1.2.2 yml配置文件的语法
4.1.2.2.1 配置普通数据
语法: key: value示例代码: name: haohao 注意:value之前有一个空格
4.1.2.2.2 配置对象数据语法:key: key1: value1 key2: value2 或者: key: {key1: value1,key2: value2} 示例代码:
person: name: haohao age: 31 addr: beijing #或者 person: {name: haohao,age: 31,addr: beijing} 注意:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别
4.1.2.2.3 配置数组(List、Set)数据语法:key: value1value2 或者: key: [value1,value2] 示例代码:
因公司需要,出现一个接口通过网络请求调用另外一个接口的情况,该接口恰好是导入excel文件,第一个接口负责把文件转发到第二个接口,所以第一个接口就需要把动态构建MultipartFile表单,才能调成功第二个处理业务的接口。各种百度,各种不不好使,最终,终于在各路大神的指导下完成了。
踩了一天的坑,总结出来如下代码
/** * * @return */ @PostMapping(value = "/import") public Result importSolr(@RequestParam(name = "file") MultipartFile file){ Result result = null; try { String originalFilename = file.getOriginalFilename(); if (!ExcelUtils.isExcel(originalFilename)){ return Result.buildErrorMsg("请导入Excel文件","0010010002"); } MultipartEntityBuilder fileBuilder = MultipartEntityBuilder.create(); fileBuilder.setMode(HttpMultipartMode.RFC6532); fileBuilder.addBinaryBody("file",file.getInputStream(), ContentType.create("multipart/form-data"),file.getOriginalFilename()); HttpEntity build = fileBuilder.build(); HttpPost request = new HttpPost(WebConfig.HOST_KNOWLEDGE + WebConfig.HOST_KNOWLEDGE_SOLRIMPORT); request.setEntity(build); HttpClient httpClient = HttpClients.createDefault(); HttpResponse httpResponse = httpClient.execute(request); result = HttpUtils.buildHttpResponse(httpResponse); } catch (IOException e) { e.printStackTrace(); result = Result.
结构体、结构指针作为函数参数 结构体、结构体指针作为函数的参数现在应用的非常广泛,但一些细微之处还需要引起注意。本文将讨论其作为形参和实参的区别。
结构体作为参数 将结构体作为函数的参数,目的是通过makeinfo()函数调用去改变person结构体中letters的值。
情形1:
#include<stdio.h>
#include<string.h>
struct namect{
char fname[20];
char lname[20];
int letters; }; struct namect getinfo(void);
struct namect makeinfo(struct namect);
void showinfo(struct namect);
int main(void)
{
struct namect person;
person=getinfo();
person=makeinfo(person);
//makeinfo(person);
showinfo(person);
return 0;
}
struct namect getinfo(void)
{
struct namect temp;
printf("please enter you first name.\n");
gets(temp.fname);
printf("please enter you last name.\n");
gets(temp.lname);
return temp; }
struct namect makeinfo(struct namect info)
{
info.letters=strlen(info.fname)+strlen(info.lname);
return info;
1.二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。(即中序遍历情况下,值依次增大)
# 二叉搜索树
# 中序遍历情况下,值递增则为二叉树
def isBSTree(head):
minimum = -100000 # 设定一个最小值
if head is None:
return False
prenum = minimum
stack = []
while head or len(stack) > 0:
if head:
stack.append(head)
head = head.left
else:
head = stack.pop()
if head.val < prenum: # 保证中序遍历情况下值递增
return False
else:
prenum = head.val
head = head.right
return True
2.完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。)
# 判断一棵树是否为完全二叉树
# 左无、右有 ==> 返回 False
201-206都表示服务器成功处理了请求的状态代码,说明网页可以正常访问。
200(成功) 服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
201(已创建) 请求成功且服务器已创建了新的资源。 202(已接受) 服务器已接受了请求,但尚未对其进行处理。 203(非授权信息) 服务器已成功处理了请求,但返回了可能来自另一来源的信息。 204(无内容) 服务器成功处理了请求,但未返回任何内容。 205(重置内容) 服务器成功处理了请求,但未返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如清除表单内容以输入新内容)。 206(部分内容) 服务器成功处理了部分 GET 请求。
300-3007表示的意思是:要完成请求,您需要进一步进行操作。通常,这些状态代码是永远重定向的。
300(多种选择) 服务器根据请求可执行多种操作。服务器可根据请求者 来选择一项操作,或提供操作列表供其选择。 301(永久移动) 请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。您应使用此代码通知搜索引擎蜘蛛网页或网站已被永久移动到新位置。 302(临时移动) 服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。会自动将请求者转到不同的位置。但由于搜索引擎会继续抓取原有位置并将其编入索引,因此您不应使用此代码来告诉搜索引擎页面或网站已被移动。 303(查看其他位置) 当请求者应对不同的位置进行单独的 GET 请求以检索响应时,服务器会返回此代码。对于除 HEAD 请求之外的所有请求,服务器会自动转到其他位置。 304(未修改) 自从上次请求后,请求的网页未被修改过。服务器返回此响应时,不会返回网页内容。
如果网页自请求者上次请求后再也没有更改过,您应当将服务器配置为返回此响应。由于服务器可以告诉 搜索引擎自从上次抓取后网页没有更改过,因此可节省带宽和开销。 305(使用代理) 请求者只能使用代理访问请求的网页。如果服务器返回此响应,那么,服务器还会指明请求者应当使用的代理。 307(临时重定向) 服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。会自动将请求者转到不同的位置。但由于搜索引擎会继续抓取原有位置并将其编入索引,因此您不应使用此代码来告诉搜索引擎某个页面或网站已被移动。
4XXHTTP状态码表示请求可能出错,会妨碍服务器的处理。
400(错误请求) 服务器不理解请求的语法。 401(身份验证错误) 此页要求授权。您可能不希望将此网页纳入索引。 403(禁止) 服务器拒绝请求。
404(未找到) 服务器找不到请求的网页。例如,对于服务器上不存在的网页经常会返回此代码。
例如:http://www.0631abc.com/20100aaaa,就会进入404错误页面
405(方法禁用) 禁用请求中指定的方法。
406(不接受) 无法使用请求的内容特性响应请求的网页。 407(需要代理授权) 此状态码与 401 类似,但指定请求者必须授权使用代理。如果服务器返回此响应,还表示请求者应当使用代理。 408(请求超时) 服务器等候请求时发生超时。 409(冲突) 服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码,以及两个请求的差异列表。 410(已删除) 请求的资源永久删除后,服务器返回此响应。该代码与 404(未找到)代码相似,但在资源以前存在而现在不存在的情况下,有时会用来替代 404 代码。如果资源已永久删除,您应当使用 301 指定资源的新位置。 411(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 412(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 413(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 414(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 415(不支持的媒体类型) 请求的格式不受请求页面的支持。 416(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态码。 417(未满足期望值) 服务器未满足"
文章目录 vs2015+VisualGBD+ssh实现在win10上远程调试运行linux程序安装VisualGBD设置ssh创建项目注意点1注意点2注意3 vs2015+VisualGBD+ssh实现在win10上远程调试运行linux程序 在开发树莓派的程序时,由于树莓派资源有限,在树莓派上安装一些比较好用的IDE比较困难,或者使用起来比较卡顿。为了方便,我们使用vs2015+VisualGBD+ssh实现在win10上远程调试运行linx程序,就像开发单片机一样,将程序“烧”到开发板里。相当于win10上写好的程序,运行却在开发板的linux系统上。
安装VisualGBD 参考 https://blog.csdn.net/RichardWQJ/article/details/79872178
VisualGDB5.3链接:https://pan.baidu.com/s/1dvc8dovVioc2HWbZuqkTzA 密码:3etx
下载完之后点击安装VisualGDB-5.3-preview6.msi,安装完之后记得点击PatchVisualGDB.exe。PatchVisualGDB.exe是破解软件。
这个软件很好安装,没有什么复杂的。
安装完成以后打开vs的新建项目,可以看到如下图:
设置ssh win10与linux的通信是靠ssh完成的,不像单片机直接连一根usb数据线就行。毕竟这是两个操作系统之间的通信。
win10这边不用进行配置,主要是linx端进行配置。按照如下命令行进行配置:
sudo ps -e |grep ssh #检测是否已经安装ssh服务 如果有输出ssh或者shhd的字样,说明已经安装了ssh服务,否则使用下面的命令进行安装
sudo apt-get update # 更新 sudo apt -y install openssh-server # 安装SSH 之后,打开文件 /etc/ssh/sshd_config文件进行修改
在行"#PermitRootLogin prohibit-password"后
添加行
“PermitRootLogin yes”
并保存。
这里可能会遇到问题,修改以后不能保存文件,提示权限不够。按照如下方法进行操作
cd /etc/ssh #打开文件所在目录 sudo chmod 777 * #将该目录下的所有文件修改为完全开放的属性 # 修改文件并保存 sudo chmod 400 * #再将文件的权限修改成只有user可以查看 # 注意:每次执行完sudo chmod 以后可能出现没有效果的现象,重启一下系统就好了,但是重启完以后一定要重新执行 cd /etc/ssh 如果不想使用命令行的方法,也可以右键单击sshd_config文件修改其权限,但是最后一定要把权限改回来。因为ssh是加密的传输,如果文件权限完全开放,任何用户都可以访问,ssh是无法正常工作的。
关于了解修改文件权限的相关知识,可以参考
https://blog.csdn.net/slwhy/article/details/78876237
之后执行下面的命令:
sudo update-rc.
android studio引入第三方包的时候有时候会发生奇奇怪怪的报错,很多问题都能看build日志解决,但是遇到merger failed错误就有点抓瞎了,很多人说是资源错误,说是manifest配置不一致,说是sdk版本问题,这种情况其实可以找到正确的日志的,在as的build窗口上点击build failed图标,再点击左侧第二个图标,就会跳到详细的错误信息页面,根据错误信息我们就能很轻松的找到导致错误的原因,根据原因再作修改就很轻松了
使用msi文件安装mysql数据库,安装过程很顺利,重启电脑是却发现报错了。。。
解决办法:
找到%AppData%\Roaming\Oracle\MySQL Notifier文件,也有可能是%AppData%\Oracle\MySQL Notifier文件。
删除settings.config文件,重启电脑即可。
在Visual Studio里,通过安装Npgsql来连接PostgreSQL数据库。值得注意的是,并不是一次安装后在任何工程里都可以使用。而是需要首先打开需要使用的解决方案,之后再按照以下方法进行安装。在Visual Studio中的程序包管理器控制台的提示符之后输入以下安装命令:Install-Package Npgsql。
.NET Framework : 4.7.2 IDE : Visual Studio Community 2019 OS : Windows 10 x64 typesetting : Markdown blog : xinshaopu.blog.csdn.net code using System; namespace ConsoleApp { class Program { static void Main(string[] args) { string str = "1 i am a student 1"; // 只会删除字符串首字母前面的空格与尾字母后面的空格 Console.WriteLine(str.Trim()); // 在str字符串前加入空格,使得字符串达到指定长度 Console.WriteLine(str.PadLeft(25)); // 在str字符串前加入a,使得字符串达到指定长度 Console.WriteLine(str.PadLeft(25, 'a')); Console.WriteLine(str.PadRight(25, 'a')); Console.ReadKey(); } } } result 1 i am a student 1 1 i am a student 1 aaaaa1 i am a student 1 1 i am a student 1aaaaa resource [文档] docs.
本节介绍一款前端H5可视化布局器 MagicalCoder 由js+css+html编写而成
软件官方在线使用地址:http://lowcode.magicalcoder.com/layui
在线使用:免费
优点在于 功能强大,可以自由嵌入各种web项目,有html+css+js编写而成,可以基于各种设备响应式设计布局
软件基本截图主界面 (图片拉扯了好难看)
各种下拉编辑
随时可以把各种源码拷贝进来 就能继续布局
样式工具箱
灵活切换各种视图模式,各个组件清晰可见
左侧有好的组件可以使用
等等就不一一截图了
还有结构树协助操作,不会担心跑丢了
希望用哪个UI自己切换,未来会加入更多UI
还是来自己体验一把吧
http://lowcode.magicalcoder.com/layui
centos7.5 没有ico图标,日志中报错
问题:
[root@lb01 conf.d]# tail -f /var/log/nginx/access.log 10.0.0.1 - - [06/May/2019:20:21:46 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "http://web.lvhanzhi.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36" "-" 原因:没有ico图标,所以在日志中报错404
解决方法:
方法一:项目里面放入ico图标
方法二:直接返回200,不去文件中查找
[root@lb01 conf.d]# vim web.lvhanzhi.com.conf server{ listen 80; server_name web.lvhanzhi.com; location / { proxy_pass http://10.0.0.7:80; proxy_set_header Host $http_host; proxy_http_version 1.1; } location /favicon.ico{ return 200; access_log off; } } 转载于:https://www.cnblogs.com/lvhanzhi/p/10821900.html
本文转载于博客:https://blog.csdn.net/qq_20259459 和 作者邮箱( jinweizhi93@gmai.com )。
有关调参该作者也给出了详细的介绍(https://blog.csdn.net/qq_20259459/article/details/70316511)
前期工作:下载安装matlab和下载MatConvNet以及下载GPU相关文件和配置GPU。
具体请参见我之前的文章:
1. 深度学习 2. MatConvNet(CNN)的配置和相关实验结果,CNN学习使用 :
http://blog.csdn.net/qq_20259459/article/details/54092277
2. 深度学习 3. MatConvNet (CNN)的介绍和下载以及CPU和GPU的安装配置,Matlab2016 :
http://blog.csdn.net/qq_20259459/article/details/54093550
准备工作:
1. 打开Matlab,配置相关文件的路径(http://blog.csdn.net/qq_20259459/article/details/54092277)
2. 输入 mex -setup cpp
3. 输入 vl_compilenn
4. 输入 compileGPU
没有报错则配置完成。
开始,新建编辑页 cnn_cifar_my :
这是外层调参和构建imdb结构体的code。
关于调参我会在后面单取一篇来介绍。
函数相互调用顺序:主函数 function [net, info] = cnn_cifar_my(varargin) :
一、. 首先初始化网络:
opts.batchNormalization = false ; %选择batchNormalization的真假 opts.network = [] ; %初始化一个网络 opts.networkType = 'simplenn' ; %选择网络结构 %%% simplenn %%% dagnn [opts, varargin] = vl_argparse(opts, varargin) ; %调用vl_argparse函数 sfx = opts.
参考文章地址:https://www.cnblogs.com/skyfsm/p/8451834.html
1、LeNet 定义了CNN的最基本的架构:卷积层、池化层、全连接层。
2、AlexNet 特点:
更深的网络数据增广技巧来增加模型泛化能力。用ReLU代替Sigmoid来加快SGD的收敛速度引入drop out防止过拟合Local Responce Normalization:局部响应归一层 3、VGG-16 特点:
进一步加深;卷积层都是same的卷积,下采样完全是由max pooling来实现;卷积层使用更小的filter尺寸和间隔,使用1×1和3×3的小卷积核;3×3卷积核的优点:
(1)多个3×3的卷基层比一个大尺寸filter卷基层有更多的非线性,使得判决函数更加具有判决性
(2)多个3×3的卷积层比一个大尺寸的filter有更少的参数,假设卷基层的输入和输出的特征图大小相同为C,那么三个3×3的卷积层参数个数3×(3×3×C×C)=27CC;一个7×7的卷积层参数为49CC;所以可以把三个3×3的filter看成是一个7×7filter的分解(中间层有非线性的分解)1*1卷积核的优点:
作用是在不影响输入输出维数的情况下,对输入进行线性形变,然后通过Relu进行非线性处理,增加网络的非线性表达能力。 4、GoogLeNet 特点:
(1)引入Inception结构(如下图),增加深度也增加宽度;
Inception结构里的卷积stride都是1,另外为了保持特征响应图大小一致,都用了零填充。最后每个卷积层后面都立刻接了个ReLU层。在输出前有个叫concatenate的层,直译的意思是“并置”,即把4组不同类型但大小相同的特征响应图一张张并排叠起来,形成新的特征响应图。Inception结构里主要做了两件事:
通过3×3的池化、以及1×1、3×3和5×5这三种不同尺度的卷积核,一共4种方式对输入的特征响应图做了特征提取。为了降低计算量。同时让信息通过更少的连接传递以达到更加稀疏的特性,采用1×1卷积核来实现降维。 (2)中间层的辅助LOSS单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练;
(3)后面的全连接层全部替换为简单的全局平均pooling,减少参数个数;
5、ResNet 特点:
层数非常深,已经超过百层引入残差单元来解决退化问题 对于一般的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。
虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。
退化问题说明了深度网络不能很简单地被很好地优化。也就是说想通过学习优化实现H(x)=x,即通过学习让F(x)操作失效很困难,那么怎么解决退化问题呢?
深度残差网络。
增加一个连接(short cut),让H(x)=x+F(x),即F(x)=H(x)-x,那么现在想解决退化,网络只需要通过学习让F(x)=0即可,而F(x)就是残差,所以网络叫残差网络,拟合残差相对而言是要容易很多的。
考虑到x的维度与F(X)维度可能不匹配情况,需进行维度匹配。这里论文中采用两种方法解决这一问题(其实是三种,但通过实验发现第三种方法会使performance急剧下降,故不采用):
zero_padding:对恒等层进行0填充的方式将维度补充完整。这种方法不会增加额外的参数projection:在恒等层采用1x1的卷积核来增加维度。这种方法会增加额外的参数 6、DenseNet 特点:
1,减轻了消失梯度(梯度消失)
2,加强了特征的传递
3,更有效地利用了特征
4,一定程度上较少了参数数量
DenseNet 是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。下图是 DenseNet 的一个dense block示意图,一个block里面的结构如下,与ResNet中的BottleNeck基本一致:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) ,而一个DenseNet则由多个这种block组成。每个DenseBlock的之间层称为transition layers,由BN−>Conv(1×1)−>averagePooling(2×2)组成
密集连接不会带来冗余吗?不会!密集连接这个词给人的第一感觉就是极大的增加了网络的参数量和计算量。但实际上 DenseNet 比其他网络效率更高,其关键就在于网络每层计算量的减少以及特征的重复利用。DenseNet则是让l层的输入直接影响到之后的所有层,它的输出为:xl=Hl([X0,X1,…,xl−1]),其中[x0,x1,…,xl−1]就是将之前的feature map以通道的维度进行合并。并且由于每一层都包含之前所有层的输出信息,因此其只需要很少的特征图就够了,这也是为什么DneseNet的参数量较其他模型大大减少的原因。这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题
需要明确一点,dense connectivity 仅仅是在一个dense block里的,不同dense block 之间是没有dense connectivity的,比如下图所示。
缺点:内存占用非常大
由于RHEL7不支持gdm于是改用lightdm
首先保证yum源配置成功
本地源没有lightdm包,需用网络源,我配的是centos网络源,但是很奇怪也没有lightdm包,于是安装扩展包,命令:
yum install -y epel-release 安装lightdm和Xfce
[root@gf03 ~]# yum install -y lightdm && yum groupinstall -y xfce 修改lightdm.conf文件(配置文件中有详细的参数说明)
[root@gf03 ~]# vim /etc/lightdm/lightdm.conf ... [XDMCPServer] enabled=true port=177 ... 将Display Manager切换为lightdm
[root@gf03 ~]# systemctl disable gdm && systemctl enable lightdm 启动lightdm
[root@gf03 ~]# systemctl start lightdm 关闭或者取消防火墙(若已关闭则忽略)
[root@gf03 ~]# systemctl stop firewalld.service 只保留/usr/share/xsessions/下xfce.desktop文件
[root@gf03 ~]# cd /usr/share/xsessions/ && ls gnome-classic.desktop gnome-custom-session.desktop gnome.desktop xfce.desktop [root@gf03 xsessions]# mkdir bak && mv gnome* .
举例,自定义redis模糊删除注解
1.自定义注解
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface CacheEvictFuzzy { /** * redis key集合,模糊删除 * @return */ String[] key() default ""; } 2.使用AOP拦截方法,解析注解参数
import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.annotation.Order; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.Set; @Aspect @Order(1) @Component public class CacheCleanFuzzyAspect { Logger logger = LoggerFactory.