---
# System prepended metadata

title: TensorFlow no Jupyter (com notebooks)
tags: [Jupyter, TensorFlow, Tutorial]

---

# TensorFlow no Jupyter (com notebooks)

> Publicado em 13 de Setembro de 2016

###### tags: `TensorFlow` `Jupyter` `Tutorial`


Esse tutorial é sobre o TensorFlow no Jupyter. A princípio, esse projeto pode ser usado para instalar automaticamente o Jupyter Notebook configurado com TensorFlow 0.10 e alguns notebooks de exemplo (tutoriais do TensorFlow). Outro objetivo é servir como base para criação de configurações customizadas isoladas (exemplo um ambiente extra para testar com TensorFlow GPU Python 3 com CUDA 8). O Jupyter é uma ferramenta excelente para testar ideias e prototipar rapidamente com TensorFlow.

**Projeto**

https://github.com/cirocavani/tensorflow-jupyter


Esse artigo consiste em:

1. o procedimento de instalação básico
2. a descrição dos notebooks de exemplo
3. a explicação de como funciona a instalação

## Instalação

    git clone https://github.com/cirocavani/tensorflow-jupyter.git
    cd tensorflow-jupyter

    #bin/setup-linux
    bin/setup-mac

Comandos:

    bin/jupyter

Inicializa o Jupyter que já tem o kernel do TensorFlow configurado.

Acesso em [http://localhost:8888/](http://localhost:8888/).


    bin/tensorboard

Inicializa a ferramenta de visualização do TensorFlow, mostra grafo de execução, valores de medições do treinamento.

Acesso em [http://localhost:6006/](http://localhost:6006/).


## Notebooks Exemplo

Os notebooks exemplo são baseados nos tutorias disponiveis no site do TensorFlow. Os tutoriais originais estão referenciados no início do notebook. O código de alguns tutoriais foi alterado para usar algumas funcionalidades mais "reais" (por exemplo: leitura de CSV em batch).


**0 - First Run**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/00%20-%20First%20Run.ipynb)

Hello World com TensorFlow.


**1 - Linear Regression**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/01%20-%20Linear%20Regression.ipynb)

Nesse exemplo, é feito uma regressão linear para o fit de uma reta em dados gerados sinteticamente pela função y = 0.1x + 0.3, ou seja, o TensorFlow aprende os parâmetros 0.1 e 0.3 de um dataset ruidoso.


**2 - MNIST, Softmax Regression**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/02%20-%20MNIST%2C%20Softmax%20Regression.ipynb)

Nesse exemplo, é feito um classificador com uma regressão softmax para identificação de dígitos 0-9 em uma imagem. Dado na entrada uma imagem de 28x28 pixels de um dígito manuscrito, o classificador retorna 10 valores, cada um indicando a "probabilidade" de ser um dos dígitos que a variável representa. A acurácia é de 92%.


**3 - MNIST, Convolutional Network**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/03%20-%20MNIST%2C%20Convolutional%20Network.ipynb)

Nesse exemplo, é feito um classificador com uma rede neural convolutiva para identificação de dígitos 0-9 em uma imagem. Dado na entrada uma imagem de 28x28 pixels de um dígito manuscrito, o classificador retorna 10 valores, cada um indicando a "probabilidade" de ser um dos dígitos que a variável representa. A acurácia é de 99%.

A rede é formada por duas camadas de convolução, uma camada toda conectada, uma camada de dropout e uma camada de regressão softmax.


**4 - MNIST, Feed-forward NN with Log**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/04%20-%20MNIST%2C%20Feed-forward%20NN%20with%20Log.ipynb)

Nesse exemplo, é feito um classificador com uma rede neural feed-forward para identificação de dígitos 0-9 em uma imagem. Dado na entrada uma imagem de 28x28 pixels de um dígito manuscrito, o classificador retorna 10 valores, cada um indicando a "probabilidade" de ser um dos dígitos que a variável representa. A acurácia é de 99%.

A rede é formada por duas camadas toda conectada e uma camada de regressão softmax.

O modelo treinado nesse notebook pode ser visualizado no TensorBoard.


**5 - Iris, DNN Classifier (tf.contrib.learn)**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/05%20-%20Iris%2C%20DNN%20Classifier%20%28tf.contrib.learn%29.ipynb)

Nesse exemplo, é feito um classificador com uma rede neural para classificação de 3 espécies de flor. Dada na entrada as medidas da sépala e da pétala, o classificador retorna a espécie 0 setosa, 1 versicolor e 2 virginica. A acurácia é de 97%.

A rede é formada por 5 camadas.

O modelo treinado nesse notebook pode ser visualizado no TensorBoard.


**6 - Iris, DNN Classifier with Log (tf.contrib.learn)**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/06%20-%20Iris%2C%20DNN%20Classifier%20with%20Log%20%28tf.contrib.learn%29.ipynb)

Nesse exemplo, é feito um classificador com uma rede neural para classificação de 3 espécies de flor. Dada na entrada as medidas da sépala e da pétala, o classificador retorna a espécie 0 setosa, 1 versicolor e 2 virginica. A acurácia é de 97%.

A rede é formada por 5 camadas e é feito o monitoramento de métricas que podem ser visualizadas no log do notebook e no TensorBoard.

O modelo treinado nesse notebook pode ser visualizado no TensorBoard.


**7 - Reading CSV**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/07%20-%20Reading%20CSV.ipynb)

Nesse exemplo, é feito o pipeline para leitura de dados de um arquivo CSV. O arquivo usado nesse estudo é o mesmo do Census.


**8 - Census, Logistic Regression Classifier (tf.contrib.learn)**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/08%20-%20Census%2C%20Logistic%20Regression%20Classifier%20%28tf.contrib.learn%29.ipynb)

Nesse exemplo, é feito um classificador com uma regressão logística para classificação de rendimento maior que 50 mil dólares. Dada na entrada as informações do Census, o classificador retorna 1 mais de 50 mil e 0 menos de 50 mil. A acurácia é de 87%.

O modelo treinado nesse notebook pode ser visualizado no TensorBoard.


**9 - Census, Combined Classifier (tf.contrib.learn)**

[Notebook](https://nbviewer.jupyter.org/github/cirocavani/tensorflow-jupyter/blob/master/workspace/Examples/09%20-%20Census%2C%20Combined%20Classifier%20%28tf.contrib.learn%29.ipynb)

Nesse exemplo, é feito um classificador com a combinação de uma rede neural e uma regressão logística (treinadas em conjunto) para classificação de rendimento maior que 50 mil dólares. Dada na entrada as informações do Census, o classificador retorna 1 mais de 50 mil e 0 menos de 50 mil. A acurácia é de 93%.

O modelo treinado nesse notebook pode ser visualizado no TensorBoard.


## Funcionamento

>IMPORTANTE:
>
> Essa é a descrição de como é feita a configuração do projeto, contudo esse procedimento já está definido no comando `bin/setup-linux` (ou `bin/setup-mac`) que deve ser executado ao invés desse procedimento.
>
> Esse passo a passo é para ajudar na customização do Projeto.

O procedimento de instalação consiste em:

1. Instalar o Python 2.7 com `miniconda` (Linux ou Mac)
2. Instalar o Jupyter Notebook 4.2 no *environment* `default` do `conda2`
3. Instalar o TensorFlow 0.10 em um *environment* próprio (para Python 2.7)
4. Instalar o kernel do Python no *environment* do TensorFlow
5. Configurar o kernel no Jupyter que é executado no *environment* do TensorFlow

A estrutura do projeto será:

* `deps/conda2`: instalação do Python 2.7 (`miniconda`)
* `deps/tensorflow-0.10`: instalação do TensorFlow 0.10 (*environment* isolado)
* `data/kernels/tensorflow-0.10/kernel.json`: configuração do kernel no Jupyter para o TensorFlow

Ao final desse procedimento, a execução do Jupyter consiste de (`bin/jupyter`):

    export JUPYTER_DATA_DIR=`pwd`/data
    deps/conda2/bin/jupyter notebook --no-browser --notebook-dir=`pwd`/workspace

Para a criação de uma customização, os passos 3, 4 e 5 devem ser ajustados para um novo *environment* com configuração customizada.


### Instalação do Python

A instalação do Python é feita usando o `miniconda` para versão 2.7 (para Linux ou Mac).

Os comandos de Python e Conda ficam disponíveis na pasta `deps/conda2/bin`.

http://conda.pydata.org/miniconda.html

(Linux)

    curl -k -L \
        -O https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh

    chmod +x Miniconda2-latest-Linux-x86_64.sh

    ./Miniconda2-latest-Linux-x86_64.sh -b -f -p deps/conda2


### Instalação do Jupyter

O Jupyter tem um meta pacote que depende de todos os componentes, incluindo o Notebook.

O comando do Jupyter fica disponível em `deps/conda2/bin/jupyter`.

http://jupyter.readthedocs.io/en/latest/install.html

https://pypi.python.org/pypi/jupyter

    deps/conda2/bin/pip install --upgrade jupyter


### Instalação do TensorFlow

O TensorFlow é distribuído como um pacote Wheel e é instalado em um *environment* isolado criado no `miniconda`.

O comando do TensorBoard fica disponível em `deps/tensorflow-0.10/bin/tensorboard`.

https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html#anaconda-installation

(Linux)

    deps/conda2/bin/conda create -y -p deps/tensorflow-0.10 python=2.7

    deps/tensorflow-0.10/bin/pip install \
        https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp27-none-linux_x86_64.whl

### Instalação do Kernel para o TensorFlow

No *environment* do TensorFlow é instalado o kernel Python que possibilita a conexão a partir do Jupyter (Notebook). Isso torna possível escrever código Python que é executado dentro desse *environment* isolado.

http://ipython.readthedocs.io/en/stable/install/kernel_install.html

https://pypi.python.org/pypi/ipykernel

    deps/tensorflow-0.10/bin/pip install ipykernel

### Configuração do Kernel para o TensorFlow

O Jupyter é configurado com o comando que executa o kernel do Python dentro do *environment* que tem o TensorFlow. O kernel é responsável por receber requisições do servidor do Jupyter e executar código Python no processo em que está executando. Esse processo é executado somente com os pacotes do próprio *environment* (isolamento) e pacotes adicionais devem ser instalados nesse *environment* sem conflito com outros *environments*.

https://jupyter-client.readthedocs.io/en/latest/kernels.html#kernelspecs

    mkdir -p data/kernels/tensorflow-0.10-py2

    echo "{
     \"display_name\": \"TensorFlow 0.10 (CPU, Python 2)\",
     \"language\": \"python\",
     \"argv\": [
      \"`pwd`/deps/tensorflow-0.10/bin/python\",
      \"-c\",
      \"from ipykernel.kernelapp import main; main()\",
      \"-f\",
      \"{connection_file}\"
     ]
    }" > data/kernels/tensorflow-0.10-py2/kernel.json


## Conclusão

O Jupyter é uma excelente ferramenta para exploração de ideias e desenvolvimento de código rápido. A facilidade de visualização e execução independente de células é muito prático. O desenvolvimento de aplicações mais complexas e com código mais estruturado já não é muito favorável.

O TensorFlow é uma ferramenta sofisticada para desenvolvimento de algoritmos inteligentes. Algumas APIs podem ser complexas e de difícil entendimento, algumas vezes bem documentadas e outras não. A comunidade é muito engajada e o Google vem produzindo tutoriais, documentação e modelos muito úteis para o aprendizado.

Aprender TensorFlow no Jupyter é o melhor caminho e essa é a proposta desse Projeto.
