Usando PCA em um conjunto de dados de imagem antes da classificação com uma rede neural

7

Eu tenho uma matriz de dados de imagem que é o número de exemplos de imagens é o número de pixels da imagem: , porque cada imagem é uma imagem 3 canais . Além disso, cada uma das 50000 imagens pertence a 1 de 10 classes possíveis. Ou seja, existem 5000 imagens da classe ' ', 5000 imagens, da classe ' ', etc ... e há 10 classes no total. Isso faz parte do conjunto de dados CIFAR-10.XN x pN=50000p=3072p=3072=32×32×332×32carbird

O objetivo final aqui é executar a classificação nesse conjunto de dados. Para esse fim, o professor mencionou para testar o PCA e, em seguida, colocar esses recursos em um classificador. Como meu classificador, estou usando uma rede neural totalmente conectada com uma camada oculta e uma saída softmax.

Meu problema é que acredito que fiz o PCA da maneira correta , mas acho que meu caminho pode ser mal aplicado .

Isto é o que eu fiz:

Para calcular o PCA dos meus dados, foi o que fiz até agora:

Primeiro, eu calculo a imagem média . Vamos ser o 'ésima linha de . Então,μ1xpxnnX

μ=1Nn=1Nxn

Calcular a matriz de covariância dos meus dados de imagem:Cpxp

C=1N1(Xμ)T(Xμ)

Execute uma decomposição de vetor próprio de , produzindo , e , em que a matriz codifica as principais direções (vetores próprios) como colunas. (Além disso, suponha que os valores próprios já estejam classificados em ordem decrescente). Portanto:CUSVU

[U,S,V]=eig(C)

Finalmente, execute o PCA: ou seja, calcule uma nova matriz de dados , em que é o número de componentes principais que desejamos ter. Deixe - ou seja, uma matriz com apenas as primeiras colunas. Portanto:PNxkkUkpxkk

P=XUk

A questão:

Acho que meu método de executar o PCA nesses dados é mal aplicado, porque da maneira que o fiz, basicamente acabo correlacionando meus pixels um do outro. (Suponha que eu tenha definido ). Ou seja, as linhas resultantes de parecem mais ou menos ruído. Sendo assim, minhas perguntas são as seguintes:k=pP

  • Realmente desassociei os pixels? Ou seja, removi de fato qualquer acoplamento entre pixels que um classificador em perspectiva esperava usar?
  • Se a resposta acima for verdadeira, por que faríamos o PCA dessa maneira?
  • Finalmente, relacionado ao último ponto, como faríamos a redução da dimensionalidade via PCA nas imagens, se, de fato, o método que eu usei errado?

EDITAR:

Depois de estudar mais e receber muitos comentários, refinei minha pergunta para: Se alguém usasse o PCA como uma etapa de pré-processamento para classificação de imagens, é melhor:

  • Executar classificação nos k componentes principais das imagens? (Matriz acima, agora cada imagem tem o comprimento vez do original )Xnew=XUkkp
  • OU é melhor executar a classificação nas imagens reconstruídas dos vetores k- (que serão então , portanto, embora cada imagem AINDA tenha o tamanho original de , era de fato reconstruído a partir de autovetores).Xnew=XUkUkTpk

Empiricamente, eu descobri que a precisão da validação sem PCA> precisão de validação com reconstrução de PCA> precisão de validação com PCs de PCA.

As imagens abaixo mostram isso na mesma ordem. 0,5> 0,41> 0,31 precisão de validação.

Treinamento em imagens em pixels brutos de comprimento :p

insira a descrição da imagem aqui

Treinamento em imagens de comprimento mas reconstruídas com k = 20 vetores próprios:p

insira a descrição da imagem aqui

E, finalmente, o treinamento sobre os principais componentes $ k = 20 *:

insira a descrição da imagem aqui

Tudo isso tem sido muito esclarecedor. Como descobri, o PCA não garante que os principais componentes facilitem a demarcação entre diferentes classes. Isso ocorre porque os eixos principais calculados são eixos que apenas tentam maximizar a energia da projeção em todas as imagens, independente da classe de imagem. Por outro lado, imagens reais - reconstruídas fielmente ou não, ainda mantêm algum aspecto de diferenças espaciais que podem ir - ou deveriam ir - para tornar possível a classificação.

Spacey
fonte
11
@amoeba Sim, usei um NN totalmente conectado como classificador. A entrada era o conjunto de dados NxP original ou o conjunto de dados NxK. Sendo tudo o mesmo, o primeiro funcionou muito bem, o último não aprendeu nada.
Spacey
11
@amoeba Desculpe, deixe-me esclarecer: no experimento original, eu treino todas as imagens, no espaço original. Ou seja, X = matriz NxP, N é o número de imagens e P é o número de pixels por imagem. No segundo experimento, eu treino em X_new, que é uma matriz NxK, em que cada linha tem K componentes principais - isto é, os coeficientes de base k de cada imagem. (X_novo = X * U [0: k]). No presente caso, nenhuma aprendizagem ocorre.
Spacey
11
@amoeba Então, no meu experimento, usei K = 10, 50 e até 100. FYI, no conjunto de dados CIFAR-10, a maior parte da energia estava contida no topo, por exemplo, 50 vetores de autogênio. (Eu fui até k = 3072 = P e ainda não aprendi nada). (Lembre-se de que isso foi feito com base nos próprios coeficientes. Se, por outro lado, reconstruísse as imagens de K = 50 autovetores, ou seja, X_new = X * U [0: k = 50] * U [0 : k = 50] .T, então eu obtenho resultados muito razoáveis).
Spacey
11
@amoeba Sim, eu tenho um conjunto de testes intocados que é executado no final no NN aprendido. O pré-processamento das imagens é um simples significado de cada recurso. (pixel). Fiz o mesmo pré-processamento e as mesmas estatísticas antes e depois dos PCs. Bem, deixe-me fazer o seguinte: voltarei ao código, execute novamente e publique novamente minhas descobertas. Vou fazer ping quando você fizer isso.
Spacey
2
Insisto que isso não é confirmado pelos links que forneci. Os links dizem que 50 PCs não separam necessariamente as classes, nem todas as dimensões 3072; está correto. Mas 50 PCs e 3072 dimensões reconstruídas dos 50 PCs separam as classes exatamente na mesma extensão . É um fato matemático simples. Você pode levar o NN treinado em reconstruções e transformá-lo manualmente em NN trabalhando em PCs, e ele funcionará de maneira idêntica. Não sei explicar por que sua rede funciona melhor com as reconstruções.
Ameba

Respostas:

1

Eu concordo com todos os comentários de @amoeba. Mas adicionaria algumas coisas.

O motivo pelo qual o PCA é usado nas imagens é porque ele funciona como 'seleção de recurso': os objetos abrangem vários pixels, portanto, alterações correlatas em vários pixels são indicativas de objetos. Jogar fora as alterações não correlacionadas dos pixels está se livrando do "ruído" que pode levar a uma generalização ruim.

Em geral, nns (usando descida gradiente) se saem melhor com entradas esféricas (ou seja, entradas normalizadas não correlacionadas), isso ocorre porque sua superfície de erro será mais simétrica e, portanto, a taxa de aprendizado único funciona melhor (você precisa de uma taxa de aprendizado pequena em locais altamente curvos). direções e uma grande taxa de aprendizado em direções rasas).

Você normalizou suas entradas (boas) também ou apenas se correlacionou?

Você usou a regularização de l2? Isso tem um efeito semelhante à regularização do PCA. Para entradas correlacionadas, enfatiza pequenos pesos semelhantes (ou seja, calcular a média do ruído, penalizar grandes pesos para que pixels únicos não possam ter um efeito desproporcional na classificação) (consulte, por exemplo, elementos do livro de aprendizado estatístico), então talvez você não tenha beneficiado o PCA porque o l2 a regularização já era eficaz. Ou talvez o nn fosse pequeno demais para se ajustar demais.

Por fim, você re-otimizou os parâmetros ... Eu esperaria que você precisasse de uma taxa de aprendizado diferente e de outros parâmetros depois de mudar para os primeiros k componentes principais.

seanv507
fonte
0

Por definição, o PCA remove a correlação entre variáveis. É usado antes da classificação porque nem todos os classificadores podem lidar bem com dados de alta dimensão (mas as redes neurais podem) e nem todos os classificadores podem lidar bem com variáveis ​​correlacionadas (mas as redes neurais podem). Especialmente com imagens, você normalmente não deseja remover a correlação e também deseja várias camadas, para que os pixels vizinhos possam ser agregados aos recursos da imagem. Seus resultados experimentais refletem a má escolha desta técnica para esta tarefa específica.

David Ernst
fonte
0

Se suas imagens (as imagens que você vetorizou para que cada imagem agora seja uma única linha com M colunas em que M é o número total de pixels x 32 x 32 x 3) contenham pouca ou nenhuma correlação, o número de componentes principais necessários para explique a maioria das variações (> 95%, por exemplo) nos seus aumentos de dados. Para determinar como o PCA é "viável", verificar a variação explicada é uma boa idéia. No seu caso, como sua matriz de dados tem um tamanho de NxM, em que M> N, o número máximo de componentes é N. Se o número de PCs necessários for próximo de 50000, o uso do PCA não fará sentido. Você pode calcular a variação explicada por:

explained variance = 
sum of the eigenvalues that correspond to the PCs you use / 
sum of ALL eigenvalues

Eu escolheria o número de componentes principais que explica pelo menos mais de 90% de variação. Outro método para escolher o número correto de PCs é desenhar o número de PCs versus o gráfico de variância acumulada explicada. No gráfico, você pode escolher o número em que a variação explicada não aumenta mais significativamente.

Portanto, acho que seu problema pode estar na escolha de um bom número de PCs.

Outro problema pode estar relacionado à projeção das amostras de teste. Ao dividir suas amostras para construir o NN e testar o NN, é necessário projetar o conjunto de dados de teste usando os vetores próprios obtidos a partir do conjunto de dados de treinamento.

theGD
fonte