东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2460|回复: 0
打印 上一主题 下一主题

[学习笔记] 032、改造为二值化神经网络的一般过程

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14429
QQ
跳转到指定楼层
楼主
发表于 2019-12-14 08:35:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
032、改造为二值化神经网络的一般过程


改造为二值化的神经网络:
1、二值化的卷积层BinaryConv2D、全连接层BinaryDense、激活函数层binary_tanh、复写DropOut
2、实际数据的label由01的独热编码变为-1 +1形式(乘2减1即可)
3、分类问题:修改损失函数 带hinge的三个损失函数squared_hinge categorical_hinge hinge都还行  带crossentropy差得远
4、修改学习率的调整策略 需要回调
lr_decay = (lr_end / lr_start) ** (1. / epochs)
cb_lr_scheduler = LearningRateScheduler(lambda epoch: lr_start * lr_decay ** epoch)





  1. # -*- coding: utf-8 -*-
  2. import keras.backend as K
  3. import numpy as np
  4. import tensorflow as tf


  5. def round_through(x):
  6.     '''
  7.     对 x 中的值取整, 同时使得求梯度的得到的值与原始值的梯度一样
  8.     小技巧, 创新思路:来自 [Sergey Ioffe](http://stackoverflow.com/a/36480182)
  9.     '''
  10.     rounded = K.round(x)  # 四舍五入
  11.     # 这是很重要的技巧  因为tf或keras 会自动求梯度 根据前向传播过程  在这里 不能这样
  12.     return x + K.stop_gradient(rounded - x)


  13. def _hard_sigmoid(x):
  14.     '''
  15.     当 x <= -1,    y = 0;
  16.     当 -1 < x < 1, y = 0.5 * x + 0.5;
  17.     当 x > 1;      y = 1;
  18.     '''
  19.     x = (0.5 * x) + 0.5
  20.     return K.clip(x, 0, 1)


  21. def binary_tanh(x):
  22.     '''
  23.     激活函数 就是二值化的过程
  24.     在前向传播(forward propagation)时, 输出如下:
  25.         当 x <=  0.0, y = -1
  26.         当 x >  0.0,  y = 1
  27.    
  28.     在后向传播(backward propagation)求梯度时, 求梯度的规则如下:
  29.         2 * _hard_sigmoid(x) - 1

  30.         当 x <= -1,    y = -1;
  31.         当 -1 < x < 1, y = x;
  32.         当 x > 1;      y = 1;

  33.         当|x| >= 1 时, 梯度为 0
  34.         当|x| < 1 时, 梯度为 1
  35.     '''
  36.     return 2 * round_through(_hard_sigmoid(x)) - 1


  37. def binarize(W, H=1):
  38.     '''
  39.     二值化操作 W为kernel
  40.     将 [-H, H] 之间的值转换为 -H 或者 H
  41.     '''
  42.     Wb = H * binary_tanh(W / H)
  43.     return Wb


  44. if __name__ == '__main__':
  45.     kernel = np.random.normal(size=(3, 3))
  46.     print('kernel:', kernel)
  47.     with tf.Session() as sess:
  48.         print(sess.run(binarize(kernel)))
  49.         print(sess.run(binary_tanh(kernel)))
复制代码


东方老师AI官网:http://www.ai111.vip
有任何问题可联系东方老师微信:dfy_88888
【微信二维码图片】


训练200轮.jpg (50.02 KB, 下载次数: 147)

训练200轮.jpg

训练400轮.jpg (48.48 KB, 下载次数: 147)

训练400轮.jpg
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-20 08:46 , Processed in 0.201098 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表