Tensorflow:BP神经网络权值初始化

2023-11-03

一、Tensorflow入门

1、计算图:

  • 每一个计算都是计算图上的一个结点,而节点之间的边描述了计算之间的依赖关系。
  • 支持通过tf.Graph生成新的计算图,不同计算图上的张量和运算不会共享。
  • Tensorflow会自动生成一个默认的计算图,如果没有特殊指定,运算会自动加入这个计算图中。
import tensorflow as tf

def BP_NeuralNetwork():
    g = tf.Graph()
    with g1.as_default():
        v = tf.get_variable("v", shape=[1], initializer=tf.zeros_initializer)
    with tf.Session(graph=g1) as sess:
        print(sess.run(v)) 

2、张量:张量中保存了三个属性:名字、维度和类型。其中名字,不仅是唯一标识符,还显示了该张量是如何被计算出来的(某个结点/计算的第几个输出);关于类型,需要注意的是,如果不指定,tensorflow会给出默认类型。

3、会话:拥有并管理Tensorflow程序运行时的所有资源。

  • 创建会话
with tf.Session() as sess:
    sess.run()
  • 自动将生成的会话注册为默认会话
sess = tf.InteractiveSession()
print(result.eval())

二、实现的简单BP神经网络

数据来源是Kaggle中的mushroom数据集,是一个有22个特征的二分类问题,这里是将22个特征拆为了117个特征输入。实现的过程比较简单,主要是参考了kaggle中的一个kernal《TensorFlow实战Google深度学习框架》。刚开始使用了6层隐藏层,后来减为1层隐藏层后效果也很不错(测试集正确率100%)。

import tensorflow as tf
import numpy as np
import pandas as pd

def get_wight(shape, lambdal):
    # np.random.randn 标准正态分布 期望为 0 方差为 1
    # random initialization
    var = tf.Variable(tf.random_normal(shape, mean=0, stddev=0.1),dtype=tf.float32)
    # Xavier initialization
    # var = tf.Variable(np.random.randn(shape[0], shape[1]), dtype=tf.float32) / np.sqrt(shape[0])
    # He initialization
    # var = tf.Variable(np.random.randn(shape[0], shape[1]), dtype=tf.float32) / np.sqrt(shape[0] / 2)
    # var = tf.Variable(tf.truncated_normal(shape, stddev=2./np.math.sqrt(shape[0])),dtype=tf.float32)
    tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(lambdal)(var))
    return var

data = pd.read_csv('input/Result.csv')

train = data.iloc[:8000,:]
test = data.iloc[8000:,:]

x = tf.placeholder("float",[None, 117])
y_ = tf.placeholder("float", [None, 2])

#每层节点的个数
laryer_dimension = [117, 128, 2]
n_layers = len(laryer_dimension)

cur_layer = x
in_dimension = laryer_dimension[0]

#生成网络结构
for i in range(1, n_layers):
    out_dimension = laryer_dimension[i]
    weight = get_wight([in_dimension,out_dimension], 0.001)
    bias = tf.Variable(tf.constant(0.1, shape = [out_dimension]))
    if i < n_layers-1:
        cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias)
    else:
        cur_layer = tf.nn.softmax(tf.matmul(cur_layer, weight) + bias)
    in_dimension = laryer_dimension[i]

y = cur_layer

#损失函数
# mse_loss = tf.losses.mean_squared_error(y_, y)
cross_entropy = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y))
tf.add_to_collection('losses', cross_entropy)
loss = tf.add_n(tf.get_collection('losses'))

correct_prediction = tf.equal(tf.argmax(y_,1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

train_op = tf.train.AdamOptimizer(0.003).minimize(loss)
TRAINING_STEPS = 101

fig_loss = np.zeros([TRAINING_STEPS])
fig_accuracy = np.zeros([TRAINING_STEPS])

with tf.Session() as sess:
    saver = tf.train.Saver()
    tf.global_variables_initializer().run()
    for i in range(TRAINING_STEPS):
        train_data = train.sample(1000)
        train_features = train_data.iloc[:,2:].values
        train_target = train_data.iloc[:,0:2].values
        sess.run(train_op, feed_dict={x:train_features,y_:train_target})
        fig_loss[i] = sess.run(loss, feed_dict={x:train_features,y_:train_target})
        fig_accuracy[i] = sess.run(accuracy, feed_dict={x:train_features,y_:train_target})
    test_data = test.sample(122)
    test_features = test_data.iloc[:,2:].values
    test_target = test_data.iloc[:,0:2].values
    test_acc = sess.run(accuracy, feed_dict={x:test_features, y_:test_target})
    print("test_acc: " , test_acc)
    save_path = saver.save(sess, "./model.ckpt")

np.save('output/RNIn_001_loss.npy',fig_loss)
np.save('output/RNIn_001_acc.npy',fig_accuracy)


三、BP神经网络初始化

深度学习中的权值初始化对模型收敛速度和模型质量有重要影响,在隐藏层的连接中,我们通常使用ReLU,相对应的权重初始化有Xavier Initialization和变种He Initialization。

这里我对权值初始化进行了一些测试,首先是随机初始化,效果非常差,其他是基于正态分布做的。

1、使用正态分布初始化,这里我均值都设为0,方差由0.1到1测试时发现,方差越小(不能为0)损失减少越快,正确率提高越快。

var = tf.Variable(tf.random_normal(shape, mean=0, stddev=0.1),dtype=tf.float32)

2、Xavier Initialization

var = tf.Variable(np.random.randn(shape[0], shape[1]), dtype=tf.float32) / np.sqrt(shape[0])

#截断正态分布随机数
var = tf.Variable(tf.truncated_normal(shape, stddev=2./np.math.sqrt(shape[0])),dtype=tf.float32)

3、He Initialization

var = tf.Variable(np.random.randn(shape[0], shape[1]), dtype=tf.float32) / np.sqrt(shape[0] / 2)

四、在使用tensorflow编写BP网络中遇到的问题及解决

1、训练的LOSS一直为0

对于二分类问题,最后的Loss不能用tf.nn.softmax_cross_entropy_with_logits来计算,而应该用tf.nn.sigmoid_cross_entropy_with_logits。因为计算softmax,对于二分类问题其值永远为1,然后在计算交叉熵时,就导致cost永远为0。

 

2、二分类问题计算正确率:输出结点需设置为两个,否则argmax()无法使用

correct_prediction = tf.equal(tf.argmax(y_,1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

参考资料:

权值初始化:https://zhuanlan.zhihu.com/p/25110150

Loss为零:https://blog.csdn.net/qq_34661230/article/details/88313252

正则化:https://github.com/caicloud/tensorflow-tutorial/blob/master/Deep_Learning_with_TensorFlow/1.4.0/Chapter04/3.%20%E6%AD%A3%E5%88%99%E5%8C%96.ipynb

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow:BP神经网络权值初始化 的相关文章

随机推荐

  • 接口文档,开放

    网易 http c m 163 com nc article headline T1348647853363 0 40 html 头条 http c 3g 163 com nc article list T1467284926140 0 2
  • DevOps 面试题集锦

    注 本文译自 https www javatpoint com devops interview questions 下面列出了常见的DevOps面试问题和答案 1 请解释 DevOps DevOp 是两个词的组合 一个是软件 Develo
  • MIPI DSI 接口驱动 FPGA 模块

    MIPI DSI 接口驱动 FPGA 模块 在当前智能设备的快速发展和功能多样化的背景下 处理高清视频流和图形数据的需求越来越高 MIPI DSI Mobile Industry Processor Interface Display Se
  • 竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

    文章目录 1 前言 2 时间序列的由来 2 1 四种模型的名称 3 数据预览 4 理论公式 4 1 协方差 4 2 相关系数 4 3 scikit learn计算相关性 5 金融数据的时序分析 5 1 数据概况 5 2 序列变化情况计算 最
  • adb 安装apk到指定设备

    一 打印设备代号 adb devices 红色和绿色区域为设备代号 二 命令 adb s 4580fa7e User aaa apk 加上 s 设备代号 apk路径替换成自己的 三 安装成功 Performing Streamed Inst
  • qrcode.js 解析二维码(源码) 复制的

    qrcode js 解析二维码 源码 复制的 var aa aa ab function f e var d qrcode width var b qrcode height var c true for var g 0 g lt e le
  • 猿人学第二题

    通过fd抓包发现他是进行了两次请求 先返回的是一对script的标签定义的js代码 第二次返回的才是正常的html代码 打开f12进入浏览器控制台 发现进入了无限debuger 那么直接在控制台中输入Function prototype c
  • 【华为OD机试真题2023B卷 JAVA&JS】观看文艺汇演问题

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 观看文艺汇演问题 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 为庆祝中国共产党成立100周年 某公园将举行多场文艺汇演 很多演出都是同时进行 一个人只能同时观看一场
  • 同时安装多台服务器系统,多服务器同时安装操作系统

    多服务器同时安装操作系统 内容精选 换一换 如果您需要使用毕昇编译器 则需要先在服务端安装毕昇编译器 毕昇编译器基于开源LLVM开发 并进行了优化和改进 同时将flang作为默认的Fortran语言前端编译器 是针对鲲鹏平台的高性能编译器
  • python2 tensorflow_谷歌TensorFlow 2.1.0正式发布 支持Python 2的最后一个 TF 版本

    TensorFlow 2 1 0 正式发布了 TensorFlow 2 1 是支持 Python 2 的最后一个 TF 版本 主要特性和改进如下 tensorflow pip 软件包现在默认包括针对 Linux 和 Windows 的 GP
  • vue组件通信总结(转)

    虽然一直使用 vue 文章中的方法也一直使用 但是 这么齐全的总结 却没有过 写的不错 链接
  • HTML lang 没你想的那么简单

    前言 做 web 无障碍相关的研究时 遇到的第一件事就是要给 设置正确的 lang 属性 这么简单的一件事 想也不用就写好了 或者直接简写成 Bingo 可以去做其它事了 但仔细想一想 好像有些问题 zh 是什么鬼 拼音 明明是国际标准怎么
  • SpringBoot 添加 MDC 日志链路追踪

    文章目录 1 线程池配置 2 拦截器配置 3 日志文件配置 4 异步方法使用 5 定时任务使用 日志链路追踪的意思就是将一个标志跨线程进行传递 在一般的小项目中也就是在你新起一个线程的时候 或者使用线程池执行任务的时候会用到 比如追踪一个用
  • shell脚本编程大全

    文章目录 一 命令行 二 shell 三 文件系统 四 shell命令 五 shell的父子关系 六 内建命令 七 环境变量 八 文件系统权限 九 管理文件系统 十 构建基本shell脚本 十一 使用结构化命令 十二 处理用户输入 十三 呈
  • “赶快上车,会调用你也可以当鉴黄师了”说罢,老司机转眼间将车门焊得死死的!

    都是学习用途 不知道为啥 图片被ban了 如需查看完整图片请转移到从今天开始种树 起因 本人在某平台发布文章时封面用了几张美女图片 内容里都是正常的流程图之类的 却被这个平台告知如下内容 大家评评理这图片违规么 查看完整图片请转移到从今天开
  • 上机作业:日历(java)

    上机作业 日历 java 1 思路框架分析 本着按照手机日历的构造模型作为model 我着手开始了日历java小程序的编写 说到日历 就不得不提一嘴最可恶的闰年 懂得都懂 闰年是bug制造者 这次用java语言编写 我特意拿出一个方法来判断
  • 543.二叉树的直径

    543 二叉树的直径 给定一棵二叉树 你需要计算它的直径长度 一棵二叉树的直径长度是任意两个结点路径长度中的最大值 这条路径可能穿过也可能不穿过根结点 本题需要明确二叉树的直径计算方法 二叉树的直径不一定过根节点 需要遍历左子节点和右子节点
  • 清除pip安装库时的缓存

    目录 1 命令清除缓存 2 路径手动清除 在使用pip安装Python库时 如果之前已经下载过该库 pip会默认使用缓存来安装库 而不是重新从网络上下载 缓存文件通常存储在用户目录下的缓存文件夹中 具体位置因操作系统和Python版本而异
  • maven多环境打包实现web.xml和context.xml中的占位符变量替换

    在springboot或传统springmvc的tomcat项目中 为了实现spring容器文件中的变量替换 我们通常可以在项目的resource目录下新建几个环境目录 例如rd test dev stress online等等 然后再在对
  • Tensorflow:BP神经网络权值初始化

    一 Tensorflow入门 1 计算图 每一个计算都是计算图上的一个结点 而节点之间的边描述了计算之间的依赖关系 支持通过tf Graph生成新的计算图 不同计算图上的张量和运算不会共享 Tensorflow会自动生成一个默认的计算图 如