CNTK avaliar camadas ocultas
Esta página descreve como expor os valores de uma camada escondida de um modelo treinado.
Descrição Geral
Um CNTK modelo é construído sobre camadas interligadas. Algumas destas camadas podem ser avaliadas usando a EvalDll
porque são marcadas como camadas de "saída". Para expor outras camadas através da EvalDll
, estas camadas devem ser marcadas como camadas de saída adicionando-as à outputNodes
propriedade.
Por exemplo, o 01_OneHidden_ndl_deprecated.cntk
ficheiro de configuração refere-se ao 01_OneHidden.ndl
ficheiro para a definição de rede. Neste ficheiro de descrição da rede, temos duas camadas definidas:
h1 = DNNSigmoidLayer (featDim, hiddenDim, featScaled, 1)
ol = DNNLayer (hiddenDim, labelDim, h1, 1)
Mas apenas uma camada é marcada como uma saída:
outputNodes = (ol)
Assim, o EvalDll
só devolverá os valores relativos à camada durante a ol
avaliação.
Para podermos avaliar a h1
camada escondida, precisamos expô-la primeiro como um nó de saída. Há três maneiras possíveis:
1. Formação modelo com camadas escondidas expostas
Para desaudá-la h1
, basta adicioná-la como uma saída na descrição da rede (01_OneHidden.bs
ficheiro) ao treiná-la, e essa camada estaria disponível para leitura durante a avaliação:
outputNodes = (h1:ol)
No entanto, isto implica que o modelo teria de ser (re)treinado com esta configuração.
2. Modificação de um modelo já treinado
Os modelos podem ser modificados em voo quando são carregados usando expressões BrainScript. Isto será documentado numa futura atualização desta documentação.
3. Alteração do conjunto de nós de saída de um modelo já treinado enquanto o carrega para avaliação utilizando os EvalDll
/EvalDllWrapper
módulos
Se um treinado for avaliado usando os EvalDll
/EvalDllWrapper
módulos, pode adicionar a outputNodeNames
propriedade com uma lista de nó separados do cólon à definição de rede:
outputNodeNames = "h1.z:ol.z"
Ao carregar a rede, o motor Eval reconhecerá a outputNodeNames
propriedade e substituirá os nós de saída do modelo pela lista de nós especificados na outputNodeNames
propriedade.
Olhando para o código dentro do CPPEvalClient
projeto exemplo, mostra a linha (não comentada) especificando o outputNodeNames
imóvel:
networkConfiguration += "outputNodeNames=\"h1.z:ol.z\"\n";
networkConfiguration += "modelPath=\"" + modelFilePath + "\"";
model->CreateNetwork(networkConfiguration);
A execução do programa mostra a saída correspondente para a h1.z
camada.