% Cargar los datos de audio
load('songs.mat'); % songs es una matriz de 1000 x 660000 que contiene los datos de audio de 1000 canciones
load('labels.mat'); % labels es un vector de 1000 x 1 que contiene las etiquetas de los géneros de las canciones
% Dividir los datos en conjuntos de entrenamiento, validación y prueba
[trainData, valData, testData, trainLabels, valLabels, testLabels] = splitData(songs, labels);
% Convertir los datos de audio en espectrogramas
trainSpec = audio2spec(trainData); % trainSpec es una matriz de 100 x 128 x 1292 x 4 que contiene los espectrogramas de las canciones de entrenamiento
valSpec = audio2spec(valData); % valSpec es una matriz de 100 x 128 x 1292 x 4 que contiene los espectrogramas de las canciones de validación
testSpec = audio2spec(testData); % testSpec es una matriz de 100 x 128 x 1292 x 4 que contiene los espectrogramas de las canciones de prueba
% Definir la arquitectura de la red neuronal convolucional
layers = [
imageInputLayer([128 1292 4]) % capa de entrada que acepta imágenes de 128 x 1292 x 4
convolution2dLayer(3,16,'Padding','same') % capa convolucional con 16 filtros de 3 x 3 y relleno
batchNormalizationLayer % capa de normalización por lotes para acelerar el entrenamiento
reluLayer % capa de activación ReLU
maxPooling2dLayer(2,'Stride',2) % capa de agrupación máxima con tamaño de 2 x 2 y paso de 2
convolution2dLayer(3,32,'Padding','same') % capa convolucional con 32 filtros de 3 x 3 y relleno
batchNormalizationLayer % capa de normalización por lotes
reluLayer % capa de activación ReLU
maxPooling2dLayer(2,'Stride',2) % capa de agrupación máxima con tamaño de 2 x 2 y paso de 2
convolution2dLayer(3,64,'Padding','same') % capa convolucional con 64 filtros de 3 x 3 y relleno
batchNormalizationLayer % capa de normalización por lotes
reluLayer % capa de activación ReLU
maxPooling2dLayer(2,'Stride',2) % capa de agrupación máxima con tamaño de 2 x 2 y paso de 2
fullyConnectedLayer(4) % capa totalmente conectada con 4 neuronas de salida
softmaxLayer % capa softmax para calcular las probabilidades de cada clase
classificationLayer % capa de clasificación que calcula la pérdida y el error
];
% Definir las opciones de entrenamiento
options = trainingOptions('sgdm', ... % usar el método de descenso de gradiente estocástico con momento
'MaxEpochs',20, ... % entrenar por 20 épocas
'InitialLearnRate',0.01, ... % usar una tasa de aprendizaje inicial de 0.01
'ValidationData',{valSpec,valLabels}, ... % usar los datos de validación para monitorear el rendimiento
'ValidationFrequency',30, ... % validar cada 30 iteraciones
'Verbose',false, ... % no mostrar el progreso del entrenamiento
'Plots','training-progress'); % mostrar las gráficas del progreso del entrenamiento
% Entrenar la red neuronal convolucional
net = trainNetwork(trainSpec,trainLabels,layers,options); % net es un objeto DAGNetwork que contiene la red entrenada
% Evaluar el rendimiento de la red en el conjunto de prueba
predLabels = classify(net,testSpec); % predLabels es un vector de 100 x 1 que contiene las etiquetas predichas por la red
accuracy = mean(predLabels == testLabels); % accuracy es un escalar que representa la precisión de la red en el conjunto de prueba
disp(['La precisión de la red es: ', num2str(accuracy)]); % mostrar la precisión de la red