Path: blob/master/site/pt-br/quantum/tutorials/mnist.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Classificação MNIST
Este tutorial cria uma rede neural quântica (QNN) para classificar uma versão simplificada do MNIST, semelhante à abordagem usada em Farhi et al. O desempenho da rede neural quântica nesse problema de dados clássicos é comparado a uma rede neural clássica.
Configuração
Instale o TensorFlow Quantum:
Agora importe o TensorFlow e as dependências de módulo:
1. Carregue os dados
Neste tutorial, você criará um classificador binário para distinguir entre os dígitos 3 e 6, seguindo Farhi et al. Esta seção abrange o tratamento de dados que:
Carrega os dados brutos do Keras.
Filtra o dataset para apenas 3s e 6s.
Reduz a escala das imagens para que caibam em um computador quântico.
Remove qualquer exemplo contraditório.
Converte as imagens binárias em circuitos Cirq.
Converte os circuitos Cirq em circuitos do TensorFlow Quantum.
1.1 Carregue os dados brutos
Carregue o dataset MNIST distribuído com o Keras.
Filtre o dataset para manter apenas 3s e 6s, removendo as outras classes. Ao mesmo tempo, converta o rótulo, y
, para booleano: True
para 3
e False
para 6.
Mostre o primeiro exemplo:
1.2 Reduza a escala das imagens
Um tamanho de imagem 28 x 28 é muito grande para os computadores quânticos atuais. Redimensione a imagem para 4 x 4:
Novamente, exiba o primeiro exemplo de treinamento, após redimensionar:
1.3 Remova exemplos contraditórios
Na seção 3.3 Learning to Distinguish Digits (Aprendendo a distinguir dígitos) de Farhi et al., filtre o dataset para remover imagens rotuladas como pertencentes a ambas as classes.
Esse não é um procedimento de aprendizado de máquina padrão, mas foi incluído a fim de seguir o artigo.
Os números resultantes não coincidem muito com os valores relatados, mas o procedimento exato não é especificado.
Também vale a pena destacar que a filtração de exemplos contraditórios nesse ponto não evita completamente que o modelo receba exemplos de treinamento contraditórios: o próximo passo binariza os dados, o que causará ainda mais colisões.
1.4 Codifique os dados como circuitos quânticos
Para processar as imagens usando um computador quântico, Farhi et al. propõem representar cada pixel com um qubit, com o estado dependendo do valor do pixel. O primeiro passo é convertê-lo a um formato binário.
Se você removesse as imagens contraditórias nesse ponto, ficaria com apenas 193, o que provavelmente não é o suficiente para um treinamento eficaz.
Os qubits nos índices dos pixels com valores que excedem um limite são rotacionados através de uma porta .
Aqui está o circuito criado para o primeiro exemplo (os diagramas do circuito não mostram qubits com nenhuma porta):
Compare esse circuito aos índices em que o valor da imagem ultrapassa o limite:
Converta esses circuitos do Cirq
em tensores para o tfq
:
2. Rede neural quântica
Há pouca orientação para uma estrutura de circuito quântico que classifica imagens. Como a classificação é baseada no valor esperado do qubit de leitura, Farhi et al. propõem usar duas portas de qubits, sempre agindo no qubit de leitura. Em alguns aspectos, isso se assemelha à execução de uma RNN unitária pequena nos pixels.
2.1 Crie o circuito do modelo
O exemplo a seguir mostra essa abordagem em camadas. Cada camada usa instâncias n da mesma porta, com cada qubit de dados agindo no qubit de leitura.
Comece com uma classe simples que adicionará uma camada dessas portas a um circuito:
Crie uma camada do circuito de exemplo para ver como fica:
Agora crie um modelo de duas camadas, correspondendo ao tamanho do circuito de dados, e inclua as operações de preparação e leitura.
2.2 Envolva o circuito do modelo em um modelo tfq-keras
Crie o modelo Keras com os componentes quânticos. Esse modelo é alimentado com os "dados quânticos", de x_train_circ
, que codifica os dados clássicos. Ele usa uma camada de Circuito Quântico Parametrizado, tfq.layers.PQC
, para treinar o circuito do modelo, com os dados quânticos
Para classificar essas imagens, Farhi et al. sugerem obter o valor esperado de um qubit de leitura em um circuito parametrizado, que fica entre 1 e -1.
Em seguida, descreva o processo de treinamento do modelo, usando o método compile
.
Como a leitura esperada está no intervalo [-1,1]
, a otimização da perda de articulação é uma opção um tanto natural.
Observação: outra abordagem válida seria mudar o intervalo de saída para [0,1]
e tratá-lo como a probabilidade que o modelo atribui à classe 3
. Isso pode ser usado com uma perda tf.losses.BinaryCrossentropy
padrão.
Para usar a perda de articulação aqui, você precisa fazer dois pequenos ajustes. Primeiro, converta os rótulos, y_train_nocon
, de booleano para [-1,1]
, conforme esperado pela perda de articulação.
Segundo, use uma métrica hinge_accuracy
personalizada que lida com [-1, 1]
corretamente como o argumento dos rótulos y_true
. tf.losses.BinaryAccuracy(threshold=0.0)
espera que y_true
seja um booleano, e ele não pode ser usado com a perda de articulação).
Treine o modelo quântico
Agora treine o modelo, o que leva cerca de 45 minutos. Se você não quiser esperar tudo isso, use um subconjunto menor de dados (defina NUM_EXAMPLES=500
, abaixo). Isso não afeta o progresso do modelo durante o treinamento (ele só tem 32 parâmetros e não precisa de muitos dados para restringi-los). O uso de menos exemplos só acaba o treinamento mais cedo (5 minutos), mas é executado por tempo suficiente para mostrar que está fazendo progresso nos logs de validação.
O treinamento desse modelo até a convergência deve alcançar uma exatidão >85% no dataset de teste.
Observação: a exatidão do treinamento informa a média durante a época. A exatidão da validação é avaliada ao final de cada época.
3. Rede neural clássica
Enquanto a rede neural quântica funciona com esse problema MNIST simplificado, uma rede neural clássica básica pode facilmente superar uma QNN nessa tarefa. Depois de uma única época, uma rede neural clássica consegue alcançar uma exatidão >98% no set de holdout.
No exemplo a seguir, é usada uma rede neural clássica para o problema de classificação 3-6 com a imagem 28 x 28 inteira, em vez de fazer a subamostragem da imagem. Isso facilmente converge para uma exatidão de quase 100% no dataset de teste.
O modelo acima tem quase 1,2 milhão de parâmetros. Para uma comparação mais justa, tente usar um modelo de 37 parâmetros, nas imagens de subamostragem:
4. Comparação
Uma entrada de resolução mais alta e um modelo mais avançado facilita esse problema para a CNN, enquanto um modelo clássico de poder semelhante (cerca de 32 parâmetros) treina com uma exatidão parecida em uma fração do tempo. De qualquer maneira, a rede neural clássica supera facilmente a rede neural quântica. Para dados clássicos, é difícil superar uma rede neural clássica.