GVKun编程网logo

RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?

11

如果您对RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解RNN的tf.

如果您对RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?的各种细节,此外还有关于#1055 ... sql_mode=only_full_group_by、Float.MIN_VALUE和Float.MIN_NORMAL之间的区别? [重复]、Linux服务器MySQL5.7版本only_full_group_by问题、mysql 5.7 解决 sql_mode=ONLY_FULL_GROUP_BY的实用技巧。

本文目录一览:

RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?

RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?

想要了解在TensorFlow中实现梯度裁剪的角色tf.clip_by_value以及tf.clip_by_global_norm实现过程中的区别。哪一种是首选,以及如何确定要裁剪的最大值?

答案1

小编典典

TL; DRtf.clip_by_global_norm用于渐变裁剪。

clip_by_value

tf.clip_by_value将每个值裁剪到一个张量内,而不管张量中的其他值如何。例如,

tf.clip_by_value([-1, 2, 10], 0, 3)  -> [0, 2, 3]  # Only the values below 0 or above 3 are changed

因此,它可以改变张量的方向,因此,如果张量中的值彼此解相关(对于梯度裁剪而言不是这种情况),则应使用它,或者避免张量中的零/无限值可能导致其他地方的Nan
/无限值(例如,通过裁剪最小epsilon = 1e-8和非常大的最大值)。

clip_by_norm

tf.clip_by_norm如有必要,重新缩放一个张量,以使其L2范数不超过特定阈值。通常,避免梯度在一个张量上爆炸很有用,因为您可以保持梯度方向。例如:

tf.clip_by_norm([-2, 3, 6], 5)  -> [-2, 3, 6]*5/7  # The original L2 norm is 7, which is >5, so the final one is 5tf.clip_by_norm([-2, 3, 6], 9)  -> [-2, 3, 6]  # The original L2 norm is 7, which is <9, so it is left unchanged

但是,clip_by_norm仅在一个梯度上起作用,因此,如果在所有梯度张量上使用它,则将使它们不平衡(某些将被重新缩放,另一些则不会,并且并非全部具有相同的比例)。

请注意,前两个仅在一个张量上起作用,而最后一个在张量列表上使用。

clip_by_global_norm

tf.clip_by_global_norm重新缩放张量列表,以使所有范数的向量的总范数不超过阈值。目标与
clip_by_norm(避免爆炸梯度,保持梯度方向)相同,但是它一次处理所有梯度,而不是分别作用于每个梯度(也就是说,如有必要,对所有梯度都按相同的因子进行缩放,或者不进行缩放)他们被重新缩放)。这样更好,因为可以保持不同梯度之间的平衡。

例如:

tf.clip_by_global_norm([tf.constant([-2, 3, 6]),tf.constant([-4, 6, 12])] , 14.5)

将两个张量缩放一个因子14.5/sqrt(49 + 196),因为第一个张量的L2范数为7,第二个张量的L2范数为14,并且sqrt(7^2+14^2)>14.5

这(tf.clip_by_global_norm)是您应该用于渐变剪切的那个。例如,请参阅此以获取更多信息。

选择价值

选择最大值是最困难的部分。您应该使用最大的值,以免出现爆炸梯度(其影响可以是Nans或infinite张量中出现的值,在经过一些训练后,损失/准确度恒定)。该值应该tf.clip_by_global_norm比其他值更大,因为由于隐含的张量的数量,全球L2规范在机械上将比其他规范更大。

#1055 ... sql_mode=only_full_group_by

#1055 ... sql_mode=only_full_group_by

sql_mode=only_full_group_by


 

版权声明:本文为参考多篇博主文章,略作测试修改。

参考文章:

  猿医生 的《5分钟学会MySQL-this is incompatible with sql_mode=only_full_group_by错误解决方案》。

  XiaoMaPro 的 《MySql版本问题sql_mode=only_full_group_by》

  hhcoder 的 《Mysql group by this is incompatible with sql_mode=only_full_group_by》


 

一、错误信息:

使用左连接进行group by 操作时,报如下错误:

#1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated 
column ''b.id'' which is not functionally dependent on columns in GROUP BY clause; 
this is incompatible with sql_mode=only_full_group_by


 

二、错误翻译:

#1055-选择列表的表达式3不在GROUP BY子句中,
并且包含未聚合的列“b.id”,
该列在功能上不依赖GROUP BY子句中的列;这与SQL模式=仅“完整”GROUP BY不兼容。


 

三、错误原因:

MySQL 5.7,实现检测功能的依赖。
如果启用了ONLY_FULL_GROUP_BY SQL模式(默认),
MySQL拒绝选择列表查询,条件,或命令列表是指非聚合列既不是GROUP by子句中指定功能也不依赖他们。
(5.7之前,MySQL不检测功能的依赖和ONLY_FULL_GROUP_BY在默认情况下不启用。
ONLY_FULL_GROUP_BY,对于GROUP BY聚合操作,
如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中,
也就是说查出来的列必须在GROUP BY后面出现否则就会报错,或者这个字段出现在聚合函数里面。


 

四、解决:

(1)可以先查看下mysql版本:

select version();
结果:5.7
.14-log

(2)再使用select @@GLOBAL.sql_mode,查看ONLY_FULL_GROUP_BY是否启用。

结果显示示例:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

结果中有ONLY_FULL_GROUP_BY,代表被启用。

(3)把这一项去掉:

set @@GLOBAL.sql_mode=''STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'';

(4)或者修改配置文件
  1、打开配置文件mysql.cnf

sudo vi /etc/mysql/mysql.cnf

  2、添加配置

sql_mode =''STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION''

  3、重启mysql

sudo service mysql restart

(5)重新查看sql_mode,看是否修改成功。

SELECT @@sql_mode;

(6)测试

执行sql语句,看是否还报错。


 

Float.MIN_VALUE和Float.MIN_NORMAL之间的区别? [重复]

Float.MIN_VALUE和Float.MIN_NORMAL之间的区别? [重复]

如何解决Float.MIN_VALUE和Float.MIN_NORMAL之间的区别? [重复]?

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

第一个问题的答案是重复的。 第二个问题的答案是: 浮点数和双打数都没有无限的精度。您可以方便地认为它们的精度约为16位。超过此限制的所有内容都将导致舍入错误和截断。 因此,1.0e0 + 1e-38由于会舍弃多余的精度,因此除了以1.0e0结尾以外,将无法执行任何操作。 与其他答案一样,它确实需要了解IEEE格式的浮点数实际上是如何以二进制形式添加的。基本思想是二进制浮点数的非符号和指数部分在CPU的IEEE-754单元中进行了移位(Intel上为80位宽,这意味着在末尾总是会截断)计算)代表其实数。以十进制表示,如下所示: 位数:1 234567890123456 值:1.0000000000000000000000000000 ... 0000 值:0.0000000000000000000000000000 ... 0001 处理完添加后,实际上是: 位数:1 234567890123456 值:1.0000000000000000000000000000 ... 0001 因此,请记住,该值会在16位数字标记附近截断(以十进制表示,在32位浮点数中恰好是22个二进制数字,在64位双精度数中恰好是51个二进制数字,而忽略了非常重要的事实前导1被移位(相对于指数)并被假定(有效地将23位二进制数字压缩为32位的22和22位的52压缩为51),这是很有趣的一点,但是您应该阅读更多详细示例,例如此处的详细信息)。 截断: 位数:1 234567890123456 价值:1.00000000000000000000 请注意,非常小的小数部分将被截断,因此保留1。 当我在考虑内存中的实际表示时遇到问题时,可以使用以下页面:十进制到32位IEEE-754格式。在该站点中,还有指向64位的链接,并且反向链接。     

Linux服务器MySQL5.7版本only_full_group_by问题

Linux服务器MySQL5.7版本only_full_group_by问题

mysql5.7的版本设置了 mysql sql_mode=only_full_group_by 这一属性,所以导致了错误。

查看mysql版本

select version();

查看sql_mode

select @@global.sql_mode;

查询出来的值为:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

基本可以确定问题only_full_group_by引起,在此推荐修改配置文件,这样即使MySQL服务器重启也没问题:

1、在linux找到文件

/etc/mysql/mysql.conf.d/mysqld.cnf

2、末尾添加如下语句

sql_mode=''STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'' 

3、重新启动MySQL服务

service msyql restart


 

mysql 5.7 解决 sql_mode=ONLY_FULL_GROUP_BY

mysql 5.7 解决 sql_mode=ONLY_FULL_GROUP_BY

试过很多百度的解决方法没有成功,觉得可能有些模糊,所以想写的详细些,方便少采坑。

登录数据库:

mysql -u root -pxxxxx

 

查询sql_mode包含哪些模块:

select @@sql_mode;

去掉字符串中的 ONLY_FULL_GROUP_BY

复制:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

编辑 /etc/my.cnf

vim /etc/my.cof

在 [mysqld] 在下面添加:

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

 保存

 重启mysql  service mysqld restart

 禁用ONLY_FULL_GROUP_BY前:

 

 禁用ONLY_FULL_GROUP_BY后:

 到此禁用 ONLY_FULL_GROUP_BY 成功

关于RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于#1055 ... sql_mode=only_full_group_by、Float.MIN_VALUE和Float.MIN_NORMAL之间的区别? [重复]、Linux服务器MySQL5.7版本only_full_group_by问题、mysql 5.7 解决 sql_mode=ONLY_FULL_GROUP_BY等相关内容,可以在本站寻找。

本文标签: