43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
import numpy as np
|
|
import librosa
|
|
import os, copy
|
|
from scipy import signal
|
|
|
|
|
|
def get_positional_table(d_pos_vec, n_position=1024):
|
|
position_enc = np.array([
|
|
[pos / np.power(10000, 2*i/d_pos_vec) for i in range(d_pos_vec)]
|
|
if pos != 0 else np.zeros(d_pos_vec) for pos in range(n_position)])
|
|
|
|
position_enc[1:, 0::2] = np.sin(position_enc[1:, 0::2]) # dim 2i
|
|
position_enc[1:, 1::2] = np.cos(position_enc[1:, 1::2]) # dim 2i+1
|
|
return position_enc
|
|
|
|
def get_sinusoid_encoding_table(n_position, d_hid, padding_idx=None):
|
|
''' Sinusoid position encoding table '''
|
|
|
|
def cal_angle(position, hid_idx):
|
|
return position / np.power(10000, 2 * (hid_idx // 2) / d_hid)
|
|
|
|
def get_posi_angle_vec(position):
|
|
return [cal_angle(position, hid_j) for hid_j in range(d_hid)]
|
|
|
|
sinusoid_table = np.array([get_posi_angle_vec(pos_i) for pos_i in range(n_position)])
|
|
|
|
sinusoid_table[:, 0::2] = np.sin(sinusoid_table[:, 0::2]) # dim 2i
|
|
sinusoid_table[:, 1::2] = np.cos(sinusoid_table[:, 1::2]) # dim 2i+1
|
|
|
|
if padding_idx is not None:
|
|
# zero vector for padding dimension
|
|
sinusoid_table[padding_idx] = 0.
|
|
|
|
return sinusoid_table
|
|
|
|
def guided_attention(N, T, g=0.2):
|
|
'''Guided attention. Refer to page 3 on the paper.'''
|
|
W = np.zeros((N, T), dtype=np.float32)
|
|
for n_pos in range(W.shape[0]):
|
|
for t_pos in range(W.shape[1]):
|
|
W[n_pos, t_pos] = 1 - np.exp(-(t_pos / float(T) - n_pos / float(N)) ** 2 / (2 * g * g))
|
|
return W
|