【问题标题】:How to build a neural network with one single hidden layer using keras?如何使用 keras 构建具有单个隐藏层的神经网络?
【发布时间】:2019-12-23 11:28:33
【问题描述】:

我想训练一个简单的 1-hidden layer 网络。 网络应该由三层组成:一个输入层(2 个维度)、一个隐藏层(10 个维度)和一个输出层(1 个维度)。 输入层的激活函数应该是线性的,隐藏层 sigmoid 的激活函数,输出层的激活函数也是线性的(因为我在做回归任务)。

以下是我的代码:

model <- keras_model_sequential() %>%
  layer_dense(units = 10, activation = 'sigmoid', input_shape = 2)

这会导致错误:

 Error in py_call_impl(callable, dots$args, dots$keywords) : 
   ValueError: A target array with shape (625, 1) was passed for an output of shape (None, 10) while using as loss `mean_squared_error`. This loss expects targets to have the same shape as the output. 

问题好像是我的目标标签是一维的,但是网络的输出却是10维以上。

因此,我将模型更改如下:

model <- keras_model_sequential() %>%
  layer_dense(units = 10, activation = 'sigmoid', input_shape = ncol(x_train)) %>%
  layer_dense(units = 1, activation = 'linear')

现在我可以编译网络了。

绘制权重结果如下:

> get_weights(model)
[[1]]
         [,1]       [,2]       [,3]     [,4]       [,5]      [,6]       [,7]      [,8]      [,9]     [,10]
[1,] 1.250297 -2.6194241 -1.5429267 1.025575 -1.9918470 2.1469700 -1.4964410 0.7511418 0.9715033 0.9903362
[2,] 2.805784 -0.2100081 -0.8766818 2.319680  0.6840908 0.3205897 -0.8494857 3.8642540 1.8826129 2.0817966

[[2]]
  [1] -0.020989 -2.063512 -4.764145 -4.091934  1.964735 -5.380935 -4.615426  4.845552 -2.825072 -3.375803

[[3]]
           [,1]
 [1,]  3.338166
 [2,] -2.492730
 [3,] -3.012555
 [4,]  2.306220
 [5,] -2.523774
 [6,]  3.265386
 [7,] -2.959120
 [8,]  4.011787
 [9,]  1.740327
 [10,]  2.033795

[[4]]
[1] -0.2520685

这个输出令人困惑。 根据需要,[[1]] 似乎是与具有 10 个神经元的隐藏层的连接。层 [[2]] 似乎是从隐藏层到输出层的连接,它总结了隐藏神经元的输出。 但是,我不明白这里的 [[3]] 和 [[4]] 是什么? [[4]] 好像代表了最终的输出连接权重,但是[[3]]是什么?

如何构建一个包含 10 个隐藏神经元和一个线性输出神经元的网络?

【问题讨论】:

  • 我再次编辑以正确解决最后一个问题。如果它回答了问题,你可以接受它:)。

标签: r keras


【解决方案1】:

第二个和第四个输出代表密集层的偏差。基本上,密集层首先具有一个正确形状的矩阵,与输入层相乘,然后在激活函数之前添加偏差。您可以将它们想象为向左或向右移动激活函数,例如 tanh。

input %*% matrix_weights + bias

# in your case

input %*% weights[[1]] + weights[[2]]

编辑:没有看到最后一个问题:

如果你不想要偏见,keras har 有一个允许禁用它们的参数。配置密集层时只需使用use_bias=F即可。

没有偏见,你正在构建简单的感知器,所以我个人认为如果你允许它们没有任何害处。如果他们真的无法添加任何信息,网络本身会将它们设为接近 0。如果是这种情况,您可以稍后手动纠正它们或重新训练网络而不会产生偏差。

[[3]] 部分实际上代表了从第一层到第二层的权重。所以第一层的形状为 (,10),然后你需要减少它 (,1),而 10 个特征中的每一个都对最后一个有贡献。 [[3]] 告诉你贡献的权重。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多