神经网络优化(损失函数:自定义损失函数、交叉熵、softmax())
交流、咨询,有疑问欢迎添加QQ 2125364717,一起交流、一起发现问题、一起进步啊,哈哈哈哈哈
1、前向传播 搭建网络结构,反向传播 训练网络参数。
2、激活函数 提高了模型的表达里,使模型更具有表达力。
3、神经网络的层数,通常用神经网络的层数和神经网络待优化的参数的个数 来表示,层数 = 隐藏层的层数 + 1个输出层,总参数 = 总W + 总b
4、神经网络的优化
四个方面:损失函数loss、学习率learning_rate、滑动平均ema、正则化regularization
(1)损失函数(loss):预测值(y)与已知答案(y_)的差距。(即前向传播计算出的结果 与 已知标准答案的 差距)
NN 优化目标:使loss最小。主流的loss计算方法:
a) mse(Mean Squared Erros)
b) 自定义
c) ce(Cross Entropy)(交叉熵)
(2)均方误差 mse:MSE(y_, y)
loss_mse = tf.reduce_mean(tf.square(y_ - y))
(拟合可以预测销量的函数)
5、自定义损失函数
如预测商品销量,预测多了,损失成本;预测少了,损失利润。
若 利润 ≠ 成本,则mse产生的loss无法利益最大化。
自定义损失函数
y:标准答案数据集的;
y_:预测答案 计算出的
损失和
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), COSE(y - y_), PROFIT(y_ - y)))
把所有的损失求和
6、交叉熵
表征两个概率分布之间的距离
交叉熵越大,两个概率分布越远;交叉熵越小,两个概率分布越近。
y_:标准答案的概率分布;
y:预测结果的概率分布;
通过交叉熵的值,可以判断 哪个预测结果 与标准答案 最接近。
y—— = (1, 0)表示:第一种情况发生的概率是100%, 第二种情况发生的概率是0.
ce = -tf.reduce_mean(y * tf.log(tf.clip_by_value(y, 1e-12, 1.0)))
y小于1e-12时 值为1e-12(防止出现log0的错误);
大于1.0 为1.0(这是因为 输入的数 均满足概率分布,应该在0-1之间,不可能大于1)
在实际操作中,为了使前向传播产生的结果满足概率分布,及为了使n分类的n个输出(y1,y1, ..., yn)都在0-1之间,且它们的和为1,引入了softmax()函数
当n分类的n个输出(y1, y2, ..., yn)通过softmax()函数,便满足了y概率分布要求
(yn表示 第n中情况 出现的可能性大小。对于n分类,有y1, y1, ..., yn n个输出。这n个输出 经过softmax()函数后,会符合概率分布。)
(输出 经过softmax()函数 满足概率分布之后,再与标准答案 求交叉熵)
# 输出 经过softmax()函数 满足概率分布之后,再与标准答案 求交叉熵
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
cenn = tf.reduce_mean(ce)
# 这个输出cenn 就是:当前计算出的预测值 与 标准答案的 差距。也就是 损失函数
示例代码:
#coding=utf-8
'''
用自定义损失函数 预测酸奶日销量
'''
# 酸奶成功1元,酸奶利润9元
# 预测少了损失大,故不要预测少,故生成的模型会多预测一些
# 导入模块,生成数据集
import tensorflow as tf
import numpy as np
BATCH_SIZE = 8
SEED = 23455
COST = 1
PROFIT = 9
rdm = np.random.RandomState(SEED)
X = rdm.rand(32, 2)
Y = [[x1 + x2 + (rdm.rand()/10.0 - 0.05)] for (x1, x2) in X]
# 1定义神经网络的输入、参数、输出,定义前向传播过程
x = tf.placeholder(tf.float32, shape=(None, 2))
y_ = tf.placeholder(tf.float32, shape=(None, 1))
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
y = tf.matmul(x, w1) # 计算出的
# 2定义损失函数及反向传播方法
# 定义损失函数 是的预测少了的损失大,于是模型应该偏向多的方向预测
loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * COST, (y_ - y) * PROFIT))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
各位看官老爷,如果觉得对您有用麻烦赏个子,创作不易,0.1元就行了。下面是微信乞讨码:
添加描述
添加描述
- 淘宝的评论归纳是用什么方法做到的?
- Python的机器学习实战:AadBoost
- 通过shell检查分区表中是否含有默认分区(r2笔记87天)
- 利用python爬取人人贷网的数据
- 通过shell脚本查看package的信息(r2笔记86天)
- 通过shell脚本查看procedure的信息(r2笔记85天)
- 支持中文文本数据挖掘的开源项目PyMining
- 通过分区键值发现性能问题(r2笔记84天)
- linux乱码和数据库乱码的问题简单排查(r2笔记83天)
- 一条运行了3天的"简单"的sql(r2笔记82天)
- 海量数据迁移之使用shell启用多个动态并行(r2笔记81天)
- 使用shell测试历史数据样本(r2笔记80天)
- 【专业技术】编译器的工作原理
- ORA-17500 ODM err的问题排查(r2笔记78天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7下搭建Rsyslog Server记录远程主机系统日志
- 企业运维经典面试题汇总(4)
- 使用QEMU模拟树莓派Raspberry Pi
- Octave梯度下降法最优化代价函数的一个例子—ML Note 38
- Spring Boot入门系列(十八)mybatis 使用注解实现增删改查,无需xml文件!
- Mongodb多键索引之嵌套文档
- MySQL中的这几类日志,你一定要知道
- 微服务技术栈:API网关中心,落地实现方案
- 你的数据库服务器IO调度算法不对,难怪那么慢
- Android 11 强制用户使用系统相机?
- LeetCode题目38:外观数列
- GPUManager虚拟化方案
- [网络安全] 二.Web渗透信息收集之域名、端口、服务、指纹、旁站、CDN和敏感信息
- 程序员进阶系列:你真的懂 HelloWorld 吗?
- 零基础Python教程040期 序列分片技术