具有 1 个隐藏层的 NN:可视化的半平面数

数据挖掘 神经网络
2022-03-09 08:19:21

使用tensorflow 操场我得到下面的结果

  • 圆形样本数据
  • 1个带relu的隐藏层
  • 3个隐藏单元

从 3 个隐藏单元和 relu 生成 3 条分割线。从这些我预计段,其中有限段应该是三角形。但是,右侧的图(下图)显示了一个六边形。(30)+(31)+(32)=7

在此处输入图像描述

然后,我手动提取了 tensorflow 应用程序优化的权重,并在下面的 R 中生成了我自己的图。请注意,由直线(每个隐藏层)生成的 3 个半平面看起来与 Web 应用程序的屏幕截图中的相同。然而,最终输出(下图左上角)是三角形而不是六边形。请参阅下面的代码。

我在这里做错了什么?

在此处输入图像描述

library(tidyverse)
library(gridExtra )
#Weights as taken from the optimal solution in the tensorflow playground
W <- data.frame(
    W11 = c(1.2, 0.31,-1.4),
    W12 = c(1,-1.5,0.56),
    b = c(-0.51,-0.68,-0.51),
    W2 = c(-1.6,-1.7,-1.6 )
)
    
#Grid    
G <- expand.grid(
    x = seq(-6,6,0.05),
    y = seq(-6,6,0.05)
) %>%
mutate(
    Node1 = NA, 
    Node2 = NA, 
    Node3 = NA,         
    output = NA
)

#fill the Grid 
for (i in 1:nrow(G))
{
    for (j in 1:nrow(W))
    {
        G[i,paste0("Node",j)] <- max(G$x[i] * W[j,1] +  G$y[i] * W[j,2] + W[j,3],0)
    }
    G$output[i] <- G$Node1[i] * W$W2[1] + G$Node2[i] * W$W2[2] + G$Node3[i] * W$W2[3]  
}

p1 <- G %>% mutate( Node1 = ifelse( Node1<=0,-1,1)) %>% ggplot(aes(x = x, y = y, color =  Node1) ) + geom_point()
p2 <- G %>% mutate( Node2= ifelse( Node2<=0,-1,1)) %>%     ggplot(aes(x = x, y = y, color =  Node2) ) + geom_point()
p3 <- G %>% mutate( Node3= ifelse( Node3<=0,-1,1)) %>%  ggplot(aes(x = x, y = y, color =  Node3) ) + geom_point()
p4 <- G %>% mutate( output = ifelse( output<0,-1,1)) %>%     ggplot(aes(x = x, y = y, color =  output) ) + geom_point()
grid.arrange(p4, p1, p2,p3, nrow = 2)
1个回答

一个不错的实验!我认为您只是忘记了包含最终神经元的偏差项。

至于原始方法,我认为隐藏层的输出将是具有 7 个区域的分段线性是正确的。但是在最后一个神经元激活后,您可以根据符号将这些区域中的每一个切成两半。为实际输出绘制更多热图可能是值得的。