本文主要是介绍神经网络中间层特征图可视化(输入为音频)(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
相比方法一个人感觉这种方法更好
import librosa
import numpy as np
import utils
import torch
import matplotlib.pyplot as pltclass Hook:def __init__(self):self.features = Nonedef hook_fn(self, module, input, output):self.features = output# 创建钩子的实例
hook = Hook()device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
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)return mel_spec #最后必须是[frames, dimensions]def preprocess_data(X, seq_len, nb_ch):# split into sequencesX = utils.split_in_seqs(X, seq_len)X = utils.split_multi_channels(X, nb_ch)# Convert to PyTorch tensorsX = torch.Tensor(X)X = X.permute(0,1,3,2) #x形状为[709,2,40,256],【总样本数,通道数,特征维度,像素宽度】return X# 提取梅尔频谱特征
audio_path = "a011.wav"
y, sr = librosa.load(audio_path, sr=44100)
mel = extract_mbe(y, sr, 2048, 64)value = preprocess_data(mel, 256, 1).to(device) #value 为输入模型的样本特征model = torch.load(f'best_model_2.pth')# 将钩子注册到需要的层
model.cnn1.register_forward_hook(hook.hook_fn)# 假设`input_data`是你的输入张量
output = model(value)# 访问存储的特征
retnet_features = hook.features
#print(retnet_features.shape)
# 可视化特征(假设retnet_features是一个张量)
retnet_features = retnet_features.permute(0, 2, 1, 3)
#retnet_features = retnet_features.transpose(1, 2)
#print(retnet_features.shape)
retnet_features = torch.cat([retnet_features[i] for i in range(10)], dim=2)
#print(retnet_features.shape)# 可视化批次中第一个样本的特定通道
plt.imshow(retnet_features.sum(1).detach().cpu().numpy(), cmap='viridis', origin='lower') #[高,通道, 宽]
# plt.imshow(retnet_features.detach().cpu().numpy(), cmap='viridis', origin='lower') #[高,宽]
plt.show()
这篇关于神经网络中间层特征图可视化(输入为音频)(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!