Como decidir a forma dos recursos de entrada, quando cada arquivo de dados tem tamanho diferente?

7

Para me ajudar a entender os benefícios e deficiências de decision trees, KNN, Neural Networks, eu queria construir um classificador simples que classifica em 2 classes ( Bird Sounde Non-Bird Sound) usando todos os itens acima 3 métodos. Então, eu baixei um conjunto de dados de som de Kaggle e estava explorando pysoundfile como um módulo para ler o arquivo de som. Portanto, o seguinte esboço:

data, samplerate = sf.read('xc94652.flac')

retorna um ndarray numpy. Os shapedados variam de acordo com cada arquivo, sendo alguns deles (8637686,)e outros (3227894,). Como cada arquivo tem tamanho diferente, o formato datavaria de acordo com cada arquivo. Quais são algumas maneiras pelas quais eu posso fazer a forma de dataigual? Eu estava planejando ter o formato dos dados definido no menor tamanho possível de todos os arquivos. Mas definitivamente não faz justiça ao conjunto de dados do arquivo de som. Eu poderia perder tantos recursos e a precisão do modelo no final.

Suhail Gupta
fonte

Respostas:

2

Exploração de dados

Eu sugeriria explorar os dados um pouco mais, o que pode ajudar a decidir qual seria a melhor abordagem para esse conjunto de dados de canções de pássaros.

Por exemplo, dê uma olhada no espectrograma de cada ave (existem apenas 66 tipos de gêneros diferentes), para ver como você pode extrair mais dados das amostras. Aqui está o espectrograma de uma amostra retirada daqui :

espectrograma de chamada de pássaro

Podemos ver que há claramente um padrão repetitivo! Podemos ver aqueles altos blocos verdes claros aparecendo intermitentemente por toda parte. Portanto, embora a amostra tenha pouco mais de 70 segundos de som, a chamada do pássaro parece durar apenas cerca de 2 segundos!

Com um algoritmo de filtragem simples ou até mesmo a construção de um modelo para encontrar esses pedaços, você pode extrair esses pedaços e trabalhar apenas neles, talvez junto com os dados referentes às lacunas entre esses pedaços.

Esse é apenas um exemplo de pré-processamento específico de dados; Estou certo de que existem muitas outras maneiras de melhorar a densidade de informações.

Taxa de amostragem

Esse é outro grau de liberdade que você pode ver. Uma idéia seria aceitar amostras diferentes dentro da sua entrada para um modelo. Pode-se ajustar a taxa de amostragem para garantir que todas as amostras finais tenham o mesmo comprimento.

Minha idéia seria usar o tamanho da amostra mais curta e, em seguida, realizar amostragens regulares de todos os trechos de som mais longos, de modo que os trechos resultantes tenham o mesmo tamanho da sua amostra mais curta.

Esse método obviamente comprometerá a qualidade dos dados (irregularmente entre as amostras), mas se o amostrador inicial for suficientemente alto, você poderá se safar!

Dê uma olhada neste artigo útil que descreve muitos métodos em (pré-processamento) ondas sonoras.

Dois modelos

No seu caso particular, se você realmente tiver apenas dois comprimentos possíveis: 8637686e 3227894... pode ser viável criar dois modelos, um para cada comprimento de amostra. Definitivamente, não é uma solução ideal; no entanto, permitiria um desenvolvimento muito rápido e iterações de modelo, pois você poderia usar o mesmo modelo e precisaria alterar apenas o parâmetro para usar as duas partes dos dados.

Fundamentos

Além de truncar suas amostras mais longas (cortando-as para corresponder ao comprimento das amostras mais curtas / mais curtas - você pode usar o preenchimento para simplificar as amostras em curto para que correspondam ao comprimento da amostra mais longa.

Normalmente, isso é feito simplesmente adicionando zeros ao final dos vetores. Você também pode tentar adicionar zeros no início e no final para manter as informações centralizadas em cada amostra.

Se você criar uma rede neural usando o Keras, provavelmente seria melhor olhar primeiro para a camada ZeroPadding1d .

n1k31t4
fonte