torch. svd torch. mm
torch. matmul
torch. argsort
torch. view_as_complex torch. view_as_real
torch. split
unsqueeze squeeze
masked_fill
torch. einsum
x. requires_grad_( True )
torch. optim. SGD( [ w] , lr= 0.01 )
torch. masked_select
torch. zeros_like
torch. tensor( [ 4 , 8 ] , dtype= torch. int32)
torch. log( x) / math. log( 2 )
torch. clamp_min
torch. sum ( hx, dim= 0 ) . flatten( 0 )
torch. searchsorted
torch. round ( x)
torch. index_select
torch. randint( 0 , 2 , ( 3 , 4 ) )
mask_new[ mask < rate_constraint] = 1
nn. functional. gumbel_softmax
torch. flip
torch. cumsum
class depthwise_separable_conv ( nn. Module) :
def __init__ ( self, ch_in, ch_out) :
super ( depthwise_separable_conv, self) . __init__( )
self. ch_in = ch_in
self. ch_out = ch_out
self. depth_conv = nn. Conv2d( ch_in, ch_in, kernel_size= 7 , padding= 2 , groups= ch_in)
self. point_conv = nn. Conv2d( ch_in, ch_out, kernel_size= 7 )
def forward ( self, x) :
x = self. depth_conv( x)
x = self. point_conv( x)
return x
1.DPCA
import torch
a = torch. randn( 5 , 3 )
u, s, v = torch. svd( a)
a_hat = torch. mm( torch. mm( u, torch. diag( s) ) , v. t( ) )
print ( f"待分解的矩阵\n { a} " )
print ( f"分解因子\n { u} " )
print ( f"分解因子\n { s} " )
print ( f"分解因子\n { v} " )
print ( f"恢复的矩阵\n { a_hat} " )
待分解的矩阵
tensor([[-0.2384, -0.2361, -2.9088],
[-1.3432, -0.1278, 2.3487],
[ 0.1430, -0.5459, 1.2211],
[-0.8490, -0.2448, -0.5152],
[-0.5628, -0.7402, -0.0866]])
分解因子
tensor([[ 7.1150e-01, -4.0164e-01, -3.5282e-02],
[-6.2821e-01, -5.6756e-01, 3.2516e-01],
[-2.9931e-01, 5.8300e-02, -7.3013e-01],
[ 9.7694e-02, -5.4707e-01, 1.0942e-01],
[-2.5454e-04, -4.6247e-01, -5.8988e-01]])
分解因子
tensor([3.9990, 1.7200, 0.8296])
分解因子
tensor([[ 0.1372, 0.9251, -0.3540],
[ 0.0130, 0.3557, 0.9345],
[-0.9905, 0.1328, -0.0368]])
恢复的矩阵
tensor([[-0.2384, -0.2361, -2.9088],
[-1.3432, -0.1278, 2.3487],
[ 0.1430, -0.5459, 1.2211],
[-0.8490, -0.2448, -0.5152],
[-0.5628, -0.7402, -0.0866]])
tensor1 = torch. randint( 1 , 5 , ( 3 , 4 ) )
tensor2 = torch. randint( 0 , 3 , ( 4 , ) )
tensor3 = torch. matmul( tensor1, tensor2)
print ( f"tensor1:\n { tensor1} " )
print ( f"tensor2:\n { tensor2} " )
print ( f"tensor3:\n { tensor3} " )
print ( "=================================================" )
tensor4 = torch. randint( 1 , 5 , ( 10 , 3 , 4 ) )
tensor5 = torch. randint( 0 , 3 , ( 10 , 4 , 5 ) )
tensor6 = torch. matmul( tensor4, tensor5)
print ( f"tensor3:\n { tensor6. size( ) } " )
print ( "=================================================" )
tensor1:
tensor([4, 4, 4])
tensor2:
tensor([1, 0, 1])
tensor3:
8
=================================================
tensor3:
torch.Size([10, 3, 5])
=================================================
from torch. nn import Conv2d, Sequential, BatchNorm2d, ReLU, Linear, Flatten, BatchNorm1d, PReLU, ConvTranspose2d
decoder = Sequential(
ConvTranspose2d( in_channels= 64 , out_channels= 32 , kernel_size= 5 , stride= 2 , padding= 2 , output_padding= 1 ) ,
PReLU( ) ,
ConvTranspose2d( in_channels= 32 , out_channels= 32 , kernel_size= 5 , stride= 2 , padding= 2 , output_padding= 1 ) ,
PReLU( ) ,
ConvTranspose2d( in_channels= 32 , out_channels= 32 , kernel_size= 5 , stride= 1 , padding= 2 ) ,
PReLU( ) ,
ConvTranspose2d( in_channels= 32 , out_channels= 16 , kernel_size= 5 , stride= 1 , padding= 2 ) ,
PReLU( ) ,
ConvTranspose2d( in_channels= 16 , out_channels= 6 , kernel_size= 5 , stride= 1 , padding= 2 ) ,
PReLU( ) ,
)
tensor1 = torch. randn( 64 , 64 , 8 , 8 )
tensor2 = decoder( tensor1)
print ( tensor2. shape)
torch.Size([64, 6, 32, 32])
s_1_2 = torch. tensor( [ - 0.4255 , - 0.2113 , 0.3511 , - 0.4498 , - 1.1088 , 0.5457 , 0.1559 , 0.7289 ,
0.2720 , - 2.8669 ] )
print ( f"s_1_2:\n { s_1_2} " )
ind = torch. argsort( s_1_2, descending= True )
print ( f"s_1_2的索引ind:\n { ind} " )
ind = ind[ : 4 ]
print ( f"选择前dim_p个索引ind:\n { ind} " )
ind < 3
s_1_2:
tensor([-0.4255, -0.2113, 0.3511, -0.4498, -1.1088, 0.5457, 0.1559, 0.7289,
0.2720, -2.8669])
s_1_2的索引ind:
tensor([7, 5, 2, 8, 6, 1, 0, 3, 4, 9])
选择前dim_p个索引ind:
tensor([7, 5, 2, 8])
tensor([False, False, True, False])
z1 = torch. randn( 5 , 32 * 8 * 8 )
z2 = torch. randn( 5 , 32 * 8 * 8 )
mu_1 = torch. randn( 32 * 8 * 8 , )
mu_2 = torch. randn( 32 * 8 * 8 , )
v_1 = torch. randn( 32 * 8 * 8 , 5 )
v_2 = torch. randn( 32 * 8 * 8 , 5 )
z1_p = torch. matmul( z1 - mu_1, v_1[ : , ind_1] )
z2_p = torch. matmul( z2 - mu_2, v_2[ : , ind_2] )
print ( ( z1 - mu_1) . shape)
print ( v_1[ : , ind_1] . shape)
print ( z1_p. shape)
print ( z2_p. shape)
torch.Size([5, 2048])
torch.Size([2048, 1])
torch.Size([5, 1])
torch.Size([5, 3])
z1 = torch. randn( 128 , 1024 , 2 )
z2 = torch. view_as_complex( z1)
z3 = torch. view_as_real( z2)
print ( f"z1:\n { z1. shape} " )
print ( f"z2:\n { z2. shape} " )
print ( f"z3:\n { z3. shape} " )
z1:
torch.Size([128, 1024, 2])
z2:
torch.Size([128, 1024])
z3:
torch.Size([128, 1024, 2])
obs = torch. randn( 128 , 6 , 32 , 32 )
obs1, obs2= torch. split( obs, 3 , dim= 1 )
help ( torch. split)
print ( f"obs1:\n { obs1. shape} " )
Help on function split in module torch.functional:
split(tensor: torch.Tensor, split_size_or_sections: Union[int, List[int]], dim: int = 0) -> List[torch.Tensor]
Splits the tensor into chunks. Each chunk is a view of the original tensor.
If :attr:`split_size_or_sections` is an integer type, then :attr:`tensor` will
be split into equally sized chunks (if possible). Last chunk will be smaller if
the tensor size along the given dimension :attr:`dim` is not divisible by
:attr:`split_size`.
If :attr:`split_size_or_sections` is a list, then :attr:`tensor` will be split
into ``len(split_size_or_sections)`` chunks with sizes in :attr:`dim` according
to :attr:`split_size_or_sections`.
Args:
tensor (Tensor): tensor to split.
split_size_or_sections (int) or (list(int)): size of a single chunk or
list of sizes for each chunk
dim (int): dimension along which to split the tensor.
Example::
>>> a = torch.arange(10).reshape(5,2)
>>> a
tensor([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
>>> torch.split(a, 2)
(tensor([[0, 1],
[2, 3]]),
tensor([[4, 5],
[6, 7]]),
tensor([[8, 9]]))
>>> torch.split(a, [1,4])
(tensor([[0, 1]]),
tensor([[2, 3],
[4, 5],
[6, 7],
[8, 9]]))
obs1:
torch.Size([128, 3, 32, 32])
import numpy as np
a = np. random. rand( )
print ( a)
0.6296961807592375
for rate in range ( 10 ) :
compression_rate = min ( ( rate+ 1 ) * 0.1 , 1 )
channel = max ( np. sqrt( 28 * ( 1 - compression_rate) / 2 ) , 1 )
print ( f"compression_rate: { compression_rate} " )
print ( f"channel: { int ( channel) } " )
compression_rate:0.1
channel:3
compression_rate:0.2
channel:3
compression_rate:0.30000000000000004
channel:3
compression_rate:0.4
channel:2
compression_rate:0.5
channel:2
compression_rate:0.6000000000000001
channel:2
compression_rate:0.7000000000000001
channel:2
compression_rate:0.8
channel:1
compression_rate:0.9
channel:1
compression_rate:1.0
channel:1
class CNNEncoder ( nn. Module) :
def __init__ ( self, obs_shape, feature_dim, num_layers= 3 , num_filters= 64 , n_hidden_layers= 2 , hidden_size= 128 ,
min_log_std= - 10 , max_log_std= 2 ) :
super ( ) . __init__( )
self. obs_shape = obs_shape
self. feature_dim = feature_dim
self. num_layers = num_layers
self. min_log_std = min_log_std
self. max_log_std = max_log_std
self. conv_layers = nn. ModuleList(
[ nn. Conv2d( obs_shape[ 0 ] , num_filters, 3 , stride= 2 ) ]
)
for i in range ( num_layers - 1 ) :
self. conv_layers. append( nn. Conv2d( num_filters, num_filters, 3 , stride= 2 ) )
x = torch. rand( [ 1 ] + list ( obs_shape) )
conv_flattened_size = np. prod( self. forward_conv( x) . shape[ - 3 : ] )
ff_layers = OrderedDict( )
previous_feature_size = conv_flattened_size
for i in range ( n_hidden_layers) :
ff_layers[ f'linear_ { i + 1 } ' ] = nn. Linear( in_features= previous_feature_size,
out_features= hidden_size)
ff_layers[ f'relu_ { i + 1 } ' ] = nn. ReLU( )
previous_feature_size = hidden_size
ff_layers[ f'linear_ { n_hidden_layers + 1 } ' ] = nn. Linear( in_features= previous_feature_size,
out_features= 2 * feature_dim)
self. ff_layers = nn. Sequential( ff_layers)
def forward_conv ( self, obs) :
conv = torch. relu( self. conv_layers[ 0 ] ( obs) )
for i in range ( 1 , self. num_layers) :
conv = torch. relu( self. conv_layers[ i] ( conv) )
conv = conv. reshape( conv. size( 0 ) , - 1 )
return conv
def forward ( self, obs, detach= False ) :
h = self. forward_conv( obs)
if detach:
h = h. detach( )
out = self. ff_layers( h)
mean, log_std = out. split( [ self. feature_dim, self. feature_dim] , dim= 1 )
log_std = log_std. clip( self. min_log_std, self. max_log_std)
return mean, log_std
torch.Size([128, 16, 28, 28])
import torch
z = torch. randn( 1 , 3 , 34345 , 32 , 32 )
z1 = z. unsqueeze( 2 )
z2 = z1. unsqueeze( 3 )
print ( z1. shape)
print ( z2. shape)
torch.Size([1, 3, 1, 34345, 32, 32])
torch.Size([1, 3, 1, 1, 34345, 32, 32])
snr = torch. randn( 4 , 3 , 32 , 32 )
snr1 = snr. squeeze( - 2 )
snr2 = snr1. squeeze( )
print ( snr1. shape)
print ( snr2. shape)
torch.Size([4, 3, 32, 32])
torch.Size([4, 3, 32, 32])
import torch
from torch import nn
input = torch. tensor( [ 1 , 2 , 3 ] , dtype= torch. float32)
target = torch. tensor( [ 1 , 2 , 5 ] , dtype= torch. float32)
input = torch. reshape( input , ( 1 , 1 , 1 , 3 ) )
target = torch. reshape( target, ( 1 , 1 , 1 , 3 ) )
loss_mse = nn. MSELoss( )
result_mse1 = loss_mse( input , target)
result_mse2 = loss_mse( input * 100. , target* 100. )
print ( result_mse1)
print ( result_mse2)
tensor(1.3333)
tensor(13333.3330)
import numpy as np
noise_1 = torch. randn( 1 , 2 )
noise_2 = torch. randn( 1 , 2 ) * np. sqrt( 0.1 ** 2 )
print ( noise_1)
print ( noise_2)
tensor([[1.6070, 0.3328]])
tensor([[ 0.1151, -0.0453]])
a = torch. randn( 1 , 2 , 5 , 4 )
u, s, v = torch. svd( a)
print ( f"分解因子u\n { u. shape} " )
print ( f"分解因子s\n { s} " )
print ( f"分解因子s\n { s. shape} " )
print ( f"分解因子v\n { v. shape} " )
分解因子u
torch.Size([1, 2, 5, 4])
分解因子s
tensor([[[2.7966, 1.9091, 1.5002, 0.5480],
[3.5446, 2.2571, 1.7378, 1.0956]]])
分解因子s
torch.Size([1, 2, 4])
分解因子v
torch.Size([1, 2, 4, 4])
ind = torch. tensor( [ 32 , 0 , 33 , 34 , 1 , 35 , 36 , 2 ] )
tmp1 = torch. tensor( [ False , True , False , False , True , False , False , True ] )
tmp2 = torch. tensor( [ True , False , True , True , False , True , True , False ] )
ind1 = ind[ tmp1]
ind2 = ind[ tmp2] - 32
ind2
tensor([0, 1, 2, 3, 4])
tensor1 = torch. randn( 64 , 256 , 64 )
tensor2 = torch. randn( 64 , 64 )
torch. matmul( tensor1, tensor2) . size( )
torch.Size([64, 256, 64])
import torch
a= torch. tensor( [ [ 5 , 5 , 5 , 5 ] , [ 6 , 6 , 6 , 6 ] , [ 7 , 7 , 7 , 7 ] , [ 1 , 1 , 1 , 1 ] , [ 2 , 2 , 2 , 2 ] , [ 3 , 3 , 3 , 3 ] ] )
print ( a)
print ( a. size( ) )
mask = torch. IntTensor( [ [ 1 ] , [ 0 ] , [ 0 ] , [ 0 ] , [ 1 ] , [ 1 ] ] )
print ( mask. size( ) )
b = a. masked_fill( mask, value= torch. tensor( - 1e9 ) )
print ( b)
print ( b. size( ) )
tensor([[5, 5, 5, 5],
[6, 6, 6, 6],
[7, 7, 7, 7],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]])
torch.Size([6, 4])
torch.Size([6, 1])
tensor([[-1000000000, -1000000000, -1000000000, -1000000000],
[ 6, 6, 6, 6],
[ 7, 7, 7, 7],
[ 1, 1, 1, 1],
[-1000000000, -1000000000, -1000000000, -1000000000],
[-1000000000, -1000000000, -1000000000, -1000000000]])
torch.Size([6, 4])
2.transformer
a_tensor = torch. tensor( [ [ 11 , 12 ] ,
[ 21 , 22 ] ] )
b_tensor = torch. tensor( [ [ 1 , 1 ] ,
[ 0 , 0 ] ] )
output = torch. einsum( 'ik, kj -> ij' , a_tensor, b_tensor)
print ( output)
tensor([[11, 11],
[21, 21]])
a= torch. tensor( [ [ 5 , 5 , 5 , 5 ] , [ 6 , 6 , 6 , 6 ] , [ 7 , 7 , 7 , 7 ] , [ 1 , 1 , 1 , 1 ] ] )
print ( a)
torch. einsum( 'ii' , a)
torch. einsum( 'ii->i' , a)
tensor([[5, 5, 5, 5],
[6, 6, 6, 6],
[7, 7, 7, 7],
[1, 1, 1, 1]])
tensor([5, 6, 7, 1])
import torch
import torch. nn as nn
x = torch. randn( 1 , 16 , 32 , 32 )
unfold = nn. Unfold( kernel_size= ( 5 , 5 ) , dilation= ( 1 , 1 ) , padding= 2 , stride= 1 )
y = unfold( x)
print ( y. size( ) )
torch.Size([1, 400, 1024])
x = torch. randn( 1 , 16 , 32 , 32 )
o_mapping = nn. AvgPool2d( kernel_size= 1 , stride= 1 )
x1 = o_mapping( x)
print ( x1. size( ) )
torch.Size([1, 16, 32, 32])
3.求梯度的深入研究
import torch
x = torch. arange( 4.0 )
x
tensor([0., 1., 2., 3.])
x. requires_grad_( True )
x. grad
y = 2 * torch. dot( x, x)
y
tensor(28., grad_fn=<MulBackward0>)
y. backward( )
x. grad
tensor([ 0., 4., 8., 12.])
x. grad == 4 * x
tensor([True, True, True, True])
x. grad. zero_( )
y = x. sum ( )
y. backward( )
x. grad
y
x
tensor([0., 1., 2., 3.], requires_grad=True)
import torch
w = torch. tensor( [ 0.5 , 0.5 ] , requires_grad= True )
loss = w[ 0 ] ** 2 + 2 * w[ 1 ] ** 2
opti = torch. optim. SGD( [ w] , lr= 0.01 )
loss. backward( )
print ( "w的梯度:" , w. grad)
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
w的梯度: tensor([1., 2.])
w: tensor([0.5000, 0.5000], requires_grad=True)
w: tensor([0.4900, 0.4800], requires_grad=True)
import torch
w = torch. tensor( [ 0.5 , 0.5 ] , requires_grad= True )
loss = w[ 0 ] ** 2 + 2 * w[ 1 ] ** 2
opti = torch. optim. SGD( [ w] , lr= 0.01 )
loss. backward( )
print ( "w的梯度:" , w. grad)
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
w的梯度: tensor([1., 2.])
w: tensor([0.5000, 0.5000], requires_grad=True)
w: tensor([0.4900, 0.4800], requires_grad=True)
w: tensor([0.4800, 0.4600], requires_grad=True)
w: tensor([0.4700, 0.4400], requires_grad=True)
import torch
w = torch. tensor( [ 0.5 , 0.5 ] , requires_grad= True )
loss = w[ 0 ] . clone( ) ** 2 + 2 * w[ 1 ] . clone( ) ** 2
opti = torch. optim. SGD( [ w] , lr= 0.01 )
loss. backward( retain_graph= True )
print ( "w的梯度:" , w. grad)
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
opti. zero_grad( )
loss = w[ 0 ] . clone( ) ** 2 + 2 * w[ 1 ] . clone( ) ** 2
loss. backward( )
print ( "w的梯度:" , w. grad)
opti. step( )
print ( "w:" , w)
w的梯度: tensor([1., 2.])
w: tensor([0.5000, 0.5000], requires_grad=True)
w: tensor([0.4900, 0.4800], requires_grad=True)
w的梯度: tensor([0.9800, 1.9200])
w: tensor([0.4802, 0.4608], requires_grad=True)
import torch
w = torch. tensor( [ 0.5 , 0.5 ] , requires_grad= True )
loss = w[ 0 ] . clone( ) ** 2 + 2 * w[ 1 ] . clone( ) ** 2
opti = torch. optim. SGD( [ w] , lr= 0.01 , weight_decay= 1 )
loss. backward( retain_graph= True )
print ( "w的梯度:" , w. grad)
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
w的梯度: tensor([1., 2.])
w: tensor([0.5000, 0.5000], requires_grad=True)
w: tensor([0.4850, 0.4750], requires_grad=True)
w: tensor([0.4702, 0.4502], requires_grad=True)
import torch
w = torch. tensor( [ 0.5 , 0.5 ] , requires_grad= True )
loss = w[ 0 ] . clone( ) ** 2 + 2 * w[ 1 ] . clone( ) ** 2
opti = torch. optim. SGD( [ w] , lr= 0.01 , momentum= 0.1 )
loss. backward( retain_graph= True )
print ( "w的梯度:" , w. grad)
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
opti. step( )
print ( "w:" , w)
w的梯度: tensor([1., 2.])
w: tensor([0.5000, 0.5000], requires_grad=True)
w: tensor([0.4900, 0.4800], requires_grad=True)
w: tensor([0.4790, 0.4580], requires_grad=True)
4.NTSCC
import torch
mask_BCHW = torch. randint( 0 , 1 , ( 3 , 5 ) )
mask_BCHW_byte = mask_BCHW. bool ( )
s_masked = torch. randn( 3 )
"""
torch.masked_select(s_masked,mask_BCHW_byte)
s_masked:待掩码的张量;
mask_BCHW_byte:掩码,需要转为bool(byte也可以)
"""
channel_input = torch. masked_select( s_masked, mask_BCHW_byte)
s_hat = torch. zeros_like( s_masked)
s_hat[ mask_BCHW] = channel_input
print ( f"mask_BCHW:\n { mask_BCHW} " )
print ( f"mask_BCHW_byte:\n { mask_BCHW_byte} " )
print ( f"s_masked:\n { s_masked} " )
print ( f"channel_input:\n { channel_input} " )
import torch
import numpy as np
a = np. sqrt( 10 ** ( 3 / 10 ) )
print ( a)
1.4125375446227544
import torch
import math
x = torch. randn( 3 , 2 , 1 , 1 )
x = torch. tensor( [ 4 , 8 ] , dtype= torch. int32)
x1 = torch. log( x) / math. log( 2 )
hx = torch. clamp_min( x1, 0 )
symbol_num = torch. sum ( hx, dim= 0 ) . flatten( 0 )
print ( f"x:\n { x} " )
print ( f"x1:\n { x1} " )
print ( f"hx:\n { hx} " )
print ( f"symbol_num:\n { symbol_num} " )
x:
tensor([4, 8], dtype=torch.int32)
x1:
tensor([2., 3.])
hx:
tensor([2., 3.])
symbol_num:
tensor([5.])
import numpy as np
a= torch. randn( 3 , 512 , 16 , 16 ) . chunk( 4 , 3 )
print ( a[ 0 ] . shape)
print ( a[ 1 ] . shape)
torch.Size([3, 512, 16, 4])
torch.Size([3, 512, 16, 4])
import torch
sorted_sequence = torch. tensor( [ [ 1 , 3 , 5 , 7 , 9 ] , [ 2 , 4 , 6 , 8 , 10 ] ] )
values = torch. tensor( [ [ 3 , 6 , 9 ] , [ 3 , 6 , 9 ] ] )
selected_sequence = torch. searchsorted( sorted_sequence, values)
print ( selected_sequence)
tensor([[1, 3, 4],
[1, 2, 4]])
mask = torch. arange( 0 , 32 )
mask1 = mask. repeat( 32 , 1 )
mask2 = mask1. repeat( 2 , 1 , 1 )
mask = torch. arange( 0 , 32 ) . repeat( 8 * 8 , 1 )
print ( mask)
print ( mask. shape)
a = torch. arange( 0 , 32 )
print ( a. shape)
tensor([[ 0, 1, 2, ..., 29, 30, 31],
[ 0, 1, 2, ..., 29, 30, 31],
[ 0, 1, 2, ..., 29, 30, 31],
...,
[ 0, 1, 2, ..., 29, 30, 31],
[ 0, 1, 2, ..., 29, 30, 31],
[ 0, 1, 2, ..., 29, 30, 31]])
torch.Size([64, 32])
torch.Size([32])
index = torch. ones( 64 , dtype = torch. long )
rate_choice_tensor = torch. tensor( [ 0 , 16 , 32 ] )
rate_constraint = rate_choice_tensor[ index]
print ( rate_constraint)
tensor([16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16])
x = torch. randn( 1 , 3 , 4 )
mask = x. byte( ) . to( bool )
mask1 = torch. masked_select( x, mask)
print ( x)
print ( mask)
print ( mask. shape)
print ( mask1. shape)
tensor([[[-0.5914, -0.4083, -0.2550, 0.5358],
[-1.7481, 0.3756, -0.1665, -0.2826],
[ 1.4188, 1.6289, -1.5177, 0.4359]]])
tensor([[[False, False, False, False],
[ True, False, False, False],
[ True, True, True, False]]])
torch.Size([1, 3, 4])
torch.Size([4])
import torch
from torch import nn
class MyModule ( nn. Module) :
def __init__ ( self, input_size, output_size) :
super ( MyModule, self) . __init__( )
self. test = torch. rand( input_size, output_size)
self. linear = nn. Linear( input_size, output_size)
def forward ( self, x) :
return self. linear( x)
model = MyModule( 4 , 2 )
print ( list ( model. named_parameters( ) ) )
[('linear.weight', Parameter containing:
tensor([[ 0.3464, -0.3051, -0.1750, 0.3745],
[ 0.1961, -0.2831, 0.1392, 0.3063]], requires_grad=True)), ('linear.bias', Parameter containing:
tensor([0.0186, 0.4188], requires_grad=True))]
x = torch. randn( 2 , 3 , 4 )
y = torch. round ( x)
print ( x)
print ( y)
tensor([[[-0.4185, 0.7974, -0.0894, 1.7687],
[ 1.1744, 0.6782, -0.4971, 0.5060],
[ 1.3180, 0.2855, 0.0362, 0.9105]],
[[ 0.5914, -0.0294, 0.5370, -0.9174],
[ 0.7989, -0.3448, 0.7094, 0.1814],
[ 1.1233, 0.4332, -1.7268, 0.4500]]])
tensor([[[-0., 1., -0., 2.],
[ 1., 1., -0., 1.],
[ 1., 0., 0., 1.]],
[[ 1., -0., 1., -1.],
[ 1., -0., 1., 0.],
[ 1., 0., -2., 0.]]])
rate_token= torch. randn( 3 , 3 )
idx= torch. tensor( [ 0 , 2 ] )
x_1= torch. index_select( rate_token, 0 , idx)
print ( f"rate_token:\n { rate_token} " )
print ( f"x_1:\n { x_1} " )
rate_token:
tensor([[ 0.2069, -1.4461, -0.6306],
[ 0.4353, -0.2097, -0.7552],
[ 0.2192, 0.5699, 0.0873]])
x_1:
tensor([[ 0.2069, -1.4461, -0.6306],
[ 0.2192, 0.5699, 0.0873]])
mask = torch. randint( 0 , 2 , ( 3 , 4 ) )
rate_constraint = torch. randint( 0 , 2 , ( 3 , 4 ) )
mask_new = torch. zeros_like( mask)
mask_new[ mask < rate_constraint] = 1
mask_new[ mask >= rate_constraint] = 0
print ( f"mask:\n { mask} " )
print ( f"rate_constraint:\n { rate_constraint} " )
print ( f"mask_new:\n { mask_new} " )
mask:
tensor([[1, 1, 0, 0],
[1, 0, 0, 1],
[1, 0, 1, 0]])
rate_constraint:
tensor([[1, 0, 1, 0],
[0, 0, 0, 0],
[1, 1, 1, 0]])
mask_new:
tensor([[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 1, 0, 0]])
a = torch. randint( 0 , 2 , ( 1 , 64 , 1 , 32 ) )
b = torch. randint( 2 , 4 , ( 1 , 64 , 32 , 32 ) )
c = torch. matmul( a, b)
print ( c. shape)
torch.Size([1, 64, 1, 32])
a = torch. randint( 0 , 2 , ( 1 , 64 , 1 , 32 ) )
a= a. squeeze( )
b = torch. randint( 2 , 4 , ( 1 , 64 , 32 ) )
c = a+ b
print ( a. shape)
print ( c. shape)
torch.Size([64, 32])
torch.Size([1, 64, 32])
mask_BCHW = torch. randint( 0 , 2 , ( 1 , 32 , 8 , 8 ) )
s_hat = torch. zeros_like( mask_BCHW)
y_sd = torch. randint( 0 , 2 , ( 1024 , ) )
s_hat[ mask_BCHW] = y_sd
print ( f"mask_BCHW:\n { mask_BCHW} " )
print ( f"y_sd:\n { y_sd. shape} " )
print ( f"s_hat:\n { s_hat} " )
5.Policy net
import torch
snr = torch. ones( 10 , 1 ) * 10
print ( snr)
tensor([[10.],
[10.],
[10.],
[10.],
[10.],
[10.],
[10.],
[10.],
[10.],
[10.]])
z = torch. randint( 1 , 5 , ( 2 , 3 ) )
z = z. to( torch. float32)
z1 = z. mean( ( - 1 ) )
z2 = z. mean( ( - 2 , - 1 ) )
print ( f"z:\n { z} " )
print ( f"z1:\n { z1} " )
print ( f"z2:\n { z2} " )
z:
tensor([[2., 3., 3.],
[2., 1., 1.]])
z1:
tensor([2.6667, 1.3333])
z2:
2.0
import torch. nn as nn
z = torch. randn( 2 , 5 )
soft = nn. functional. gumbel_softmax( z, 5 , dim= - 1 )
index = torch. zeros_like( soft)
index[ torch. arange( 0 , 2 ) , soft. argmax( - 1 ) ] = 1
print ( f"z:\n { z} " )
print ( f"soft:\n { soft} " )
print ( f"index:\n { index} " )
print ( f"soft.argmax(-1):\n { soft. argmax( - 1 ) } " )
z:
tensor([[ 0.1152, -0.8748, -0.3665, -1.4863, 0.7154],
[-1.0183, 0.8114, -0.9055, -0.5129, -0.6120]])
soft:
tensor([[0.1880, 0.1719, 0.1971, 0.1692, 0.2738],
[0.1328, 0.2628, 0.3199, 0.1417, 0.1428]])
index:
tensor([[0., 0., 0., 0., 1.],
[0., 0., 1., 0., 0.]])
soft.argmax(-1):
tensor([4, 2])
a= torch. tensor( [
[ 1 , 5 , 5 , 2 ] ,
[ 9 , - 6 , 2 , 8 ] ,
[ - 3 , 7 , - 9 , 1 ]
] )
b= a. argmax( dim= 0 )
c= a. argmax( dim= 1 )
print ( b)
print ( c)
print ( a. shape)
tensor([1, 2, 0, 1])
tensor([1, 0, 1])
torch.Size([3, 4])
z = torch. randn( 2 , 5 )
soft = nn. functional. gumbel_softmax( z, 5 , dim= - 1 )
h = soft
h = torch. flip( h, [ - 1 ] )
s = torch. cumsum( h, - 1 )
x = torch. flip( s, [ - 1 ] )
print ( f"z:\n { z} " )
print ( f"soft:\n { soft} " )
print ( f"h:\n { h} " )
print ( f"s:\n { s} " )
print ( f"x:\n { x} " )
z:
tensor([[ 0.6831, 0.3028, -0.4851, -0.6090, 0.8904],
[ 1.1903, 0.8956, -1.2509, -0.3563, -1.7219]])
soft:
tensor([[0.2491, 0.1865, 0.2170, 0.1678, 0.1794],
[0.2800, 0.2449, 0.1376, 0.1516, 0.1858]])
h:
tensor([[0.1794, 0.1678, 0.2170, 0.1865, 0.2491],
[0.1858, 0.1516, 0.1376, 0.2449, 0.2800]])
s:
tensor([[0.1794, 0.3473, 0.5643, 0.7509, 1.0000],
[0.1858, 0.3375, 0.4751, 0.7200, 1.0000]])
x:
tensor([[1.0000, 0.7509, 0.5643, 0.3473, 0.1794],
[1.0000, 0.7200, 0.4751, 0.3375, 0.1858]])
z = torch. randn( 2 , 5 )
soft = nn. functional. gumbel_softmax( z, 5 , dim= - 1 )
h = soft
h = torch. flip( h, [ 0 ] )
print ( f"z:\n { z} " )
print ( f"soft:\n { soft} " )
print ( f"h:\n { h} " )
z:
tensor([[-0.5672, -1.3687, -0.4187, 0.2370, -1.1392],
[ 0.4554, -0.0986, 0.1601, -0.9429, 0.0366]])
soft:
tensor([[0.2312, 0.2181, 0.2057, 0.1906, 0.1543],
[0.2791, 0.1794, 0.1821, 0.1342, 0.2253]])
h:
tensor([[0.2791, 0.1794, 0.1821, 0.1342, 0.2253],
[0.2312, 0.2181, 0.2057, 0.1906, 0.1543]])
latent = torch. randn( 1 , 2 , 3 )
latent_sum= torch. sqrt( ( latent** 2 ) . mean( ( - 2 , - 1 ) , keepdim= True ) )
b= torch. sqrt( ( latent** 2 ) . mean( ( - 2 , - 1 ) ) )
latent1 = latent / latent_sum
print ( f"latent:\n { latent} " )
print ( f"a:\n { latent_sum} " )
print ( f"b:\n { b} " )
print ( f"latent1:\n { latent1} " )
latent:
tensor([[[ 0.6348, 0.3374, -0.4481],
[ 1.0453, 0.0320, 1.4410]]])
a:
tensor([[[0.8050]]])
b:
tensor([0.8050])
latent1:
tensor([[[ 0.7886, 0.4191, -0.5567],
[ 1.2986, 0.0398, 1.7902]]])
mask = torch. zeros( 2 , 3 )
mask[ : , 1 : 3 ] = 1
nonzero_indices = mask. nonzero( )
num_nonzero_elements = nonzero_indices. size( 0 )
print ( nonzero_indices)
print ( nonzero_indices. shape)
print ( mask)
print ( num_nonzero_elements)
tensor([[0, 1],
[0, 2],
[1, 1],
[1, 2]])
torch.Size([4, 2])
tensor([[0., 1., 1.],
[0., 1., 1.]])
4
mask = torch. ones( 2 , 3 )
mask_sum = mask. sum ( ( - 2 , - 1 ) )
print ( mask_sum)
tensor(6.)
nonzero_indices = hard_mask. nonzero( )
num_nonzero_elements = nonzero_indices. size( 0 )
cbr = num_nonzero_elements* ( latent_res. size( - 1 ) ) / x. numel( ) / 2
count_sum = hard_mask. sum ( ( - 2 , - 1 ) )
cbr2 = count_sum* ( latent_res. size( - 1 ) ) / x. numel( ) / 2
3
epoch = 10
if epoch % 10 == 0 or epoch == 199 :
print ( "ok" )
ok
6.I++
embed_size= 256
image_dims= [ 32 , 32 ]
depth= [ 2 , 4 ]
embed_size = 256
window_size = 8
mlp_ratio = 4
n_adapt_embed = 2
max_trans_feat= 6
min_trans_feat = 1
unit_trans_feat = 4
n_patches = 64
n_feat= 48
n_trans_feat = 16
embed_dims= [ embed_size, embed_size]
threshold = 0.25
alpha = 2
min_clip = 0
max_clip = 10
import numpy as np
a = np. random. randn( 1 )
b = a[ 0 ]
print ( f"a= { a} " )
print ( type ( a) )
print ( type ( b) )
a=[0.70869371]
<class 'numpy.ndarray'>
<class 'numpy.float64'>
import torch
min_trans_feat= 5
max_trans_feat= 8
link_qual = 7.0
link_rng = 3.0
snr = link_qual + link_rng* np. random. randn( 1 ) [ 0 ]
bw = np. random. randint( min_trans_feat, max_trans_feat+ 1 )
adapt_embed = torch. from_numpy( np. array( [ snr, bw] ) ) . float ( )
print ( f"snr= { snr} { type ( snr) } " )
print ( f"bw= { bw} { type ( bw) } " )
print ( f"adapt_embed= { adapt_embed} { type ( adapt_embed) } " )
snr=6.635929147639401 <class 'numpy.float64'>
bw=7 <class 'int'>
adapt_embed=tensor([6.6359, 7.0000]) <class 'torch.Tensor'>
import torch. nn as nn
adapt_embed = torch. tensor( [ 6.6359 , 7.0000 ] )
n_adapt_embed = 2
print ( f"adapt_embed.unsqueeze(0)= { adapt_embed. unsqueeze( 0 ) } " )
adapt_embed = nn. Linear( 2 , n_adapt_embed) ( adapt_embed. unsqueeze( 0 ) )
print ( f"adapt_embed= { adapt_embed} { type ( adapt_embed) } " )
adapt_embed.unsqueeze(0)=tensor([[6.6359, 7.0000]])
adapt_embed=tensor([[-1.9270, 5.8020]], grad_fn=<AddmmBackward0>) <class 'torch.Tensor'>
x = torch. randn( 1 , 3 , 32 , 32 )
patch_size= 2
in_chans= 3
embed_dim= 256
norm_layer= None
proj = nn. Conv2d( in_chans, embed_dim, kernel_size= patch_size, stride= patch_size)
x_proj = proj( x)
x_flatten = x_proj. flatten( 2 )
x_tanspose = x_flatten. transpose( 1 , 2 )
x_out = nn. LayerNorm( embed_dim) ( x_tanspose)
print ( f"x= { x. shape} " )
print ( f"x_proj= { x_proj. shape} " )
print ( f"x_flatten= { x_flatten. shape} " )
print ( f"x_tanspose= { x_tanspose. shape} " )
print ( f"x_out= { x_out. shape} " )
x=torch.Size([1, 3, 32, 32])
x_proj=torch.Size([1, 256, 16, 16])
x_flatten=torch.Size([1, 256, 256])
x_tanspose=torch.Size([1, 256, 256])
x_out=torch.Size([1, 256, 256])
adapt_embed = torch. tensor( [ [ - 1.9270 , 5.8020 ] ] )
adapt_embed = adapt_embed. unsqueeze( 1 ) . repeat( 32 , 256 , 1 )
print ( f"adapt_embed= { adapt_embed. shape} " )
adapt_embed=torch.Size([32, 256, 2])
x = torch. randn( 1 , 3 , 32 , 32 )
x_unsqueeze = x. unsqueeze( 2 )
print ( f"x= { x. shape} " )
print ( f"x_unsqueeze= { x_unsqueeze. shape} " )
x=torch.Size([1, 3, 32, 32])
x_unsqueeze=torch.Size([1, 3, 1, 32, 32])
adapt_proj = nn. Linear( embed_dims[ 0 ] + n_adapt_embed, embed_dims[ 0 ] )
x = adapt_proj( ) ( )
images = torch. randn( 1 , 3 , 32 , 32 )
output = torch. randn( 1 , 3 , 32 , 32 )
weight = np. array( [ 1.0 for _ in range ( min_trans_feat, max_trans_feat+ 1 ) ] )
print ( weight)
loss = nn. MSELoss( ) ( output, images)
print ( loss)
[1. 1. 1. 1. 1. 1.]
tensor(1.9309)
from collections import OrderedDict
epoch_postfix = OrderedDict( )
epoch_postfix[ 'l2_loss' ] = '{:.4f}' . format ( loss. item( ) )
print ( epoch_postfix)
OrderedDict([('l2_loss', '1.9309')])
weight = np. array( [ 1.0 for _ in range ( 1 , 7 ) ] )
print ( weight)
print ( len ( weight) )
[1. 1. 1. 1. 1. 1.]
6
for i in range ( len ( weight) ) :
print ( i)
0
1
2
3
4
delta = np. array( [ 24.75 , 27.85 , 30.1526917 , 32.01 , 33.2777652 , 34.55393814 ] )
for i in range ( len ( delta) ) :
print ( i)
0
1
2
3
4
5