1.首先阅读数据预处理的代码,确定送入神经网络的输入x的张量形状。比如现在有个语音输入特征张量x形状为[16, 1, 256, 40],【批量,通道数,像素宽度,特征维度】。
如果看不懂,可以先在网络的forward最开始进行print(x.shape)打印。
2.常见改变张量形状的方法:
(1)

#x形状为[16, 1, 256, 40]
x = x.view(x.size(0), x.size(1) * x.size(2), x.size(3))  #x形状为【16,1*256,40】即合并了中间两个维度,变为【16,256,40】
#另一种方法
x = x.reshape(x.size(0), -1, x.size(3))    #同样能合并了中间两个维度,变为【16,256,40】
x = x.permute(0, 2, 1)  #调整维度顺序,现在x形状为【批量,特征维度,像素宽度】

(2)

#x形状为[16, 2, 256, 40]
x = x[:, 0, :, :]#取第一个通道特征,x形状为【16,1,256,40】
x = x.squeeze(1)#删除值为1的维度,现在x形状为【16,256,40】
#另一种思路
x = torch.mean(x, axis=1, keepdims=True)

(3)

numpy数组调整顺序用的是 transpose(x,x,x)
torch张量调整顺序用的是 permute(x, x, x)

(4)特征融合

def extract_mbe(_y, _sr, _nfft, _nb_mel):
    spec = librosa.core.spectrum._spectrogram(y=_y, n_fft=_nfft, hop_length=_nfft//2, power=1)[0]
    mel_basis = librosa.filters.mel(sr=_sr, n_fft=_nfft, n_mels=_nb_mel)
    mel_spec = np.log(np.dot(mel_basis, spec).T)      #mel_spec形状为【T, _nb_mel】
    mfcc = librosa.feature.mfcc(y=_y, sr=_sr, n_mfcc=_nb_mel, n_fft=_nfft, hop_length=_nfft // 2)
    mfcc = mfcc.transpose(1, 0)      #mfcc形状为【T, _nb_mel】
    fused_features = np.concatenate((mel_spec, mfcc), axis=1)      #fused_features形状为【T, 2*_nb_mel】
    return fused_features
posted on 2023-07-05 11:56  孜孜不倦fly  阅读(52)  评论(0)    收藏  举报