【时间:2020年2月1日】今天是二月的第一天,是时候振作起来了!今天好好学习吧!
【史悟】今日在看《汉书》的高祖纪和电视剧《楚汉传奇》,心中有一个疑问:“为何乱世出英雄,时势造英雄?”也许英雄不是生出来的,而是训练出来的,至少在中国是这样的!
【世语】“You know, ters aint bad people. They 're just uneducated, unsophisticated, untraveled, immoral, and uncivilized. Plus stupid”
“你知道他们不是坏人。他们只是没受过教育。不谙事故。没出过远门。不道德。不文明。外加愚蠢。”——蒂姆·高特罗
Broadcasting的核心操作如下:
- 小维度对齐,维度自动补齐
- 维度大小不同且维度为1,则维度扩张
//维度变化,数据拷贝扩充
Feature maps: [4, 32, 32, 3]
Bias: [3] --> [1, 1, 1, 32] --> [4, 32, 32, 3]
//最终的结果是每一个元素都进行相同的数据操作
- tf.broadcast_to():数据张量维度扩张手段,就是对某一个维度重复N次,但并不拷贝数据
- tf.tile():对某一个维度重复N多次,并且真实得拷贝数据N次
//自动维度扩张
In [53]: x = tf.random.normal([4, 32, 32, 3])
In [54]: (x + tf.random.normal([3])).shape
Out[54]: TensorShape([4, 32, 32, 3])
In [55]: (x + tf.random.normal([32, 32, 1])).shape
Out[55]: TensorShape([4, 32, 32, 3])
In [56]: (x + tf.random.normal([4, 1, 1, 1])).shape
Out[56]: TensorShape([4, 32, 32, 3])
//显式维度扩张
In [58]: b = tf.broadcast_to(tf.random.normal([4, 1, 1, 1]), [4, 32, 32, 3])
In [59]: b.shape
Out[59]: TensorShape([4, 32, 32, 3])
//Braodcast VS Tile
In [61]: a = tf.ones([3, 4])
In [62]: a1 = tf.broadcast_to(a, [2, 3, 4])
In [63]: a1
Out[63]: <tf.Tensor: id=158, shape=(2, 3, 4), dtype=float32, numpy=
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]], dtype=float32)>
-------------------------------------------------------------
In [64]: a2 = tf.expand_dims(a, axis = 0)
//先扩张维度
In [65]: a2
Out[65]: <tf.Tensor: id=160, shape=(1, 3, 4), dtype=float32, numpy=
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]], dtype=float32)>
//后拷贝数据
In [66]: a2 = tf.tile(a2, [2, 1, 1])
In [67]: a2
Out[67]: <tf.Tensor: id=162, shape=(2, 3, 4), dtype=float32, numpy=
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]], dtype=float32)>
网友评论