更新囚生CYの备忘录(20221121-)
Posted 囚生CY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新囚生CYの备忘录(20221121-)相关的知识,希望对你有一定的参考价值。
序言
上一篇写到字数上限,刚好这对我来说也是一个转折点,11月20日晚跑出场地万米42分整的历史第二好成绩,极大扭转了连日不振的状态,让我再次相信身体依然年轻,没有什么事情是办不到的。这两天早睡早起,控制饮食,想要重新把生活安回到正轨,既是希望身体素质能够在当前节点上进而提升,也希望精神能够维持住高效的工作状态,尽快弥补之前的缺漏。
人总是艳羡辉煌的成就,却鲜有去发掘成就的起点,好大喜功计划宏大的目标,却摸不清当下定位。夏虫不可语冰,子非鱼安知鱼之乐?少一些观点的强加,多一些对道与志相异的尊重。
有时候我会思考以后应当怎样做一个父亲,这看起来似乎很遥远,又好像近在眼前。理想中子女能够跟我一样热爱跑步,小时候能教会TA编程乃至TA精通一门语言。但是又如何能做到这一点呢?这使我陷入困惑,我想是不会去强迫TA做什么事情,因为我也不喜欢被人PUSH去做事。看起来似乎只能听天由命,或许通过耳濡目染能够让TA逐渐认可并追随我的生活方式。
人无需为自己的信念与选择做任何辩护,只要无愧于己,只有心有愧疚的人才会千方百计地去自我粉饰。遗憾的是生活中我们很难真实全面地认识一个人,这需要长时间的沟通与不断深入的交流,因而更多时候的唯结果论就会慢慢扭曲人的信念与选择,乃至其原本的面貌。
所以,我从SXY身上看到的是她原本的面貌吗?亦或是我自己的样子,多少是有些共情在里头的罢,希望也能跟我一样重新找回生活的刺激点。
这是最后一年了,再不把握住,就如此遗憾终了,这样真的好吗?
文章目录
20221121~20221122
【PyTorch v.s. TensorFlow】有相当一部分函数在PyTorch和TensorFlow中都是共通的,因此两者有区别的部分作记录。
split函数原型:
torch.split(tensor, split_size_or_sections, dim=0)
tensorflow.split(value, num_or_size_splits, axis=0, num=None, name='split')
我一直想吐槽这个事情,axis
和dim
明明是一个意思,但是torch和tf里的函数都是一个德性,有的函数用axis
,有的函数用dim
,如果没有代码提示就很容易记混。
这里主要关注两个函数的第二个参数,其实这个参数既有共通之处,也有不同之处。
- 若
split_size_or_sections
或num_or_size_splits
接受的参数是一个包含整数的列表List[int]
,此时两个函数效果是完全一样的,即按照给定的列表在指定dim
或axis
维上进行划分,具体如下:
# Split `x` of size [5, 30] into 3 tensors with sizes [4, 15, 11] along dimension 1
import tensorflow as tf
x = tf.Variable(tf.random.uniform([5, 30], -1, 1))
split0, split1, split2 = tf.split(x, [4, 15, 11], 1)
print(tf.shape(split0).numpy()) # array([5, 4], dtype=int32)
print(tf.shape(split1).numpy()) # array([5, 15], dtype=int32)
print(tf.shape(split2).numpy()) # array([5, 11], dtype=int32)
import torch
x = torch.randn(5, 30)
split0, split1, split2 = tf.split(x, [4, 15, 11], 1)
print(split0.size()) # torch.Size([5, 4])
print(split1.size()) # torch.Size([5, 15])
print(split1.size()) # torch.Size([5, 11])
-
若
split_size_or_sections
或num_or_size_splits
接受的参数是一个整数n
,此时两个函数的效果完全不同,对于tf而言,这是在指定axis
维上将张量划分成n
等份,而对于torch,这是在指定axis
维上将张量划分成每份长度为n
的切片。具体而言,给定张量
x
的形状是(2, 3, 16)
,那么torch.split(x, 2, -1)
和tf.split(x, 8, -1)
的效果都是将x
划分成8份形状是(2, 3, 2)
的切片。
此坑源于将MultiHeadAttention源码中的tensorflow改写成torch,源码对应部分:
# Split and concat
Q_ = tf.concat(tf.split(Q, num_heads, axis=2), axis=0) # (h*N, T_q, d_model/h)
K_ = tf.concat(tf.split(K, num_heads, axis=2), axis=0) # (h*N, T_k, d_model/h)
V_ = tf.concat(tf.split(V, num_heads, axis=2), axis=0) # (h*N, T_k, d_model/h)
应改写为:
self.size_of_head = int(d_model / num_heads)
# Split and concat
Q_ = torch.cat(torch.split(Q, self.size_of_head, dim=-1), axis=0) # (h*N, T_q, d_model/h)
K_ = torch.cat(torch.split(K, self.size_of_head, dim=-1), axis=0) # (h*N, T_k, d_model/h)
V_ = torch.cat(torch.split(V, self.size_of_head, dim=-1), axis=0) # (h*N, T_k, d_model/h)
以上是关于更新囚生CYの备忘录(20221121-)的主要内容,如果未能解决你的问题,请参考以下文章