更新囚生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函数原型:

  1. torch.split(tensor, split_size_or_sections, dim=0)
  2. tensorflow.split(value, num_or_size_splits, axis=0, num=None, name='split')

我一直想吐槽这个事情,axisdim明明是一个意思,但是torch和tf里的函数都是一个德性,有的函数用axis,有的函数用dim,如果没有代码提示就很容易记混。

这里主要关注两个函数的第二个参数,其实这个参数既有共通之处,也有不同之处。

  • split_size_or_sectionsnum_or_size_splits接受的参数是一个包含整数的列表List[int],此时两个函数效果是完全一样的,即按照给定的列表在指定dimaxis维上进行划分,具体如下:
# 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_sectionsnum_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-)的主要内容,如果未能解决你的问题,请参考以下文章

完结囚生CYの备忘录(20221121-20230123)

更新囚生CYの备忘录(20230216~)

更新囚生CYの备忘录(20230216~)

继续更新囚生CYの备忘录(20220906-)

完结囚生CYの备忘录(20220525-20220813)

完结囚生CYの备忘录(20220525-20220813)