aihot  2017-12-10 13:17:33  机器学习 |   查看评论   

神经网络的模样

      实际上对于只有一层且只有一个输出的神经网络,如果它的非线性部分还使用sigmoid函数,那么它的形式和逻辑斯特回归(logistic regression)是一样的。所以可以想象神经网络模型从概念上来看比逻辑斯特回归要复杂。那么它的复杂的样子是什么样呢?下面给出一段全连接层的代码,开始做实验:

  1. class FC:
  2.     def __init__(self, in_num, out_num, lr = 0.01):
  3.         self._in_num = in_num
  4.         self._out_num = out_num
  5.         self.w = np.random.randn(out_num, in_num) * 10
  6.         self.b = np.zeros(out_num)
  7.     def _sigmoid(self, in_data):
  8.         return 1 / (1 + np.exp(-in_data))
  9.     def forward(self, in_data):
  10.         return self._sigmoid(np.dot(self.w, in_data) + self.b)

      从代码上看东西并不多嘛,注意到我们会对参数中的w进行随机初始化,有时我们会让老天随机一个神经网络给我们,我们也可以看看随机大帝的旨意。

      为了方便可视化,这里只做输入为2,输出为1的数据。好了,先来看1号选手:

  1. x = np.linspace(-10,10,100)
  2. y = np.linspace(-10,10,100)
  3. X, Y = np.meshgrid(x,y)
  4. X_f = X.flatten()
  5. Y_f = Y.flatten()
  6. data = zip(X_f, Y_f)

  7. fc = FC(2, 1)
  8. Z1 = np.array([fc.forward(d) for d in data])
  9. Z1 = Z1.reshape((100,100))
  10. draw3D(X, Y, Z1)

       定睛一看这其实就是一个标准的Logistic Regression。他的图像如下所示:

 

      经过多次随机测试,基本上它都是这个形状,只不过随着权重随机的数值变化,这个“台阶”对旋转到不同的方向,但归根结底还是一个台阶。

 

 

      这也说明1层神经网络是没有出路的,它本质上还是个线性分类器的实力,那么小伙伴还给它加一层吧:

  1. fc = FC(2, 3)
  2. fc.w = np.array([[0.4, 0.6],[0.3,0.7],[0.2,0.8]])
  3. fc.b = np.array([0.5,0.5,0.5])

  4. fc2 = FC(3, 1)
  5. fc2.w = np.array([0.3, 0.2, 0.1])
  6. fc2.b = np.array([0.5])

  7. Z1 = np.array([fc.forward(d) for d in data])
  8. Z2 = np.array([fc2.forward(d) for d in Z1])
  9. Z2 = Z2.reshape((100,100))

  10. draw3D(X, Y, Z2)

       这次我们暂时不用随机权重,而是自己设置了几个数值,可以看出,参数设置得很用心。两层全都是正数……,那么图像呢?

线性分类器

       看上去比之前的台阶“柔软”了一些,但归根结底还是很像一个台阶……好吧,那我们加点负权重,让我们从两个方面分析输入数据:

  1. fc = FC(2, 3)
  2. fc.w = np.array([[-0.4, 1.6],[-0.3,0.7],[0.2,-0.8]])
  3. fc.b = np.array([-0.5,0.5,0.5])

  4. fc2 = FC(3, 1)
  5. fc2.w = np.array([-3, 2, -1])
  6. fc2.b = np.array([0.5])

  7. Z1 = np.array([fc.forward(d) for d in data])
  8. Z2 = np.array([fc2.forward(d) for d in Z1])
  9. Z2 = Z2.reshape((100,100))

  10. draw3D(X, Y, Z2)

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自神经网络-全连接层(1)

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]