Apresentando um método para visualizar mapas de recursos e pesos de kernel
Ferramenta de visualização recomendada TensorBoard: você pode visualizar o fluxo de dados de todo o gráfico de cálculo, salvar informações de perdas, informações de precisão, etc.
Vídeo de aprendizagem:
Baixar código:
1. Documentos necessários
Os arquivos AlexNet.pth e resNet34.pth foram obtidos através de treinamento prévio
2. Etapas de operação
Matriz de recursos da camada intermediária do AlexNet
1. Defina um ponto de interrupção em out_put no arquivo analyze_feature_map.py e depure-o para visualizar as informações impressas pelo modelo de impressão.
2. Imprima duas estruturas de camadas: a primeira são os recursos e a segunda é o classificador, que corresponde à estrutura de camadas definida no arquivo alexnet_model.py, conforme mostrado na figura abaixo:
3. Defina um ponto de interrupção no for name, módulo em self.features.named_children(): linha do arquivo alexnet_model.py e execute-o passo a passo
Obtenha name = 0 e camada de convolução conv 2d e assim por diante.
4. Deixe o programa executar o loop for
Verifique out_put, que é uma lista.Existem três camadas no total, correspondendo às matrizes de recursos de saída da primeira, segunda e terceira camadas convolucionais.
5. Deixe o programa terminar a execução
(1) A saída é o mapa de recursos dos primeiros 12 canais da saída da matriz de recursos da primeira camada de convolução.
Podemos entender algumas das informações que a camada convolucional foca através do brilho do mapa de características. Quanto maior o brilho, mais interessante é a camada convolucional.
A imagem original é a seguinte:
(2) Saída da matriz de recursos da camada convolucional 2: O nível de abstração está cada vez mais alto e alguns núcleos de convolução não desempenham um papel.
A saída da matriz de recursos pela camada convolucional três
(3) A cor após a remoção de cmap='gray' é azul esverdeado
(4) Se você quiser ver mais informações, faça modificações durante o processo de propagação direta de alexnet_model.py
Se quiser ver a imagem da camada totalmente conectada, você também deve passar a imagem de entrada pela estrutura da camada de feições e depois pela camada totalmente conectada para visualizá-la.
Matriz de recursos da camada intermediária de resnet34
1. Modifique o código e defina um ponto de interrupção para depuração na figura abaixo
Você pode ver a estrutura da camada do resnet no terminal
2. Os resultados da execução são mostrados na figura
Obviamente, o resnet aprende mais informações do que o alexnet
Há duas razões: o resnet é realmente melhor que o alexnet
resnet usa o método de aprendizagem por transferência e o conjunto de dados de pré-treinamento é treinado usando o conjunto de dados imagenet.
3. A saída da matriz de recursos da camada 1 é obviamente muito melhor do que alexnet.Cada camada de recursos tem saída e é útil.
Parâmetros do kernel de convolução do AlexNet
1. Abra o arquivo analyze_kernel_weight.py
Aqui você pode carregar os pesos de treinamento diretamente através da função torch.load sem instanciar o modelo, pois após carregar através de torch.load, ele é do tipo dicionário, e sua chave representa o nome de cada estrutura de camada, e o valor correspondente é o nome de cada camada. informações de treinamento
2. Obtenha o dicionário de todos os parâmetros treináveis no modelo por meio da função model.state_dict e, a seguir, obtenha os nomes de todas as estruturas de camadas com parâmetros por meio do método de chaves.
Execute uma única etapa e observe pesos_keys
Conforme mostrado na figura abaixo,weights_keys é um conjunto ordenado de chaves, que são salvas na ordem do processo de propagação direta.
Regras de nomenclatura:
Somente camadas convolucionais como feature0, feature3, feature6, feature8 e feature10 possuem parâmetros de treinamento.
Não há função de ativação para função de ativação e redução da resolução do pool máximo.
3. Próxima travessiaweights_keys
A função model.state_dict obtém as informações do dicionário de todos os parâmetros treináveis no modelo. Passe a chave correspondente para obter as informações dos parâmetros e, em seguida, use o método numpy para converter as informações de peso em formato numpy para facilitar a análise.
Nota: A ordem dos canais do kernel de convolução é
kernel_number é o número de kernels de convolução, correspondendo à profundidade da matriz de recursos de saída.
profundidade do kernel de convolução kernel_channel, correspondente à profundidade da matriz de recursos de entrada
kernel_height, kernel_width, a altura e largura do kernel de convolução
4. Obtenha informações
# k = weight_t[0, :, :, :] # 通过切片的方式获得信息
# calculate mean, std, min, max 对所有卷积核的信息进行计算
weight_mean = weight_t.mean() #均值
weight_std = weight_t.std(ddof=1) #标准差
weight_min = weight_t.min() #最小值
weight_max = weight_t.max() #最大值
Distribuição dos valores do kernel de convolução correspondentes à primeira camada de convolução
A distribuição de vieses correspondentes a uma camada convolucional
Tudo na parte de trás é igual e não será mostrado.
Parâmetros do kernel de convolução do ResNet
1. Distribuição da primeira camada convolucional
2. Distribuição da camada bn, não há necessidade de usar viés ao usar bn
Peso é o parâmetro na figura abaixo
viés corresponde aos parâmetros da figura acima
média corresponde à média , que é obtida estatisticamente
A variância também é obtida estatisticamente
A saída subsequente tem a mesma estrutura.