Saltar al contenido

Dibujar redes neuronales con tikz

Maximiliano, parte de nuestro equipo, nos hizo el favor de escribir esta reseña porque controla perfectamente el tema.

Solución:

Aquí, tenemos un festival de foreach:

documentclass[border=0.125cm]standalone
usepackagetikz
usetikzlibrarypositioning
begindocument

tikzset%
  every neuron/.style=
    circle,
    draw,
    minimum size=1cm
  ,
  neuron missing/.style=
    draw=none, 
    scale=4,
    text height=0.333cm,
    execute at begin node=colorblack$vdots$
  ,


begintikzpicture[x=1.5cm, y=1.5cm, >=stealth]

foreach m/l [count=y] in 1,2,3,missing,4
  node [every neuron/.try, neuron m/.try] (input-m) at (0,2.5-y) ;

foreach m [count=y] in 1,missing,2
  node [every neuron/.try, neuron m/.try ] (hidden-m) at (2,2-y*1.25) ;

foreach m [count=y] in 1,missing,2
  node [every neuron/.try, neuron m/.try ] (output-m) at (4,1.5-y) ;

foreach l [count=i] in 1,2,3,n
  draw [<-] (input-i) -- ++(-1,0)
    node [above, midway] $I_l$;

foreach l [count=i] in 1,n
  node [above] at (hidden-i.north) $H_l$;

foreach l [count=i] in 1,n
  draw [->] (output-i) -- ++(1,0)
    node [above, midway] $O_l$;

foreach i in 1,...,4
  foreach j in 1,...,2
    draw [->] (input-i) -- (hidden-j);

foreach i in 1,...,2
  foreach j in 1,...,2
    draw [->] (hidden-i) -- (output-j);

foreach l [count=x from 0] in Input, Hidden, Ouput
  node [align=center, above] at (x*2,2) l \ layer;

endtikzpicture

enddocument

Aunque parece imprudente tener n indique el número de nodos en cada capa cuando podrían ser diferentes y la disposición del diagrama sugiere que no lo son.

ingrese la descripción de la imagen aquí

Esta es una solución donde un dot con completamente lleno de círculo negro, cuyo tamaño se puede cambiar a través de minimum size=xx se define como un estilo.

ingrese la descripción de la imagen aquí

Código

documentclass[]article
usepackage[margin=1cm]geometry
usepackagetikz,pgfplots,pgf
usetikzlibrarymatrix,shapes,arrows,positioning
begindocument

beginfigure[htp]
centering
begintikzpicture[
plain/.style=
  draw=none,
  fill=none,
  ,
dot/.style=draw,shape=circle,minimum size=3pt,inner sep=0,fill=black
  ,
net/.style=
  matrix of nodes,
  nodes=
    draw,
    circle,
    inner sep=8.5pt
    ,
  nodes in empty cells,
  column sep=0.6cm,
  row sep=-11pt
  ,
>=latex
]
matrix[net] (mat)
    \
          & ;
foreach ai/mi in 2/I1,4/I2,6/I3,12/In
  draw[<-] (mat-ai-1) -- node[above] mi +(-1cm,0);
foreach ai in 2,4,6,12
foreach aii/mii in 3/H1,11/Hn
  draw[->] (mat-ai-1) -- (mat-aii-2) node[yshift=0.6cm] mii;

foreach ai in 3,11
  draw[->] (mat-ai-2) -- (mat-4-3);
  draw[->] (mat-4-3) -- node[above] O1 +(1cm,0);
foreach ai in 3,11
  draw[->] (mat-ai-2) -- (mat-10-3);
  draw[->] (mat-10-3) -- node[above] On +(1cm,0);
endtikzpicture

captionANN diagram for Speed Sign recognition.
labelfig_m_3
endfigure

enddocument

Encontré este paquete neuralnetwork, hecho por Mark K Cowan, que hace que dibujar redes neuronales sea bastante simple. Por ejemplo:

documentclassstandalone

usepackageneuralnetwork

begindocument
    beginneuralnetwork[height=4]
        newcommandx[2]$x_#2$
        newcommandy[2]$haty_#2$
        newcommandhfirst[2]small $h^(1)_#2$
        newcommandhsecond[2]small $h^(2)_#2$
        inputlayer[count=3, bias=true, title=Input\layer, text=x]
        hiddenlayer[count=4, bias=false, title=Hidden\layer 1, text=hfirst] linklayers
        hiddenlayer[count=3, bias=false, title=Hidden\layer 2, text=hsecond] linklayers
        outputlayer[count=2, title=Output\layer, text=y] linklayers
    endneuralnetwork
enddocument

ingrese la descripción de la imagen aquí

Si te ha resultado de utilidad este post, sería de mucha ayuda si lo compartes con el resto desarrolladores de este modo contrubuyes a difundir este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4.5)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *