首页 > 其他分享 >numpy手撕

numpy手撕

时间:2023-02-27 17:35:10浏览次数:27  
标签:inputs head return np numpy generate def

import numpy as np

def gelu(x):
    return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))

def softmax(x):
    exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
    return exp_x / np.sum(exp_x, axis=-1, keepdims=True)

def layer_norm(x, g, b, eps: float = 1e-5):
    mean = np.mean(x, axis=-1, keepdims=True)
    variance = np.var(x, axis=-1, keepdims=True)
    return g * (x - mean) / np.sqrt(variance + eps) + b

def linear(x, w, b):
    return x @ w + b

def ffn(x, c_fc, c_proj):
    return linear(gelu(linear(x, **c_fc)), **c_proj)

def attention(q, k, v, mask):
    return softmax(q @ k.T / np.sqrt(q.shape[-1]) + mask) @ v

def mha(x, c_attn, c_proj, n_head):
    x = linear(x, **c_attn)
    qkv_heads = list(map(lambda x: np.split(x, n_head, axis=-1), np.split(x, 3, axis=-1)))
    casual_mask = (1 - np.tri(x.shape[0])) * -1e10
    out_heads = [attention(q, k, v, casual_mask) for q, k, v in zip(*qkv_heads)]
    x = linear(np.hstack(out_heads), **c_proj)
    return x

def transformer_block(x, mlp, attn, ln_1, ln_2, n_head):
    x = x + mha(layer_norm(x, **ln_1), **attn, n_head=n_head)
    x = x + ffn(layer_norm(x, **ln_2), **mlp)
    return x

def gpt2(inputs, wte, wpe, blocks, ln_f, n_head):
    x = wte[inputs] + wpe[range(len(inputs))]
    for block in blocks:
        x = transformer_block(x, **block, n_head=n_head)
    return layer_norm(x, **ln_f) @ wte.T

def generate(inputs, params, n_head, n_tokens_to_generate):
    from tqdm import tqdm
    for _ in tqdm(range(n_tokens_to_generate), "generating"):
        logits = gpt2(inputs, **params, n_head=n_head)
        next_id = np.argmax(logits[-1])
        inputs = np.append(inputs, [next_id])
    return list(inputs[len(inputs) - n_tokens_to_generate :])

def main(prompt: str, n_tokens_to_generate: int = 40, model_size: str = "124M", models_dir: str = "models"):
    from utils import load_encoder_hparams_and_params
    encoder, hparams, params = load_encoder_hparams_and_params(model_size, models_dir)
    input_ids = encoder.encode(prompt)
    assert len(input_ids) + n_tokens_to_generate < hparams["n_ctx"]
    output_ids = generate(input_ids, params, hparams["n_head"], n_tokens_to_generate)
    output_text = encoder.decode(output_ids)
    return output_text

if __name__ == "__main__":
    import fire
    fire.Fire(main)

  

标签:inputs,head,return,np,numpy,generate,def
From: https://www.cnblogs.com/qiaoqifa/p/17160570.html

相关文章

  • numpy学习
    importnumpyasnp#a=np.array([1,2,3])#print(a[0])#b=np.array([[1,2,3],[4,5,6]])#print(b[0])#print(b.shape)#创造numpy的方式#np.arra......
  • 各类梯度下降算法的numpy实现
    layout:posttitle:深度学习subtitle:梯度下降算法实现description:梯度下降算法实现date:2022-10-25categories:deeplearningtags:codepy......
  • python Numpy数组2.27
    #成员类型转换arr.astype(np.float_)#转换数组对象成员的类型为float,形状不变。#形状转换arr.resize(shape)#返回值是一个None,不能引用内部的属性arr.reshape(shape)#......
  • Numpy
    NumPy什么是NumPy?  NumPy是Python中科学计算的基础包。Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻......
  • numpy中的矩阵
    numpy中的矩阵1.矩阵矩阵,和array的区别是矩阵必须是2维的,但array可以是多维的2.向量3.加法和标量相乘4.矩阵向量乘法矩阵乘法遵循准则:(M行,N列)*(N行,L列)=(M行,L列)......
  • numpy的ndarray的运算
    ndarray的运算1.逻辑运算score=np.random.randint(40,100,(10,5))#生成一个10行5列取值在40-50之间的数组test_sore=score[6:,0:5]#从第6行开始到末尾,5列,取出4名同......
  • python numpy 中的冒号
    python中冒号实际上有两个意思:1.全部选择matrix1[1,:]表示matrix的第1行的所有元素matrix1[:,1]表示matrix的第1列的所有元素2.表示区间,含左不含右matrix1[1,0:......
  • numpy数组的基本操作
    数组的基本操作1.数组的索引、切片一维、二维、三维的数组切片直接进行索引,切片对象[:,:]—先行后列#对于二维数组x1=np.random.uniform(0,1,[4,5])#生成一......
  • python pip install numpy & scipy from repository tinghua
    python.exe-mpipinstall--upgradepippython-mpipinstall--upgradepippipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simple--upgradepippipinstal......
  • 利用Python进行数据分析——Numpy
    基础索引1.多维度数组1.1二维数组此部分好理解,画一个平面的XY轴,X为横轴,Y为竖轴即可理解。1.2三维数组难点在于理解的是如何把抽象的数组转化为三维空间的数据结构。......