【GiantPandaCV导语】本文主要介绍最最最基础的tikz命令和一些绘制CNN时需要的基础的LaTeX知识,希望能在尽可能短的时间内学会并实现使用tikz这个LaTeX工具包来绘制卷积神经网络示意图。

之前看到tikz可以画出这种图,感觉特别专业,所以萌发出了解一下tikz的想法。

1. overleaf平台

在电脑上安装过LaTeX都知道,LaTeX安装包巨大,并且安装速度缓慢,下载和安装的时间需要几乎一下午才能完成。庆幸的是有一个平台可以在线编译文档,那就是overleaf,如今overleaf也推出了中文版本网站:https://cn.overleaf.com/ 以下代码全部是在overleaf平台上编写运行得到的。

最左侧是项目文件列表,中间是代码编辑区,右侧是可视化区,十分方便,只要网络通常,就可以方便地得到结果。并且这个平台提供了好多模板,可以直接使用,太太太太太棒啦。

2. 快速入门tikz

快速熟悉还是要推荐《minimaltikz》这本电子书,可以直接访问http://cremeronline.com/LaTeX/minimaltikz.pdf获取或者在后台回复latex获取。

这本书一共24页,算是尽量压缩了内容了,在这一节中将分析一下其中给的几个例子,用于快速入门:

所有tikz绘制图像的代码都应该在tikzpicture这个环境中使用。

\begin{tikzpicture}
...
\end{tikzpicture}

直角坐标系下:( < a > <a> <a>, < b > <b> <b>)的形式代表二维坐标系中的一个点,单位是cm。

极坐标系下:( < θ > <\theta> <θ>: < r > <r> <r>), θ \theta θ代表极角,单位是度。

\coordinate可以对某个点进行重命名如:

\coordinate (s) at (0,1);

2.1 直线

那最基础的画几条线的实现是通过\draw完成:

    \begin{tikzpicture}\draw[help lines] (0,0) grid(3,3);\coordinate (a) at (0,1);\coordinate (b) at (3,3);\coordinate (c) at (2,0);\draw (a) -- (b) -- (c) --cycle;\end{tikzpicture}

–符号代表两点之间的连线,可以连续链接多段。cycle代表让路径回到起点,生成闭合路径。

\draw还可以添加选项,比如让线变粗、变红、箭头等需求,都很简单。

\begin{tikzpicture}[scale=1]
\draw[help lines] (0,0) grid(5,5);
\draw (0,0) -- (1,2)--(3,0) --(5,5);
\draw [->] (0,0) -- (2,1);
\draw [<-] (2,3) -- (5,0);
\draw [|->] (0.5,3) -- (0,4);
\draw [<->] (0,6) -- (0,0) -- (6,0);
\end{tikzpicture}

\begin{tikzpicture}
\draw[help lines] (0,0) grid(5,5);
\draw[thick] (0.5, 0.5) -- (3,3);
% [ultra thick, thick, thin, very thick]
\draw[line width=0.2cm] (1,0) -- (3,2);
\end{tikzpicture}

\begin{tikzpicture}
\draw[help lines] (0,0) grid(5,5);
\draw[ultra thick, dotted] (0,0) -- (2,3);
\draw[line width=0.2cm, dotted,red] (2,2) -- (4,0);
%[red, blue, green, cyan, magenta, yellow, black, gray, darkgray, lightgray, browbn, lime, olive, orange, pink, purple, teal, violet, white]
\end{tikzpicture}

2.2 曲线

画一些曲线就需要使用circle、rectangle、arc等进行约束。

\begin{tikzpicture}
\draw[help lines] (0,0) grid(5,5);
\draw[blue] (1,1) rectangle(3,3); % 正方形 需要左下角坐标和右上角坐标
\draw[red] (2,2) circle[radius=2]; %圆形 需要圆心坐标和半径
\draw[green] (1,0) arc [radius=1,start angle=180,end angle=360];
\draw[<->, rounded corners, thick, purple] (0,5) -- (0,0) -- (5,0);
\end{tikzpicture}

\begin{tikzpicture}
\draw[help lines] (0,0) grid(6,3);
\draw[blue, thick] (0,0) to[out=90,in=180] (1,1) to[in=270,out=360] (2,2)
to[in=180,out=90] (3,3) to[in=90,out=360] (4,2) to[in=180,out=270] (5,1)
to[in=90, out=0] (6,0);
\end{tikzpicture}

这是练习画弧线的时候想练习的一个例子,结果如下

in代表进入的角度,out代表出来时候的角度,为了方便,笔者画了一个辅助图,对照代码方便理解。

2.3 画函数曲线

\begin{tikzpicture}[xscale=6,yscale=6]
\draw[<->] (0,0.8) -- (0,0) -- (0.8,0);
\draw[green,thick,domain=0:0.5]
plot(\x, {0.025+\x*\x});
\draw[red, thick, domain=0:0.5]
plot(\x, {sqrt(\x)});
\draw[blue, thick, domain=0:0.5]
plot(\x, {abs(\x)});
\end{tikzpicture}

domain限制变量范围,然后可以画图,结果如下:

2.4 填充

\begin{tikzpicture}
\draw[fill=red,ultra thick] (0,0) rectangle(1,1);
\draw[fill=red,ultra thin, red] (2,0) rectangle(3,1);
\draw[fill] (5,0) circle[radius=1];
\draw [fill=orange] (9,0) rectangle (11,1);
\draw [fill=white] (9.25,0.25) rectangle (10,1.5);
\path [fill=gray] (0,-2) rectangle (1.5,-3);
\draw [fill=yellow] (2,-2) rectangle (3.5,-3);
\end{tikzpicture}

通过fill参数控制结果,效果如下:

2.6 添加文字

使用\node

\node [<options>] (<name>) at (<coordinate>) {<text>};

举个例子:

\begin{tikzpicture}[scale=2]
\draw [thick, <->] (0,1) -- (0,0) -- (1,0);
\draw[fill] (1,1) circle [radius=0.025];
\node [below right, red] at (.5,.75) {below right};
\node [above left, green] at (.5,.75) {above left};
\node [below left, purple] at (.5,.75) {below left};
\node [above right, magenta] at (.5,.75) {above right};
\end{tikzpicture}

其实CNN画图主要用的是画一条线的功能,下面来看如何画CNN。

3. 绘制一个CNN模块

对于一个初学者来说,https://github.com/HarisIqbal88/PlotNeuralNet 这个库虽然画的很好,但是难度曲线太高了,退而求其次,使用https://github.com/pprp/SimpleCVReproduction/tree/master/tikz_cnn 进行解析。

首先介绍一个LaTeX中用于封装的命令,\newcommand,当我们不希望写很长的命令,那就需要类似函数的一个方式,封装好固定的操作,根据传入参数完成执行。

\newcommand<命令>[<参数个数>][<首参数默认值>]{<具体的定义>}

举一个例子:

\newcommand\loves[2]{#1 喜欢 #2}
\loves{我}{你}

输出结果就是:我喜欢你

\newcommand{\networkLayer}[9]{% Define the macro.% 1st argument: Height and width of the layer rectangle slice.% 2nd argument: Depth of the layer slice% 3rd argument: X Offset --> use it to offset layers from previously drawn layers.% 4th argument: Y Offset --> Use it when an output needs to be fed to multiple layers that are on the same X offset.% 5th argument: Z Offset --> Use to offset layers from previous % 6th argument: Options for filldraw.% 7th argument: Text to be placed below this layer.% 8th argument: Name of coordinates. When name = "start" this resets the offset counter% 9th argument: list of nodes to connect to (previous layers)% 全局变量\xdef\totalOffset{\totalOffset}\ifthenelse{\equal{#8} {start}}{\FPset{totalOffset}{0}}{}\FPeval\currentOffset{0+(totalOffset)+(#3)}\def\hw{#1} % Used to distinguish input resolution for current layer.\def\b{0.02}\def\c{#2} % Width of the cube to distinguish number of input channels for current layer.\def\x{\currentOffset} % X offset for current layer.\def\y{#4} % Y offset for current layer.\def\z{#5} % Z offset for current layer.\def\inText{#7}% Define references to points on the cube surfaces\coordinate (#8_front) at  (\x+\c  , \z      , \y);\coordinate (#8_back) at   (\x     , \z      , \y);\coordinate (#8_top) at    (\x+\c/2, \z+\hw/2, \y);\coordinate (#8_bottom) at (\x+\c/2, \z-\hw/2, \y);% Define cube coords\coordinate (blr) at (\c+\x,  -\hw/2+\z,  -\hw/2+\y); %back lower right\coordinate (bur) at (\c+\x,   \hw/2+\z,  -\hw/2+\y); %back upper right\coordinate (bul) at (0 +\x,   \hw/2+\z,  -\hw/2+\y); %back upper left\coordinate (fll) at (0 +\x,  -\hw/2+\z,   \hw/2+\y); %front lower left\coordinate (flr) at (\c+\x,  -\hw/2+\z,   \hw/2+\y); %front lower right\coordinate (fur) at (\c+\x,   \hw/2+\z,   \hw/2+\y); %front upper right\coordinate (ful) at (0 +\x,   \hw/2+\z,   \hw/2+\y); %front upper left% Draw connections from other points to the back of this node\ifthenelse{\equal{#9} {}}{} % 为空什么都不做{ % 非空 开始画层与层之间的连线\foreach \val in #9% \val = start_front\draw[line width=0.3mm] (\val)--(#8_back);}% Draw the layer body.% back plane\draw[line width=0.3mm](blr) -- (bur) -- (bul);% front plane\draw[line width=0.3mm](fll) -- (flr) node[midway,below] {\inText} -- (fur) -- (ful) -- (fll);\draw[line width=0.3mm](blr) -- (flr);\draw[line width=0.3mm](bur) -- (fur);\draw[line width=0.3mm](bul) -- (ful);% Recolor visible surfaces% front plane\filldraw[#6] ($(fll)+(\b,\b,0)$) -- ($(flr)+(-\b,\b,0)$) -- ($(fur)+(-\b,-\b,0)$) -- ($(ful)+(\b,-\b,0)$) -- ($(fll)+(\b,\b,0)$);\filldraw[#6] ($(ful)+(\b,0,-\b)$) -- ($(fur)+(-\b,0,-\b)$) -- ($(bur)+(-\b,0,\b)$) -- ($(bul)+(\b,0,\b)$);% Colored slice.\ifthenelse {\equal{#6} {}}{} % Do not draw colored slice if #6 is blank.% Else, draw a colored slice.{\filldraw[#6] ($(flr)+(0,\b,-\b)$) -- ($(blr)+(0,\b,\b)$) -- ($(bur)+(0,-\b,\b)$) -- ($(fur)+(0,-\b,-\b)$);}\FPeval\totalOffset{0+(currentOffset)+\c}\draw[ultra thick, red] (#8_back) circle[radius=0.02];\node[left] at (#8_back) {back};\draw[ultra thick, red] (#8_top) circle[radius=0.02];\node[above] at (#8_top) {top};\draw[ultra thick, red] (#8_bottom) circle[radius=0.02];\node[below] at (#8_bottom) {bottom};\draw[ultra thick, red] (#8_front) circle[radius=0.02];\node[left] at (#8_front) {front};
}

假设以下命令调用,结果会是什么?

\begin{tikzpicture}[scale=2]
\draw[help lines] (0,0) grid(2,2);
\draw[->,thick] (0,0,0) -- (0,0,2);
\draw[->,thick] (0,0,0) -- (0,2,0);
\draw[->,thick] (0,0,0) -- (2,0,0);
\draw[->,thick] (0,0,0) -- (2,2,0);
\draw[->,thick] (0,0,0) -- (1,2,0);
\draw[->,thick] (0,0,0) -- (0,2,2);
\draw[->,thick] (0,0,0) -- (2,0,2);
\draw[dotted,thick] (0,0,2) -- (0,2,2);
\draw[dotted,thick] (0,2,0) -- (0,2,2);
\draw[dotted,thick] (0,0,2) -- (2,0,2);
\draw[dotted,thick] (2,0,0) -- (2,0,2);
\draw[dotted,thick] (1,0,0) -- (1,0,2);
\draw[dotted,thick] (0,0,1) -- (2,0,1);
\draw[<->, thick] (0,2) -- (0,0) -- (2,0);%HW -D -  x- y- z - fill color -  text - 坐标 - 链接
\networkLayer{1}{0.5}{0}{0}{0}{color=green!20}{conv1}{}{}
\end{tikzpicture}

显示结果如下:

卷积神经网络的示意图实际上是一个个立方体构成的,立方体之间可能会有额外连线,代表特征融合;还可能需要题注,为这个特征图立方体进行命名;必须要有立方体的位置信息,长宽高;还需要颜色填充的功能;

综合以上需求,这个函数提供了9个参数分别是:

  • #1 H&W 控制立方体右侧这一面的高度,默认为正方形。
  • #2 Depth 控制深度
  • #3 X 方向上的偏置
  • #4 Y方向上的偏置
  • #5 Z方向上的偏置
  • #6 填充的颜色
  • #7 Text展示的文本,放在最下侧
  • #8 坐标名称,通过命名便于#9访问
  • #9 通过名称指定连接位置,用于连接前方层的时候使用

由于每绘制一个立方体,右侧立方体的X偏置就应该加上左侧立方体的Depth值,这部分代码这样处理的。

\FPset{totalOffset}{0} % 设置全局变量totaloffset
\xdef\totalOffset{\totalOffset}
\ifthenelse{\equal{#8} {start}}
% 如果#8坐标名称为start,那么将totaloffset归零
{\FPset{totalOffset}{0}}
{}% 否则什么都不做
\FPeval\currentOffset{0+(totalOffset)+(#3)}
% 计算当前offset也就是#3 X+totalOffset

赋值过程:

\def\hw{#1} % Used to distinguish input resolution for current layer.
\def\b{0.02}
\def\c{#2} % Width of the cube to distinguish number of input channels for current layer.
\def\x{\currentOffset} % X offset for current layer.
\def\y{#4} % Y offset for current layer.
\def\z{#5} % Z offset for current layer.
\def\inText{#7}

计算立方体表面坐标(将点可视化是额外添加的,为了便于理解)

% Define references to points on the cube surfaces
\coordinate (#8_front) at  (\x+\c  , \z      , \y);
\coordinate (#8_back) at   (\x     , \z      , \y);
\coordinate (#8_top) at    (\x+\c/2, \z+\hw/2, \y);
\coordinate (#8_bottom) at (\x+\c/2, \z-\hw/2, \y);

计算7个顶点位置,被挡住的也可以计算,但是因为这里不打算绘制所以不计算。

% Define cube coords
\coordinate (blr) at (\c+\x,  -\hw/2+\z,  -\hw/2+\y); %back lower right
\coordinate (bur) at (\c+\x,   \hw/2+\z,  -\hw/2+\y); %back upper right
\coordinate (bul) at (0 +\x,   \hw/2+\z,  -\hw/2+\y); %back upper left
\coordinate (fll) at (0 +\x,  -\hw/2+\z,   \hw/2+\y); %front lower left
\coordinate (flr) at (\c+\x,  -\hw/2+\z,   \hw/2+\y); %front lower right
\coordinate (fur) at (\c+\x,   \hw/2+\z,   \hw/2+\y); %front upper right
\coordinate (ful) at (0 +\x,   \hw/2+\z,   \hw/2+\y); %front upper left

绘制立方块之间的连线:

% Draw connections from other points to the back of this node
\ifthenelse{\equal{#9} {}}
{} % 为空什么都不做
{ % 非空 开始画层与层之间的连线
\foreach \val in #9
% \val = start_front
\draw[line width=0.3mm] (\val)--(#8_back);
}

绘制立方体主体部分,也就是将7个点连接起来。

% back plane
\draw[line width=0.3mm](blr) -- (bur) -- (bul);
% front plane
\draw[line width=0.3mm](fll) -- (flr) node[midway,below] {\inText} -- (fur) -- (ful) -- (fll);
\draw[line width=0.3mm](blr) -- (flr);
\draw[line width=0.3mm](bur) -- (fur);
\draw[line width=0.3mm](bul) -- (ful);

填充颜色:

% front plane
\filldraw[#6] ($(fll)+(\b,\b,0)$) -- ($(flr)+(-\b,\b,0)$) -- ($(fur)+(-\b,-\b,0)$) -- ($(ful)+(\b,-\b,0)$) -- ($(fll)+(\b,\b,0)$);
\filldraw[#6] ($(ful)+(\b,0,-\b)$) -- ($(fur)+(-\b,0,-\b)$) -- ($(bur)+(-\b,0,\b)$) -- ($(bul)+(\b,0,\b)$);% Colored slice.
\ifthenelse {\equal{#6} {}}
{} % Do not draw colored slice if #6 is blank.
% Else, draw a colored slice.
{\filldraw[#6] ($(flr)+(0,\b,-\b)$) -- ($(blr)+(0,\b,\b)$) -- ($(bur)+(0,-\b,\b)$) -- ($(fur)+(0,-\b,-\b)$);}

上边的图是通过以下代码生成的:

\begin{tikzpicture}% INPUT
\networkLayer{3.0}{0.03}{0.0}{0.0}{0.0}{color=gray!80}{}{start}{}% ENCODER
\networkLayer{3.0}{0.1}{0.5}{0.0}{0.0}{color=white}{conv}{}{}    % S1
\networkLayer{3.0}{0.1}{0.1}{0.0}{0.0}{color=white}{}{}{}        % S2
\networkLayer{2.5}{0.2}{0.1}{0.0}{0.0}{color=white}{conv}{}{}    % S1
\networkLayer{2.5}{0.2}{0.1}{0.0}{0.0}{color=white}{}{}{}        % S2
\networkLayer{2.0}{0.4}{0.1}{0.0}{0.0}{color=white}{conv}{}{}    % S1
\networkLayer{2.0}{0.4}{0.1}{0.0}{0.0}{color=white}{}{}{}        % S2
\networkLayer{1.5}{0.8}{0.1}{0.0}{0.0}{color=white}{conv}{}{}    % S1
\networkLayer{1.5}{0.8}{0.1}{0.0}{0.0}{color=white}{}{}{}        % S2
\networkLayer{1.0}{1.5}{0.1}{0.0}{0.0}{color=white}{conv}{}{}    % S1
\networkLayer{1.0}{1.5}{0.1}{0.0}{0.0}{color=white}{}{mid}{}        % S2\networkLayer{1.0}{0.5}{1.5}{0.0}{-1.5}{color=green!50}{}{bot}{{mid_front}}
\networkLayer{1.0}{0.5}{-0.5}{0.0}{1.5}{color=green!50}{}{top}{{mid_front}}
\networkLayer{1.0}{0.5}{1.5}{0.0}{0.0}{color=blue!50}{sum}{}{{bot_front,top_front}}% DECODER
\networkLayer{1.0}{1.5}{0.1}{0.0}{0.0}{color=white}{deconv}{}{} % S1
\networkLayer{1.0}{1.5}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S2
\networkLayer{1.5}{0.8}{0.1}{0.0}{0.0}{color=white}{deconv}{}{} % S1
\networkLayer{1.5}{0.8}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S2
\networkLayer{2.0}{0.4}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S1
\networkLayer{2.0}{0.4}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S2
\networkLayer{2.5}{0.2}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S1
\networkLayer{2.5}{0.2}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S2
\networkLayer{3.0}{0.1}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S1
\networkLayer{3.0}{0.1}{0.1}{0.0}{0.0}{color=white}{}{}{}       % S2% OUTPUT
\networkLayer{3.0}{0.05}{0.9}{0.0}{0.0}{color=red!40}{}{}{}     % Pixelwise segmentation with classes.\end{tikzpicture}

需要注意的是#8和#9命令,mid_front代表的是链接#8=mid的front部分,front也可以被top、back、bottom取代。

4. 资源推荐

https://cn.overleaf.com/project/5e8c38c31cccb20001a4998d

https://cn.overleaf.com/project/5f50b21ae802b6000155ec4f

https://github.com/HarisIqbal88/PlotNeuralNet

https://github.com/pprp/SimpleCVReproduction/tree/master/tikz_cnn

快速入门使用tikz绘制深度学习网络图相关推荐

  1. 使用PlotNeuralNet绘制深度学习网络图

    PlotNeuralNet源代码链接:https://github.com/HarisIqbal88/PlotNeuralNet 网上找了很多画深度学习网络图的方法,发现这个PlotNeuralNet ...

  2. 基于深度学习模型的花卉图像分类代码_华为不止有鸿蒙!教你快速入门华为免编程深度学习神器ModelArts...

    引言: 本文介绍利用华为ModelArts进行深度学习的图像分类任务,不用一行代码. 今年8月9日,在华为史上规模最大的开发者大会上,华为正式发布全球首个基于微内核的全场景分布式OS--鸿蒙操作系统( ...

  3. 【必须收藏】那些酷炫的深度学习网络图怎么画出来的?

    本文我们聊聊如何才能画出炫酷高大上的神经网络图,下面是常用的几种工具. 作者&编辑 | 言有三 1 NN-SVG 这个工具可以非常方便的画出各种类型的图,是下面这位小哥哥开发的,来自于麻省理工 ...

  4. python3人工智能网盘_《Python3入门人工智能掌握机器学习+深度学习提升实战能力》百度云网盘资源分享下载[MP4/5.77GB]...

    内容简介 本资源为<Python3入门人工智能掌握机器学习+深度学习提升实战能力>百度云网盘资源分享下载,具体看下文目录,格式为MP4/5.77GB.本资源已做压缩包处理,请勿直接在百度网 ...

  5. ppt画深度学习网络图

    最近开始写论文,像这样酷炫的深度学习网络图是咋画的?看了网上的一些方案,基本都是比较小众的软件,学起来比较麻烦,最后发现还是ppt好使. 1.插入正方体形状 2.调整成方片 拉动黄色点和角点,多试试, ...

  6. 杂谈 | 那些酷炫的深度学习网络图怎么画出来的?

    杂谈 | 那些酷炫的深度学习网络图怎么画出来的? leiphone.com2019-04-02 雷锋网 AI 科技评论按,本文作者言有三,个人公众号"有三AI",原文地址:http ...

  7. ppt画深度学习网络图-立体网络模块

    参考文章:ppt画深度学习网络图-a better world 一.制作立方体 1.[插入]➡[形状]➡正方体 2.调整黄色与白色的点得到想要的长宽高

  8. 深度学习入门(一)——深度学习是什么?

    深度学习入门(一)--深度学习是什么? 看了标题,你心中或许已经有了疑惑.什么是深度学习?这和人工智能有什么关系吗?神经网络不是生物学知识吗?什么是全连接神经网络?如果你对本次技术分享内容足够感兴趣且 ...

  9. 综述 | 万字长文带你入门近几年深度学习的重要研究成果

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :机器之心 [人工智能资源( ...

最新文章

  1. 利用统计滤波方法去除空中漂浮物 以及去噪
  2. 软件工程概论冲刺 第6天
  3. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1
  4. 如何在visio2010的框图中插入公式?
  5. MySQL5.7 版本的安装、配置
  6. Halcon例程(基于GMM模型的分类)详解 —— classify_citrus_fruits.hdev
  7. 跨平台的.NET邮件协议MailKit组件解析
  8. vue 日期格式化返回指定个数月份_12、vue中日期格式化转换的函数
  9. collections模块的Counter类
  10. php可以在dw中吗,php新手求助,为什么在DW中设计里能看到运行php程序的结果,但…...
  11. 华为 台积电 高通申请_台积电/高通纷纷力挺华为!全面放下姿态:将不再断供华为芯片产品...
  12. [asp.net]优化ViewState
  13. linux 搜狗输入法变繁体字,搜狗输入法变成繁体字怎么办
  14. 运用PS扭曲滤镜 将书法贴在人体上
  15. Arduino提高篇23—OLED电子时钟
  16. python求三角形面积步骤_通过求三角形面积步入python程序世界.pdf
  17. android opencv hu moment,Opencv计算一幅图像的hu矩
  18. [转]web.config保护连接字符串及其它设置信息
  19. GetDC、ReleaseDC、CreateSolidBrush、SelectObjec、DeleteObject、Rectangle、Ellipse在窗体上进行绘图的函数和绘图步骤说明
  20. 由于找不到服务器或出现DNS错误

热门文章

  1. 数据分析学习--新华字典
  2. 澳大利亚发现世界首批杂交鲨鱼
  3. subline_text 删除行快捷键的修改
  4. DRN :A Deep Reinforcement Learning Framework for News Recommendation论文解读
  5. Java实现为手机号码或身份证号码打星号
  6. 基于javaweb+springboot的小区物业管理系统(java+Springboot+ssm+mysql+maven)
  7. 什么是自助式BI工具,有没有推荐
  8. ‘utf-8‘ codec can‘t decode byte 0x8b in position 1: invalid start byte 异常解决
  9. 钢铁行业电商平台架构解决方案
  10. 深度学习-机器学习-联邦学习-可视化等最全python软件整理分享