我正在尝试实现以下框图,该图说明了一些具有偏差和跳过连接的神经网络:
我的平庸尝试是基于https://tikz.net/skip-connection/。
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning, calc, decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}
\node[fill=yellow!50] (l1) {$(I + \alpha \lambda A^{H}A)^{-1}$};
\node[fill=teal!50, right=of l1] (l2) {H};
\node[right=of l2, font=\Large, inner sep=0, ] (add) {$\oplus$};
\node[blue!50!black, right=of add, label={}] (act2) {$x_{k+1}$};
\draw[->] (l1) -- (l2);
\draw[<-] (l1) -- ++(-2,0) node[below, pos=0.8] {$x_k$};
\draw[->] (l2) -- (act2) node[above, pos=0.8] {};
\draw[->] ($(l1)-(1.5,0)$) to[out=90, in=90] node[below=1ex, midway, align=center] {} node[above, midway] {$1 - \alpha$} (add);
\end{tikzpicture}
\end{document}
答案1
好吧,光有提示还不够。让我们仔细看看。
顺便说一句,这只是另一个例子,说明抄袭只是方程式的一部分:另一个更重要的部分是学习。所以我强烈建议阅读、尝试和复习pgfmanual 中的教程多次。这里需要的大部分内容已经显示在那里了。
对于创建此类图表的过程,步骤如下:
-
- 将所有必需的节点与一些初始文本放在一起;忽略标签
-
- 建立联系;让它们不完美,例如暂时不要蜿蜒曲折
-
- 介绍并使用你的风格
-
- 引入
|-
或-|
根据需要;向路径添加更多节点作为标签
- 引入
-
- 审查并应用小的修正;这里我在输入处放了一个替代方案的演示
关于#1
我决定使用绝对坐标,因为这里可以进行相对定位,但这里并不需要。另请参阅矩阵方法在教程中。
事实证明我不需要任何这些库\usetikzlibrary{positioning, calc, decorations.pathreplacing};
,但我把它们留在这里以便在一次编译中比较这两种方法。
#2 的示例
只需专注于连接正确的节点,甚至交叉连接,无需曲折。稍后再处理。因此,从
\draw[->] (in1) -- (l1);
而不是最后(见章节在此链接之前结束关于 |-)
\draw[->] (in1) |- (l1);
与其在这里进行争斗,不如观察整体图表的发展(并记下一些(心理)笔记以供以后改进)。
例如 #2 -> #3
基本绝对定位后这行
\node (l1) at (2,-1) {$H$};
变成
\node[blkg] (l1) at (2,-1) {$H$\\CNN};
因为它的样式blkg
现在包含了所需的所有格式(颜色、多行、宽度),同时保持代码整洁:
blkg/.style={fill=green!30!gray!30,align=center,minimum width=15mm},
#4 的示例
好的,这个图已经相当好了,让我们看看需要的标签。有很多种放置标签的方法。这里我选择在路径中插入一个额外的节点,如下所示:
最初只是一个连接箭头
\draw[->] (in1) -- (add);
现在添加了另一个节点(注意缺少\
),放在上面
\draw[->] (in1) -- node[above] {$1 - \alpha$} (add);
编译后,这对我来说已经足够好了。您可以微调节点沿所述路径以相对单位显示的位置,或者verbally
使用pos
,请参阅“添加文本”:
\draw[->] (l1) -| node[right, near end] {$\alpha$} (add);
\draw[->] (in2) -- node[right,pos=.3] {$\alpha \times \lambda$} (add);
演示#5
如果你不喜欢
\draw[->] (in1) |- (l1);
您还可以在路径中引入一个附加点,并像这样蜿蜒曲折:
\draw[->,red,thick] (in1) -- +(0.6,0) |- (l1.160);
其中奇怪的节点坐标(l1.160)
仅告诉了线的锚点位置(想象极坐标)。
代码
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{positioning, calc, decorations.pathreplacing}
\usetikzlibrary{arrows.meta}% ~~~ only this one needed for "After"
\begin{document}
%After:
\begin{tikzpicture}[% ~~~ 3. define (and use) your styles ~~~~
>=Stealth,% changing the arrow tips
blkg/.style={fill=green!30!gray!30,align=center,minimum width=15mm},
blky/.style={fill=yellow!50,align=center,inner sep=2mm},
add/.style={font=\Large, inner sep=0},
]
% ~~~ 1. blocks ~~~~~~~~~~~~~~~~~~~~~~~~~~~
\node (in1) at (0, 0) {$x_k$};
\node[blkg] (l1) at (2,-1) {$H$\\CNN};
\node[add] (add) at (4, 0) {$\oplus$};
\node (in2) at (4, 2) {$A^{H_b}$};
\node[blky] (l2) at (6.5, 0) {$(I + \alpha \lambda A^{H}A)^{-1}$\\
DC using CG};
\node (out) at (9, 0) {$x_{k+1}$};
% ~~~ 2. connections ~~~~~~~~~~~~~~
% ~~~ 4. add some nodes to the paths for the labels ~~~~~~~~~
\draw[->] (in1) -- node[above] {$1 - \alpha$} (add);
\draw[->] (add) -- (l2);
\draw[->] (l2) -- (out);
\draw[->] (in1) |- (l1);
\draw[->] (l1) -| node[right, near end] {$\alpha$} (add);
\draw[->] (in2) -- node[right,pos=.3] {$\alpha \times \lambda$} (add);
% ~~~ 5. just to demonstrate it ~~~~
\draw[->,red,thick] (in1) -- +(0.6,0) |- (l1.160);
\end{tikzpicture}
%Before:
\begin{tikzpicture}
\node[fill=yellow!50] (l1) {$(I + \alpha \lambda A^{H}A)^{-1}$};
\node[fill=teal!50, right=of l1] (l2) {H};
\node[right=of l2, font=\Large, inner sep=0, ] (add) {$\oplus$};
\node[blue!50!black, right=of add, label={}] (act2) {$x_{k+1}$};
\draw[->] (l1) -- (l2);
\draw[<-] (l1) -- ++(-2,0) node[below, pos=0.8] {$x_k$};
\draw[->] (l2) -- (act2) node[above, pos=0.8] {};
\draw[->] ($(l1)-(1.5,0)$) to[out=90, in=90] node[below=1ex, midway, align=center] {} node[above, midway] {$1 - \alpha$} (add);
\end{tikzpicture}
\end{document}