├── .coveragerc
├── .github
└── stale.yml
├── .gitignore
├── .travis.yml
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── docker
├── Dockerfile
├── Makefile
├── README.md
└── theanorc
├── docs
├── README.md
├── __init__.py
├── autogen.py
├── mkdocs.yml
└── templates
│ ├── activations.md
│ ├── applications.md
│ ├── backend.md
│ ├── callbacks.md
│ ├── constraints.md
│ ├── datasets.md
│ ├── getting-started
│ ├── faq.md
│ ├── functional-api-guide.md
│ └── sequential-model-guide.md
│ ├── index.md
│ ├── initializers.md
│ ├── layers
│ ├── about-keras-layers.md
│ └── writing-your-own-keras-layers.md
│ ├── losses.md
│ ├── metrics.md
│ ├── models
│ ├── about-keras-models.md
│ ├── model.md
│ └── sequential.md
│ ├── optimizers.md
│ ├── preprocessing
│ ├── image.md
│ └── text.md
│ ├── regularizers.md
│ ├── scikit-learn-api.md
│ ├── visualization.md
│ └── why-use-keras.md
├── examples
├── README.md
├── addition_rnn.py
├── antirectifier.py
├── babi_memnn.py
├── babi_rnn.py
├── cifar10_cnn.py
├── cifar10_cnn_capsule.py
├── cifar10_cnn_tfaugment2d.py
├── cifar10_resnet.py
├── conv_filter_visualization.py
├── conv_lstm.py
├── deep_dream.py
├── image_ocr.py
├── imdb_bidirectional_lstm.py
├── imdb_cnn.py
├── imdb_cnn_lstm.py
├── imdb_fasttext.py
├── imdb_lstm.py
├── lstm_seq2seq.py
├── lstm_seq2seq_restore.py
├── lstm_stateful.py
├── lstm_text_generation.py
├── mnist_acgan.py
├── mnist_cnn.py
├── mnist_dataset_api.py
├── mnist_denoising_autoencoder.py
├── mnist_hierarchical_rnn.py
├── mnist_irnn.py
├── mnist_mlp.py
├── mnist_net2net.py
├── mnist_siamese.py
├── mnist_sklearn_wrapper.py
├── mnist_swwae.py
├── mnist_tfrecord.py
├── mnist_transfer_cnn.py
├── neural_doodle.py
├── neural_style_transfer.py
├── pretrained_word_embeddings.py
├── reuters_mlp.py
├── reuters_mlp_relu_vs_selu.py
├── tensorboard_embeddings_mnist.py
├── variational_autoencoder.py
└── variational_autoencoder_deconv.py
├── keras
├── __init__.py
├── activations.py
├── applications
│ ├── __init__.py
│ ├── densenet.py
│ ├── imagenet_utils.py
│ ├── inception_resnet_v2.py
│ ├── inception_v3.py
│ ├── mobilenet.py
│ ├── mobilenetv2.py
│ ├── nasnet.py
│ ├── resnet50.py
│ ├── vgg16.py
│ ├── vgg19.py
│ └── xception.py
├── backend
│ ├── __init__.py
│ ├── cntk_backend.py
│ ├── common.py
│ ├── tensorflow_backend.py
│ └── theano_backend.py
├── callbacks.py
├── constraints.py
├── datasets
│ ├── __init__.py
│ ├── boston_housing.py
│ ├── cifar.py
│ ├── cifar10.py
│ ├── cifar100.py
│ ├── fashion_mnist.py
│ ├── imdb.py
│ ├── mnist.py
│ └── reuters.py
├── engine
│ ├── __init__.py
│ ├── base_layer.py
│ ├── input_layer.py
│ ├── network.py
│ ├── saving.py
│ ├── sequential.py
│ ├── topology.py
│ ├── training.py
│ ├── training_arrays.py
│ ├── training_generator.py
│ └── training_utils.py
├── initializers.py
├── layers
│ ├── __init__.py
│ ├── advanced_activations.py
│ ├── convolutional.py
│ ├── convolutional_recurrent.py
│ ├── core.py
│ ├── cudnn_recurrent.py
│ ├── embeddings.py
│ ├── local.py
│ ├── merge.py
│ ├── noise.py
│ ├── normalization.py
│ ├── pooling.py
│ ├── recurrent.py
│ └── wrappers.py
├── legacy
│ ├── __init__.py
│ ├── interfaces.py
│ └── layers.py
├── losses.py
├── metrics.py
├── models.py
├── objectives.py
├── optimizers.py
├── preprocessing
│ ├── __init__.py
│ ├── image.py
│ ├── sequence.py
│ └── text.py
├── regularizers.py
├── utils
│ ├── __init__.py
│ ├── conv_utils.py
│ ├── data_utils.py
│ ├── generic_utils.py
│ ├── io_utils.py
│ ├── layer_utils.py
│ ├── multi_gpu_utils.py
│ ├── np_utils.py
│ ├── test_utils.py
│ └── vis_utils.py
└── wrappers
│ ├── __init__.py
│ └── scikit_learn.py
├── pytest.ini
├── setup.cfg
├── setup.py
└── tests
├── integration_tests
├── applications_test.py
├── imagenet_utils_test.py
├── test_datasets.py
├── test_image_data_tasks.py
├── test_temporal_data_tasks.py
└── test_vector_data_tasks.py
├── keras
├── activations_test.py
├── backend
│ ├── backend_test.py
│ └── reference_operations.py
├── constraints_test.py
├── engine
│ ├── test_topology.py
│ └── test_training.py
├── initializers_test.py
├── layers
│ ├── advanced_activations_test.py
│ ├── convolutional_recurrent_test.py
│ ├── convolutional_test.py
│ ├── core_test.py
│ ├── cudnn_recurrent_test.py
│ ├── embeddings_test.py
│ ├── local_test.py
│ ├── merge_test.py
│ ├── noise_test.py
│ ├── normalization_test.py
│ ├── recurrent_test.py
│ └── wrappers_test.py
├── legacy
│ ├── interface_test.py
│ └── layers_test.py
├── losses_test.py
├── metrics_test.py
├── optimizers_test.py
├── preprocessing
│ ├── image_test.py
│ ├── sequence_test.py
│ └── text_test.py
├── regularizers_test.py
├── test_callbacks.py
├── test_sequential_model.py
├── utils
│ ├── conv_utils_test.py
│ ├── data_utils_test.py
│ ├── generic_utils_test.py
│ ├── io_utils_test.py
│ ├── layer_utils_test.py
│ ├── multi_gpu_test.py
│ ├── np_utils_test.py
│ └── vis_utils_test.py
└── wrappers
│ └── scikit_learn_test.py
├── test_doc_auto_generation.py
├── test_documentation.py
├── test_dynamic_trainability.py
├── test_loss_masking.py
├── test_loss_weighting.py
├── test_model_saving.py
└── test_multiprocessing.py
/.coveragerc:
--------------------------------------------------------------------------------
1 | [report]
2 | # Regexes for lines to exclude from consideration
3 | exclude_lines =
4 | os.remove
5 | except ImportError
6 | # Don't complain if tests don't hit defensive assertion code:
7 | raise ImportError
8 | raise NotImplementedError
9 |
10 | # Don't complain if legacy support codes are not performed:
11 | if original_keras_version == '1':
12 |
13 | fail_under = 85
14 | show_missing = True
15 | omit =
16 | keras/applications/*
17 | keras/datasets/*
18 | keras/layers/cudnn_recurrent.py
19 | keras/legacy/*
20 | keras/utils/multi_gpu_utils.py
21 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Configuration for probot-stale - https://github.com/probot/stale
2 |
3 | # Number of days of inactivity before an Issue or Pull Request becomes stale
4 | daysUntilStale: 90
5 | # Number of days of inactivity before a stale Issue or Pull Request is closed
6 | daysUntilClose: 30
7 | # Issues or Pull Requests with these labels will never be considered stale
8 | exemptLabels:
9 | - bug
10 | - Announcement
11 | - help wanted
12 | - To investigate
13 | # Label to use when marking as stale
14 | staleLabel: stale
15 | # Comment to post when marking as stale. Set to `false` to disable
16 | markComment: >
17 | This issue has been automatically marked as stale because it has not had
18 | recent activity. It will be closed after 30 days if no further activity
19 | occurs, but feel free to re-open a closed issue if needed.
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.DS_Store
2 | *.pyc
3 | *.swp
4 | temp/*
5 | dist/*
6 | build/*
7 | keras/datasets/data/*
8 | keras/datasets/temp/*
9 | docs/site/*
10 | docs/theme/*
11 | docs/sources/*
12 | tags
13 | Keras.egg-info
14 | examples/img/*
15 |
16 | # test-related
17 | .coverage
18 | .cache
19 | .pytest_cache
20 |
21 | # developer environments
22 | .idea
23 | .vscode
24 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: required
2 | dist: trusty
3 | language: python
4 | matrix:
5 | include:
6 | - python: 2.7
7 | env: KERAS_BACKEND=tensorflow TEST_MODE=PEP8
8 | - python: 2.7
9 | env: KERAS_BACKEND=tensorflow TEST_MODE=INTEGRATION_TESTS
10 | - python: 3.6
11 | env: KERAS_BACKEND=tensorflow TEST_MODE=DOC
12 | - python: 2.7
13 | env: KERAS_BACKEND=tensorflow
14 | - python: 3.6
15 | env: KERAS_BACKEND=tensorflow
16 | - python: 2.7
17 | env: KERAS_BACKEND=theano THEANO_FLAGS=optimizer=fast_compile
18 | - python: 3.6
19 | env: KERAS_BACKEND=theano THEANO_FLAGS=optimizer=fast_compile
20 | - python: 2.7
21 | env: KERAS_BACKEND=cntk PYTHONWARNINGS=ignore
22 | - python: 3.6
23 | env: KERAS_BACKEND=cntk PYTHONWARNINGS=ignore
24 | install:
25 | # code below is taken from http://conda.pydata.org/docs/travis.html
26 | # We do this conditionally because it saves us some downloading if the
27 | # version is the same.
28 | - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
29 | wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
30 | else
31 | wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
32 | fi
33 | - bash miniconda.sh -b -p $HOME/miniconda
34 | - export PATH="$HOME/miniconda/bin:$PATH"
35 | - hash -r
36 | - conda config --set always_yes yes --set changeps1 no
37 | - conda update -q conda
38 | # Useful for debugging any issues with conda
39 | - conda info -a
40 |
41 | - conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION pytest pandas
42 | - source activate test-environment
43 | - pip install --only-binary=numpy,scipy numpy nose scipy matplotlib h5py theano
44 | - pip install keras_applications keras_preprocessing
45 | - conda install mkl mkl-service
46 |
47 | # set library path
48 | - export LD_LIBRARY_PATH=$HOME/miniconda/envs/test-environment/lib/:$LD_LIBRARY_PATH
49 |
50 | # install PIL for preprocessing tests
51 | - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
52 | conda install pil;
53 | elif [[ "$TRAVIS_PYTHON_VERSION" == "3.6" ]]; then
54 | conda install Pillow;
55 | fi
56 |
57 | - pip install -e .[tests]
58 |
59 | # install TensorFlow (CPU version).
60 | - pip install tensorflow==1.7
61 |
62 | # install cntk
63 | - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
64 | pip install https://cntk.ai/PythonWheel/CPU-Only/cntk-2.5.1-cp27-cp27mu-linux_x86_64.whl;
65 | elif [[ "$TRAVIS_PYTHON_VERSION" == "3.6" ]]; then
66 | pip install https://cntk.ai/PythonWheel/CPU-Only/cntk-2.5.1-cp36-cp36m-linux_x86_64.whl;
67 | fi
68 |
69 | # install pydot for visualization tests
70 | - conda install pydot graphviz
71 |
72 | # exclude different backends to measure a coverage for the designated backend only
73 | - if [[ "$KERAS_BACKEND" != "tensorflow" ]]; then
74 | echo ' keras/backend/tensorflow_backend.py' >> .coveragerc;
75 | fi
76 | - if [[ "$KERAS_BACKEND" != "theano" ]]; then
77 | echo ' keras/backend/theano_backend.py' >> .coveragerc;
78 | fi
79 | - if [[ "$KERAS_BACKEND" != "cntk" ]]; then
80 | echo ' keras/backend/cntk_backend.py' >> .coveragerc;
81 | fi
82 |
83 | # detect whether core files are changed or not
84 | - export CORE_CHANGED=False;
85 | - for entry in `git diff --name-only HEAD~1`; do if [[ "$entry" == "keras/backend/"* ]] || [[ "$entry" == "keras/engine/"* ]] || [[ "$entry" == "keras/layers/"* ]]; then export CORE_CHANGED=True; fi; done
86 | - export APP_CHANGED=False;
87 | - for entry in `git diff --name-only HEAD~1`; do if [[ "$entry" == "keras/applications/"* ]]; then export APP_CHANGED=True; fi; done
88 |
89 | #install open mpi
90 | - rm -rf ~/mpi
91 | - mkdir ~/mpi
92 | - pushd ~/mpi
93 | - wget http://cntk.ai/PythonWheel/ForKeras/depends/openmpi_1.10-3.zip
94 | - unzip ./openmpi_1.10-3.zip
95 | - sudo dpkg -i openmpi_1.10-3.deb
96 | - popd
97 |
98 | # command to run tests
99 | script:
100 | - export MKL_THREADING_LAYER="GNU"
101 | # run keras backend init to initialize backend config
102 | - python -c "import keras.backend"
103 | # create dataset directory to avoid concurrent directory creation at runtime
104 | - mkdir ~/.keras/datasets
105 | # set up keras backend
106 | - sed -i -e 's/"backend":[[:space:]]*"[^"]*/"backend":\ "'$KERAS_BACKEND'/g' ~/.keras/keras.json;
107 | - echo -e "Running tests with the following config:\n$(cat ~/.keras/keras.json)"
108 | - if [[ "$TEST_MODE" == "INTEGRATION_TESTS" ]]; then
109 | PYTHONPATH=$PWD:$PYTHONPATH py.test tests/integration_tests;
110 | elif [[ "$TEST_MODE" == "PEP8" ]]; then
111 | PYTHONPATH=$PWD:$PYTHONPATH py.test --pep8 -m pep8 -n0;
112 | elif [[ "$TEST_MODE" == "DOC" ]]; then
113 | PYTHONPATH=$PWD:$PYTHONPATH py.test tests/test_documentation.py;
114 | else
115 | PYTHONPATH=$PWD:$PYTHONPATH py.test tests/ --ignore=tests/integration_tests --ignore=tests/test_documentation.py --ignore=tests/keras/legacy/layers_test.py --cov-config .coveragerc --cov=keras tests/;
116 | fi
117 |
--------------------------------------------------------------------------------
/ISSUE_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | Please make sure that the boxes below are checked before you submit your issue. If your issue is an implementation question, please ask your question on [StackOverflow](http://stackoverflow.com/questions/tagged/keras) or [join the Keras Slack channel](https://keras-slack-autojoin.herokuapp.com/) and ask there instead of filing a GitHub issue.
2 |
3 | Thank you!
4 |
5 | - [ ] Check that you are up-to-date with the master branch of Keras. You can update with:
6 | pip install git+git://github.com/keras-team/keras.git --upgrade --no-deps
7 |
8 | - [ ] If running on TensorFlow, check that you are up-to-date with the latest version. The installation instructions can be found [here](https://www.tensorflow.org/get_started/os_setup).
9 |
10 | - [ ] If running on Theano, check that you are up-to-date with the master branch of Theano. You can update with:
11 | pip install git+git://github.com/Theano/Theano.git --upgrade --no-deps
12 |
13 | - [ ] Provide a link to a GitHub Gist of a Python script that can reproduce your issue (or just copy the script here if it is short).
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | COPYRIGHT
2 |
3 | All contributions by François Chollet:
4 | Copyright (c) 2015 - 2018, François Chollet.
5 | All rights reserved.
6 |
7 | All contributions by Google:
8 | Copyright (c) 2015 - 2018, Google, Inc.
9 | All rights reserved.
10 |
11 | All contributions by Microsoft:
12 | Copyright (c) 2017 - 2018, Microsoft, Inc.
13 | All rights reserved.
14 |
15 | All other contributions:
16 | Copyright (c) 2015 - 2018, the respective contributors.
17 | All rights reserved.
18 |
19 | Each contributor holds copyright over their respective contributions.
20 | The project versioning (Git) records all such contribution source information.
21 |
22 | LICENSE
23 |
24 | The MIT License (MIT)
25 |
26 | Permission is hereby granted, free of charge, to any person obtaining a copy
27 | of this software and associated documentation files (the "Software"), to deal
28 | in the Software without restriction, including without limitation the rights
29 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
30 | copies of the Software, and to permit persons to whom the Software is
31 | furnished to do so, subject to the following conditions:
32 |
33 | The above copyright notice and this permission notice shall be included in all
34 | copies or substantial portions of the Software.
35 |
36 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
37 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
39 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
40 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
42 | SOFTWARE.
43 |
44 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | include LICENSE
2 | include README.md
3 | include CONTRIBUTING.md
4 | graft docs
5 | graft examples
6 | graft tests
7 |
--------------------------------------------------------------------------------
/docker/Dockerfile:
--------------------------------------------------------------------------------
1 | ARG cuda_version=9.0
2 | ARG cudnn_version=7
3 | FROM nvidia/cuda:${cuda_version}-cudnn${cudnn_version}-devel
4 |
5 | # Install system packages
6 | RUN apt-get update && apt-get install -y --no-install-recommends \
7 | bzip2 \
8 | g++ \
9 | git \
10 | graphviz \
11 | libgl1-mesa-glx \
12 | libhdf5-dev \
13 | openmpi-bin \
14 | wget && \
15 | rm -rf /var/lib/apt/lists/*
16 |
17 | # Install conda
18 | ENV CONDA_DIR /opt/conda
19 | ENV PATH $CONDA_DIR/bin:$PATH
20 |
21 | RUN wget --quiet --no-check-certificate https://repo.continuum.io/miniconda/Miniconda3-4.2.12-Linux-x86_64.sh && \
22 | echo "c59b3dd3cad550ac7596e0d599b91e75d88826db132e4146030ef471bb434e9a *Miniconda3-4.2.12-Linux-x86_64.sh" | sha256sum -c - && \
23 | /bin/bash /Miniconda3-4.2.12-Linux-x86_64.sh -f -b -p $CONDA_DIR && \
24 | rm Miniconda3-4.2.12-Linux-x86_64.sh && \
25 | echo export PATH=$CONDA_DIR/bin:'$PATH' > /etc/profile.d/conda.sh
26 |
27 | # Install Python packages and keras
28 | ENV NB_USER keras
29 | ENV NB_UID 1000
30 |
31 | RUN useradd -m -s /bin/bash -N -u $NB_UID $NB_USER && \
32 | chown $NB_USER $CONDA_DIR -R && \
33 | mkdir -p /src && \
34 | chown $NB_USER /src
35 |
36 | USER $NB_USER
37 |
38 | ARG python_version=3.6
39 |
40 | RUN conda install -y python=${python_version} && \
41 | pip install --upgrade pip && \
42 | pip install \
43 | sklearn_pandas \
44 | tensorflow-gpu && \
45 | pip install https://cntk.ai/PythonWheel/GPU/cntk-2.1-cp36-cp36m-linux_x86_64.whl && \
46 | conda install \
47 | bcolz \
48 | h5py \
49 | matplotlib \
50 | mkl \
51 | nose \
52 | notebook \
53 | Pillow \
54 | pandas \
55 | pygpu \
56 | pyyaml \
57 | scikit-learn \
58 | six \
59 | theano && \
60 | git clone git://github.com/keras-team/keras.git /src && pip install -e /src[tests] && \
61 | pip install git+git://github.com/keras-team/keras.git && \
62 | conda clean -yt
63 |
64 | ADD theanorc /home/keras/.theanorc
65 |
66 | ENV PYTHONPATH='/src/:$PYTHONPATH'
67 |
68 | WORKDIR /src
69 |
70 | EXPOSE 8888
71 |
72 | CMD jupyter notebook --port=8888 --ip=0.0.0.0
73 |
74 |
--------------------------------------------------------------------------------
/docker/Makefile:
--------------------------------------------------------------------------------
1 | help:
2 | @cat Makefile
3 |
4 | DATA?="${HOME}/Data"
5 | GPU?=0
6 | DOCKER_FILE=Dockerfile
7 | DOCKER=GPU=$(GPU) nvidia-docker
8 | BACKEND=tensorflow
9 | PYTHON_VERSION?=3.6
10 | CUDA_VERSION?=9.0
11 | CUDNN_VERSION?=7
12 | TEST=tests/
13 | SRC?=$(shell dirname `pwd`)
14 |
15 | build:
16 | docker build -t keras --build-arg python_version=$(PYTHON_VERSION) --build-arg cuda_version=$(CUDA_VERSION) --build-arg cudnn_version=$(CUDNN_VERSION) -f $(DOCKER_FILE) .
17 |
18 | bash: build
19 | $(DOCKER) run -it -v $(SRC):/src/workspace -v $(DATA):/data --env KERAS_BACKEND=$(BACKEND) keras bash
20 |
21 | ipython: build
22 | $(DOCKER) run -it -v $(SRC):/src/workspace -v $(DATA):/data --env KERAS_BACKEND=$(BACKEND) keras ipython
23 |
24 | notebook: build
25 | $(DOCKER) run -it -v $(SRC):/src/workspace -v $(DATA):/data --net=host --env KERAS_BACKEND=$(BACKEND) keras
26 |
27 | test: build
28 | $(DOCKER) run -it -v $(SRC):/src/workspace -v $(DATA):/data --env KERAS_BACKEND=$(BACKEND) keras py.test $(TEST)
29 |
30 |
--------------------------------------------------------------------------------
/docker/README.md:
--------------------------------------------------------------------------------
1 | # Using Keras via Docker
2 |
3 | This directory contains `Dockerfile` to make it easy to get up and running with
4 | Keras via [Docker](http://www.docker.com/).
5 |
6 | ## Installing Docker
7 |
8 | General installation instructions are
9 | [on the Docker site](https://docs.docker.com/installation/), but we give some
10 | quick links here:
11 |
12 | * [OSX](https://docs.docker.com/installation/mac/): [docker toolbox](https://www.docker.com/toolbox)
13 | * [ubuntu](https://docs.docker.com/installation/ubuntulinux/)
14 |
15 | ## Running the container
16 |
17 | We are using `Makefile` to simplify docker commands within make commands.
18 |
19 | Build the container and start a Jupyter Notebook
20 |
21 | $ make notebook
22 |
23 | Build the container and start an iPython shell
24 |
25 | $ make ipython
26 |
27 | Build the container and start a bash
28 |
29 | $ make bash
30 |
31 | For GPU support install NVIDIA drivers (ideally latest) and
32 | [nvidia-docker](https://github.com/NVIDIA/nvidia-docker). Run using
33 |
34 | $ make notebook GPU=0 # or [ipython, bash]
35 |
36 | Switch between Theano and TensorFlow
37 |
38 | $ make notebook BACKEND=theano
39 | $ make notebook BACKEND=tensorflow
40 |
41 | Mount a volume for external data sets
42 |
43 | $ make DATA=~/mydata
44 |
45 | Prints all make tasks
46 |
47 | $ make help
48 |
49 | You can change Theano parameters by editing `/docker/theanorc`.
50 |
51 |
52 | Note: If you would have a problem running nvidia-docker you may try the old way
53 | we have used. But it is not recommended. If you find a bug in the nvidia-docker report
54 | it there please and try using the nvidia-docker as described above.
55 |
56 | $ export CUDA_SO=$(\ls /usr/lib/x86_64-linux-gnu/libcuda.* | xargs -I{} echo '-v {}:{}')
57 | $ export DEVICES=$(\ls /dev/nvidia* | xargs -I{} echo '--device {}:{}')
58 | $ docker run -it -p 8888:8888 $CUDA_SO $DEVICES gcr.io/tensorflow/tensorflow:latest-gpu
59 |
--------------------------------------------------------------------------------
/docker/theanorc:
--------------------------------------------------------------------------------
1 | [global]
2 | floatX = float32
3 | optimizer=None
4 | device = cuda
5 |
6 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | # Keras Documentation
2 |
3 | The source for Keras documentation is in this directory under `sources/`.
4 | Our documentation uses extended Markdown, as implemented by [MkDocs](http://mkdocs.org).
5 |
6 | ## Building the documentation
7 |
8 | - install MkDocs: `pip install mkdocs`
9 | - `cd` to the `docs/` folder and run:
10 | - `python autogen.py`
11 | - `mkdocs serve` # Starts a local webserver: [localhost:8000](localhost:8000)
12 | - `mkdocs build` # Builds a static site in "site" directory
13 |
--------------------------------------------------------------------------------
/docs/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/llSourcell/keras/a2d11d4724d3cf4a0b18a7fe8448723d92e1c716/docs/__init__.py
--------------------------------------------------------------------------------
/docs/mkdocs.yml:
--------------------------------------------------------------------------------
1 | site_name: Keras Documentation
2 | theme: readthedocs
3 | # theme_dir: theme
4 | docs_dir: sources
5 | repo_url: http://github.com/keras-team/keras
6 | site_url: http://keras.io/
7 | site_description: 'Documentation for Keras, the Python Deep Learning library.'
8 |
9 | dev_addr: '0.0.0.0:8000'
10 | google_analytics: ['UA-61785484-1', 'keras.io']
11 |
12 | pages:
13 | - Home: index.md
14 | - Why use Keras: why-use-keras.md
15 | - Getting started:
16 | - Guide to the Sequential model: getting-started/sequential-model-guide.md
17 | - Guide to the Functional API: getting-started/functional-api-guide.md
18 | - FAQ: getting-started/faq.md
19 | - Models:
20 | - About Keras models: models/about-keras-models.md
21 | - Sequential: models/sequential.md
22 | - Model (functional API): models/model.md
23 | - Layers:
24 | - About Keras layers: layers/about-keras-layers.md
25 | - Core Layers: layers/core.md
26 | - Convolutional Layers: layers/convolutional.md
27 | - Pooling Layers: layers/pooling.md
28 | - Locally-connected Layers: layers/local.md
29 | - Recurrent Layers: layers/recurrent.md
30 | - Embedding Layers: layers/embeddings.md
31 | - Merge Layers: layers/merge.md
32 | - Advanced Activations Layers: layers/advanced-activations.md
33 | - Normalization Layers: layers/normalization.md
34 | - Noise layers: layers/noise.md
35 | - Layer wrappers: layers/wrappers.md
36 | - Writing your own Keras layers: layers/writing-your-own-keras-layers.md
37 | - Preprocessing:
38 | - Sequence Preprocessing: preprocessing/sequence.md
39 | - Text Preprocessing: preprocessing/text.md
40 | - Image Preprocessing: preprocessing/image.md
41 | - Losses: losses.md
42 | - Metrics: metrics.md
43 | - Optimizers: optimizers.md
44 | - Activations: activations.md
45 | - Callbacks: callbacks.md
46 | - Datasets: datasets.md
47 | - Applications: applications.md
48 | - Backend: backend.md
49 | - Initializers: initializers.md
50 | - Regularizers: regularizers.md
51 | - Constraints: constraints.md
52 | - Visualization: visualization.md
53 | - Scikit-learn API: scikit-learn-api.md
54 | - Utils: utils.md
55 | - Contributing: contributing.md
56 |
--------------------------------------------------------------------------------
/docs/templates/activations.md:
--------------------------------------------------------------------------------
1 |
2 | ## Usage of activations
3 |
4 | Activations can either be used through an `Activation` layer, or through the `activation` argument supported by all forward layers:
5 |
6 | ```python
7 | from keras.layers import Activation, Dense
8 |
9 | model.add(Dense(64))
10 | model.add(Activation('tanh'))
11 | ```
12 |
13 | This is equivalent to:
14 |
15 | ```python
16 | model.add(Dense(64, activation='tanh'))
17 | ```
18 |
19 | You can also pass an element-wise TensorFlow/Theano/CNTK function as an activation:
20 |
21 | ```python
22 | from keras import backend as K
23 |
24 | model.add(Dense(64, activation=K.tanh))
25 | ```
26 |
27 | ## Available activations
28 |
29 | {{autogenerated}}
30 |
31 | ## On "Advanced Activations"
32 |
33 | Activations that are more complex than a simple TensorFlow/Theano/CNTK function (eg. learnable activations, which maintain a state) are available as [Advanced Activation layers](layers/advanced-activations.md), and can be found in the module `keras.layers.advanced_activations`. These include `PReLU` and `LeakyReLU`.
34 |
--------------------------------------------------------------------------------
/docs/templates/backend.md:
--------------------------------------------------------------------------------
1 | # Keras backends
2 |
3 | ## What is a "backend"?
4 |
5 | Keras is a model-level library, providing high-level building blocks for developing deep learning models. It does not handle itself low-level operations such as tensor products, convolutions and so on. Instead, it relies on a specialized, well-optimized tensor manipulation library to do so, serving as the "backend engine" of Keras. Rather than picking one single tensor library and making the implementation of Keras tied to that library, Keras handles the problem in a modular way, and several different backend engines can be plugged seamlessly into Keras.
6 |
7 | At this time, Keras has three backend implementations available: the **TensorFlow** backend, the **Theano** backend, and the **CNTK** backend.
8 |
9 | - [TensorFlow](http://www.tensorflow.org/) is an open-source symbolic tensor manipulation framework developed by Google.
10 | - [Theano](http://deeplearning.net/software/theano/) is an open-source symbolic tensor manipulation framework developed by LISA Lab at Université de Montréal.
11 | - [CNTK](https://www.microsoft.com/en-us/cognitive-toolkit/) is an open-source toolkit for deep learning developed by Microsoft.
12 |
13 | In the future, we are likely to add more backend options.
14 |
15 | ----
16 |
17 | ## Switching from one backend to another
18 |
19 | If you have run Keras at least once, you will find the Keras configuration file at:
20 |
21 | `$HOME/.keras/keras.json`
22 |
23 | If it isn't there, you can create it.
24 |
25 | **NOTE for Windows Users:** Please replace `$HOME` with `%USERPROFILE%`.
26 |
27 | The default configuration file looks like this:
28 |
29 | ```
30 | {
31 | "image_data_format": "channels_last",
32 | "epsilon": 1e-07,
33 | "floatx": "float32",
34 | "backend": "tensorflow"
35 | }
36 | ```
37 |
38 | Simply change the field `backend` to `"theano"`, `"tensorflow"`, or `"cntk"`, and Keras will use the new configuration next time you run any Keras code.
39 |
40 | You can also define the environment variable ``KERAS_BACKEND`` and this will
41 | override what is defined in your config file :
42 |
43 | ```bash
44 | KERAS_BACKEND=tensorflow python -c "from keras import backend"
45 | Using TensorFlow backend.
46 | ```
47 |
48 | ----
49 |
50 | ## keras.json details
51 |
52 |
53 | The `keras.json` configuration file contains the following settings:
54 |
55 | ```
56 | {
57 | "image_data_format": "channels_last",
58 | "epsilon": 1e-07,
59 | "floatx": "float32",
60 | "backend": "tensorflow"
61 | }
62 | ```
63 |
64 | You can change these settings by editing `$HOME/.keras/keras.json`.
65 |
66 | * `image_data_format`: String, either `"channels_last"` or `"channels_first"`. It specifies which data format convention Keras will follow. (`keras.backend.image_data_format()` returns it.)
67 | - For 2D data (e.g. image), `"channels_last"` assumes `(rows, cols, channels)` while `"channels_first"` assumes `(channels, rows, cols)`.
68 | - For 3D data, `"channels_last"` assumes `(conv_dim1, conv_dim2, conv_dim3, channels)` while `"channels_first"` assumes `(channels, conv_dim1, conv_dim2, conv_dim3)`.
69 | * `epsilon`: Float, a numeric fuzzing constant used to avoid dividing by zero in some operations.
70 | * `floatx`: String, `"float16"`, `"float32"`, or `"float64"`. Default float precision.
71 | * `backend`: String, `"tensorflow"`, `"theano"`, or `"cntk"`.
72 |
73 | ----
74 |
75 | ## Using the abstract Keras backend to write new code
76 |
77 | If you want the Keras modules you write to be compatible with both Theano (`th`) and TensorFlow (`tf`), you have to write them via the abstract Keras backend API. Here's an intro.
78 |
79 | You can import the backend module via:
80 | ```python
81 | from keras import backend as K
82 | ```
83 |
84 | The code below instantiates an input placeholder. It's equivalent to `tf.placeholder()` or `th.tensor.matrix()`, `th.tensor.tensor3()`, etc.
85 |
86 | ```python
87 | inputs = K.placeholder(shape=(2, 4, 5))
88 | # also works:
89 | inputs = K.placeholder(shape=(None, 4, 5))
90 | # also works:
91 | inputs = K.placeholder(ndim=3)
92 | ```
93 |
94 | The code below instantiates a variable. It's equivalent to `tf.Variable()` or `th.shared()`.
95 |
96 | ```python
97 | import numpy as np
98 | val = np.random.random((3, 4, 5))
99 | var = K.variable(value=val)
100 |
101 | # all-zeros variable:
102 | var = K.zeros(shape=(3, 4, 5))
103 | # all-ones:
104 | var = K.ones(shape=(3, 4, 5))
105 | ```
106 |
107 | Most tensor operations you will need can be done as you would in TensorFlow or Theano:
108 |
109 | ```python
110 | # Initializing Tensors with Random Numbers
111 | b = K.random_uniform_variable(shape=(3, 4), low=0, high=1) # Uniform distribution
112 | c = K.random_normal_variable(shape=(3, 4), mean=0, scale=1) # Gaussian distribution
113 | d = K.random_normal_variable(shape=(3, 4), mean=0, scale=1)
114 |
115 | # Tensor Arithmetic
116 | a = b + c * K.abs(d)
117 | c = K.dot(a, K.transpose(b))
118 | a = K.sum(b, axis=1)
119 | a = K.softmax(b)
120 | a = K.concatenate([b, c], axis=-1)
121 | # etc...
122 | ```
123 |
124 | ----
125 |
126 | ## Backend functions
127 |
128 |
129 | {{autogenerated}}
130 |
131 |
132 |
133 |
134 |
135 |
--------------------------------------------------------------------------------
/docs/templates/callbacks.md:
--------------------------------------------------------------------------------
1 | ## Usage of callbacks
2 |
3 | A callback is a set of functions to be applied at given stages of the training procedure. You can use callbacks to get a view on internal states and statistics of the model during training. You can pass a list of callbacks (as the keyword argument `callbacks`) to the `.fit()` method of the `Sequential` or `Model` classes. The relevant methods of the callbacks will then be called at each stage of the training.
4 |
5 | ---
6 |
7 | {{autogenerated}}
8 |
9 | ---
10 |
11 |
12 | # Create a callback
13 |
14 | You can create a custom callback by extending the base class `keras.callbacks.Callback`. A callback has access to its associated model through the class property `self.model`.
15 |
16 | Here's a simple example saving a list of losses over each batch during training:
17 | ```python
18 | class LossHistory(keras.callbacks.Callback):
19 | def on_train_begin(self, logs={}):
20 | self.losses = []
21 |
22 | def on_batch_end(self, batch, logs={}):
23 | self.losses.append(logs.get('loss'))
24 | ```
25 |
26 | ---
27 |
28 | ### Example: recording loss history
29 |
30 | ```python
31 | class LossHistory(keras.callbacks.Callback):
32 | def on_train_begin(self, logs={}):
33 | self.losses = []
34 |
35 | def on_batch_end(self, batch, logs={}):
36 | self.losses.append(logs.get('loss'))
37 |
38 | model = Sequential()
39 | model.add(Dense(10, input_dim=784, kernel_initializer='uniform'))
40 | model.add(Activation('softmax'))
41 | model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
42 |
43 | history = LossHistory()
44 | model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, callbacks=[history])
45 |
46 | print(history.losses)
47 | # outputs
48 | '''
49 | [0.66047596406559383, 0.3547245744908703, ..., 0.25953155204159617, 0.25901699725311789]
50 | '''
51 | ```
52 |
53 | ---
54 |
55 | ### Example: model checkpoints
56 |
57 | ```python
58 | from keras.callbacks import ModelCheckpoint
59 |
60 | model = Sequential()
61 | model.add(Dense(10, input_dim=784, kernel_initializer='uniform'))
62 | model.add(Activation('softmax'))
63 | model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
64 |
65 | '''
66 | saves the model weights after each epoch if the validation loss decreased
67 | '''
68 | checkpointer = ModelCheckpoint(filepath='/tmp/weights.hdf5', verbose=1, save_best_only=True)
69 | model.fit(x_train, y_train, batch_size=128, epochs=20, verbose=0, validation_data=(X_test, Y_test), callbacks=[checkpointer])
70 | ```
71 |
--------------------------------------------------------------------------------
/docs/templates/constraints.md:
--------------------------------------------------------------------------------
1 | ## Usage of constraints
2 |
3 | Functions from the `constraints` module allow setting constraints (eg. non-negativity) on network parameters during optimization.
4 |
5 | The penalties are applied on a per-layer basis. The exact API will depend on the layer, but the layers `Dense`, `Conv1D`, `Conv2D` and `Conv3D` have a unified API.
6 |
7 | These layers expose 2 keyword arguments:
8 |
9 | - `kernel_constraint` for the main weights matrix
10 | - `bias_constraint` for the bias.
11 |
12 |
13 | ```python
14 | from keras.constraints import max_norm
15 | model.add(Dense(64, kernel_constraint=max_norm(2.)))
16 | ```
17 |
18 | ## Available constraints
19 |
20 | - __max_norm(max_value=2, axis=0)__: maximum-norm constraint
21 | - __non_neg()__: non-negativity constraint
22 | - __unit_norm(axis=0)__: unit-norm constraint
23 | - __min_max_norm(min_value=0.0, max_value=1.0, rate=1.0, axis=0)__: minimum/maximum-norm constraint
24 |
--------------------------------------------------------------------------------
/docs/templates/index.md:
--------------------------------------------------------------------------------
1 | # Keras: The Python Deep Learning library
2 |
3 |
4 |
5 | {{autogenerated}}
--------------------------------------------------------------------------------
/docs/templates/initializers.md:
--------------------------------------------------------------------------------
1 | ## Usage of initializers
2 |
3 | Initializations define the way to set the initial random weights of Keras layers.
4 |
5 | The keyword arguments used for passing initializers to layers will depend on the layer. Usually it is simply `kernel_initializer` and `bias_initializer`:
6 |
7 | ```python
8 | model.add(Dense(64,
9 | kernel_initializer='random_uniform',
10 | bias_initializer='zeros'))
11 | ```
12 |
13 | ## Available initializers
14 |
15 | The following built-in initializers are available as part of the `keras.initializers` module:
16 |
17 | {{autogenerated}}
18 |
19 |
20 | An initializer may be passed as a string (must match one of the available initializers above), or as a callable:
21 |
22 | ```python
23 | from keras import initializers
24 |
25 | model.add(Dense(64, kernel_initializer=initializers.random_normal(stddev=0.01)))
26 |
27 | # also works; will use the default parameters.
28 | model.add(Dense(64, kernel_initializer='random_normal'))
29 | ```
30 |
31 |
32 | ## Using custom initializers
33 |
34 | If passing a custom callable, then it must take the argument `shape` (shape of the variable to initialize) and `dtype` (dtype of generated values):
35 |
36 | ```python
37 | from keras import backend as K
38 |
39 | def my_init(shape, dtype=None):
40 | return K.random_normal(shape, dtype=dtype)
41 |
42 | model.add(Dense(64, kernel_initializer=my_init))
43 | ```
44 |
--------------------------------------------------------------------------------
/docs/templates/layers/about-keras-layers.md:
--------------------------------------------------------------------------------
1 | # About Keras layers
2 |
3 | All Keras layers have a number of methods in common:
4 |
5 | - `layer.get_weights()`: returns the weights of the layer as a list of Numpy arrays.
6 | - `layer.set_weights(weights)`: sets the weights of the layer from a list of Numpy arrays (with the same shapes as the output of `get_weights`).
7 | - `layer.get_config()`: returns a dictionary containing the configuration of the layer. The layer can be reinstantiated from its config via:
8 |
9 | ```python
10 | layer = Dense(32)
11 | config = layer.get_config()
12 | reconstructed_layer = Dense.from_config(config)
13 | ```
14 |
15 | Or:
16 |
17 | ```python
18 | from keras import layers
19 |
20 | config = layer.get_config()
21 | layer = layers.deserialize({'class_name': layer.__class__.__name__,
22 | 'config': config})
23 | ```
24 |
25 | If a layer has a single node (i.e. if it isn't a shared layer), you can get its input tensor, output tensor, input shape and output shape via:
26 |
27 | - `layer.input`
28 | - `layer.output`
29 | - `layer.input_shape`
30 | - `layer.output_shape`
31 |
32 | If the layer has multiple nodes (see: [the concept of layer node and shared layers](/getting-started/functional-api-guide/#the-concept-of-layer-node)), you can use the following methods:
33 |
34 | - `layer.get_input_at(node_index)`
35 | - `layer.get_output_at(node_index)`
36 | - `layer.get_input_shape_at(node_index)`
37 | - `layer.get_output_shape_at(node_index)`
--------------------------------------------------------------------------------
/docs/templates/layers/writing-your-own-keras-layers.md:
--------------------------------------------------------------------------------
1 | # Writing your own Keras layers
2 |
3 | For simple, stateless custom operations, you are probably better off using `layers.core.Lambda` layers. But for any custom operation that has trainable weights, you should implement your own layer.
4 |
5 | Here is the skeleton of a Keras layer, **as of Keras 2.0** (if you have an older version, please upgrade). There are only three methods you need to implement:
6 |
7 | - `build(input_shape)`: this is where you will define your weights. This method must set `self.built = True` at the end, which can be done by calling `super([Layer], self).build()`.
8 | - `call(x)`: this is where the layer's logic lives. Unless you want your layer to support masking, you only have to care about the first argument passed to `call`: the input tensor.
9 | - `compute_output_shape(input_shape)`: in case your layer modifies the shape of its input, you should specify here the shape transformation logic. This allows Keras to do automatic shape inference.
10 |
11 | ```python
12 | from keras import backend as K
13 | from keras.engine.topology import Layer
14 | import numpy as np
15 |
16 | class MyLayer(Layer):
17 |
18 | def __init__(self, output_dim, **kwargs):
19 | self.output_dim = output_dim
20 | super(MyLayer, self).__init__(**kwargs)
21 |
22 | def build(self, input_shape):
23 | # Create a trainable weight variable for this layer.
24 | self.kernel = self.add_weight(name='kernel',
25 | shape=(input_shape[1], self.output_dim),
26 | initializer='uniform',
27 | trainable=True)
28 | super(MyLayer, self).build(input_shape) # Be sure to call this at the end
29 |
30 | def call(self, x):
31 | return K.dot(x, self.kernel)
32 |
33 | def compute_output_shape(self, input_shape):
34 | return (input_shape[0], self.output_dim)
35 | ```
36 |
37 | The existing Keras layers provide examples of how to implement almost anything. Never hesitate to read the source code!
38 |
--------------------------------------------------------------------------------
/docs/templates/losses.md:
--------------------------------------------------------------------------------
1 |
2 | ## Usage of loss functions
3 |
4 | A loss function (or objective function, or optimization score function) is one of the two parameters required to compile a model:
5 |
6 | ```python
7 | model.compile(loss='mean_squared_error', optimizer='sgd')
8 | ```
9 |
10 | ```python
11 | from keras import losses
12 |
13 | model.compile(loss=losses.mean_squared_error, optimizer='sgd')
14 | ```
15 |
16 | You can either pass the name of an existing loss function, or pass a TensorFlow/Theano symbolic function that returns a scalar for each data-point and takes the following two arguments:
17 |
18 | - __y_true__: True labels. TensorFlow/Theano tensor.
19 | - __y_pred__: Predictions. TensorFlow/Theano tensor of the same shape as y_true.
20 |
21 | The actual optimized objective is the mean of the output array across all datapoints.
22 |
23 | For a few examples of such functions, check out the [losses source](https://github.com/keras-team/keras/blob/master/keras/losses.py).
24 |
25 | ## Available loss functions
26 |
27 | {{autogenerated}}
28 |
29 | ----
30 |
31 | **Note**: when using the `categorical_crossentropy` loss, your targets should be in categorical format (e.g. if you have 10 classes, the target for each sample should be a 10-dimensional vector that is all-zeros except for a 1 at the index corresponding to the class of the sample). In order to convert *integer targets* into *categorical targets*, you can use the Keras utility `to_categorical`:
32 |
33 | ```python
34 | from keras.utils.np_utils import to_categorical
35 |
36 | categorical_labels = to_categorical(int_labels, num_classes=None)
37 | ```
38 |
--------------------------------------------------------------------------------
/docs/templates/metrics.md:
--------------------------------------------------------------------------------
1 |
2 | ## Usage of metrics
3 |
4 | A metric is a function that is used to judge the performance of your model. Metric functions are to be supplied in the `metrics` parameter when a model is compiled.
5 |
6 | ```python
7 | model.compile(loss='mean_squared_error',
8 | optimizer='sgd',
9 | metrics=['mae', 'acc'])
10 | ```
11 |
12 | ```python
13 | from keras import metrics
14 |
15 | model.compile(loss='mean_squared_error',
16 | optimizer='sgd',
17 | metrics=[metrics.mae, metrics.categorical_accuracy])
18 | ```
19 |
20 | A metric function is similar to a [loss function](/losses), except that the results from evaluating a metric are not used when training the model.
21 |
22 | You can either pass the name of an existing metric, or pass a Theano/TensorFlow symbolic function (see [Custom metrics](#custom-metrics)).
23 |
24 | #### Arguments
25 | - __y_true__: True labels. Theano/TensorFlow tensor.
26 | - __y_pred__: Predictions. Theano/TensorFlow tensor of the same shape as y_true.
27 |
28 | #### Returns
29 | Single tensor value representing the mean of the output array across all
30 | datapoints.
31 |
32 | ----
33 |
34 | ## Available metrics
35 |
36 |
37 | {{autogenerated}}
38 |
39 | ----
40 |
41 | ## Custom metrics
42 |
43 | Custom metrics can be passed at the compilation step. The
44 | function would need to take `(y_true, y_pred)` as arguments and return
45 | a single tensor value.
46 |
47 | ```python
48 | import keras.backend as K
49 |
50 | def mean_pred(y_true, y_pred):
51 | return K.mean(y_pred)
52 |
53 | model.compile(optimizer='rmsprop',
54 | loss='binary_crossentropy',
55 | metrics=['accuracy', mean_pred])
56 | ```
57 |
--------------------------------------------------------------------------------
/docs/templates/models/about-keras-models.md:
--------------------------------------------------------------------------------
1 | # About Keras models
2 |
3 | There are two main types of models available in Keras: [the Sequential model](/models/sequential), and [the Model class used with the functional API](/models/model).
4 |
5 | These models have a number of methods and attributes in common:
6 |
7 | - `model.layers` is a flattened list of the layers comprising the model.
8 | - `model.inputs` is the list of input tensors of the model.
9 | - `model.outputs` is the list of output tensors of the model.
10 |
11 | - `model.summary()` prints a summary representation of your model. Shortcut for [utils.print_summary](/utils/#print_summary)
12 | - `model.get_config()` returns a dictionary containing the configuration of the model. The model can be reinstantiated from its config via:
13 |
14 | ```python
15 | config = model.get_config()
16 | model = Model.from_config(config)
17 | # or, for Sequential:
18 | model = Sequential.from_config(config)
19 | ```
20 |
21 | - `model.get_weights()` returns a list of all weight tensors in the model, as Numpy arrays.
22 | - `model.set_weights(weights)` sets the values of the weights of the model, from a list of Numpy arrays. The arrays in the list should have the same shape as those returned by `get_weights()`.
23 | - `model.to_json()` returns a representation of the model as a JSON string. Note that the representation does not include the weights, only the architecture. You can reinstantiate the same model (with reinitialized weights) from the JSON string via:
24 |
25 | ```python
26 | from keras.models import model_from_json
27 |
28 | json_string = model.to_json()
29 | model = model_from_json(json_string)
30 | ```
31 | - `model.to_yaml()` returns a representation of the model as a YAML string. Note that the representation does not include the weights, only the architecture. You can reinstantiate the same model (with reinitialized weights) from the YAML string via:
32 |
33 | ```python
34 | from keras.models import model_from_yaml
35 |
36 | yaml_string = model.to_yaml()
37 | model = model_from_yaml(yaml_string)
38 | ```
39 |
40 | - `model.save_weights(filepath)` saves the weights of the model as a HDF5 file.
41 | - `model.load_weights(filepath, by_name=False)` loads the weights of the model from a HDF5 file (created by `save_weights`). By default, the architecture is expected to be unchanged. To load weights into a different architecture (with some layers in common), use `by_name=True` to load only those layers with the same name.
42 |
43 | Note: Please also see [How can I install HDF5 or h5py to save my models in Keras?](/getting-started/faq/#how-can-i-install-HDF5-or-h5py-to-save-my-models-in-Keras) in the FAQ for instructions on how to install `h5py`.
44 |
45 |
46 | ## Model subclassing
47 |
48 | In addition to these two types of models, you may create your own fully-customizable models by subclassing the `Model` class
49 | and implementing your own forward pass in the `call` method (the `Model` subclassing API was introduced in Keras 2.2.0).
50 |
51 | Here's an example of a simple multi-layer perceptron model written as a `Model` subclass:
52 |
53 | ```python
54 | import keras
55 |
56 | class SimpleMLP(keras.Model):
57 |
58 | def __init__(self, use_bn=False, use_dp=False, num_classes=10):
59 | super(SimpleMLP, self).__init__(name='mlp')
60 | self.use_bn = use_bn
61 | self.use_dp = use_dp
62 | self.num_classes = num_classes
63 |
64 | self.dense1 = keras.layers.Dense(32, activation='relu')
65 | self.dense2 = keras.layers.Dense(num_classes, activation='softmax')
66 | if self.use_dp:
67 | self.dp = keras.layers.Dropout(0.5)
68 | if self.use_bn:
69 | self.bn = keras.layers.BatchNormalization(axis=-1)
70 |
71 | def call(self, inputs):
72 | x = self.dense1(inputs)
73 | if self.use_dp:
74 | x = self.dp(x)
75 | if self.use_bn:
76 | x = self.bn(x)
77 | return self.dense2(x)
78 |
79 | model = SimpleMLP()
80 | model.compile(...)
81 | model.fit(...)
82 | ```
83 |
84 | Layers are defined in `__init__(self, ...)`, and the forward pass is specified in `call(self, inputs)`. In `call`, you may specify custom losses by calling `self.add_loss(loss_tensor)` (like you would in a custom layer).
85 |
86 | In subclassed models, the model's topology is defined as Python code (rather than as a static graph of layers).
87 | That means the model's topology cannot be inspected or serialized. As a result, the following methods and attributes are **not available for subclassed models**:
88 |
89 | - `model.inputs` and `model.outputs`.
90 | - `model.to_yaml()` and `model.to_json()`
91 | - `model.get_config()` and `model.save()`.
92 |
93 | **Key point:** use the right API for the job. The `Model` subclassing API can provide you with greater flexbility for implementing complex models,
94 | but it comes at a cost (in addition to these missing features):
95 | it is more verbose, more complex, and has more opportunities for user errors. If possible, prefer using the functional API, which is more user-friendly.
96 |
--------------------------------------------------------------------------------
/docs/templates/models/model.md:
--------------------------------------------------------------------------------
1 | # Model class API
2 |
3 | In the functional API, given some input tensor(s) and output tensor(s), you can instantiate a `Model` via:
4 |
5 | ```python
6 | from keras.models import Model
7 | from keras.layers import Input, Dense
8 |
9 | a = Input(shape=(32,))
10 | b = Dense(32)(a)
11 | model = Model(inputs=a, outputs=b)
12 | ```
13 |
14 | This model will include all layers required in the computation of `b` given `a`.
15 |
16 | In the case of multi-input or multi-output models, you can use lists as well:
17 |
18 | ```python
19 | model = Model(inputs=[a1, a2], outputs=[b1, b2, b3])
20 | ```
21 |
22 | For a detailed introduction of what `Model` can do, read [this guide to the Keras functional API](/getting-started/functional-api-guide).
23 |
24 |
25 | ## Methods
26 |
27 | {{autogenerated}}
28 |
--------------------------------------------------------------------------------
/docs/templates/models/sequential.md:
--------------------------------------------------------------------------------
1 | # The Sequential model API
2 |
3 | To get started, read [this guide to the Keras Sequential model](/getting-started/sequential-model-guide).
4 |
5 | ----
6 |
7 | ## Sequential model methods
8 |
9 | {{autogenerated}}
--------------------------------------------------------------------------------
/docs/templates/optimizers.md:
--------------------------------------------------------------------------------
1 |
2 | ## Usage of optimizers
3 |
4 | An optimizer is one of the two arguments required for compiling a Keras model:
5 |
6 | ```python
7 | from keras import optimizers
8 |
9 | model = Sequential()
10 | model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,)))
11 | model.add(Activation('softmax'))
12 |
13 | sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
14 | model.compile(loss='mean_squared_error', optimizer=sgd)
15 | ```
16 |
17 | You can either instantiate an optimizer before passing it to `model.compile()` , as in the above example, or you can call it by its name. In the latter case, the default parameters for the optimizer will be used.
18 |
19 | ```python
20 | # pass optimizer by name: default parameters will be used
21 | model.compile(loss='mean_squared_error', optimizer='sgd')
22 | ```
23 |
24 | ---
25 |
26 | ## Parameters common to all Keras optimizers
27 |
28 | The parameters `clipnorm` and `clipvalue` can be used with all optimizers to control gradient clipping:
29 |
30 | ```python
31 | from keras import optimizers
32 |
33 | # All parameter gradients will be clipped to
34 | # a maximum norm of 1.
35 | sgd = optimizers.SGD(lr=0.01, clipnorm=1.)
36 | ```
37 |
38 | ```python
39 | from keras import optimizers
40 |
41 | # All parameter gradients will be clipped to
42 | # a maximum value of 0.5 and
43 | # a minimum value of -0.5.
44 | sgd = optimizers.SGD(lr=0.01, clipvalue=0.5)
45 | ```
46 |
47 | ---
48 |
49 | {{autogenerated}}
50 |
--------------------------------------------------------------------------------
/docs/templates/preprocessing/image.md:
--------------------------------------------------------------------------------
1 |
2 | # Image Preprocessing
3 |
4 | {{autogenerated}}
5 |
--------------------------------------------------------------------------------
/docs/templates/preprocessing/text.md:
--------------------------------------------------------------------------------
1 |
2 | ### Text Preprocessing
3 |
4 | {{autogenerated}}
5 |
--------------------------------------------------------------------------------
/docs/templates/regularizers.md:
--------------------------------------------------------------------------------
1 | ## Usage of regularizers
2 |
3 | Regularizers allow to apply penalties on layer parameters or layer activity during optimization. These penalties are incorporated in the loss function that the network optimizes.
4 |
5 | The penalties are applied on a per-layer basis. The exact API will depend on the layer, but the layers `Dense`, `Conv1D`, `Conv2D` and `Conv3D` have a unified API.
6 |
7 | These layers expose 3 keyword arguments:
8 |
9 | - `kernel_regularizer`: instance of `keras.regularizers.Regularizer`
10 | - `bias_regularizer`: instance of `keras.regularizers.Regularizer`
11 | - `activity_regularizer`: instance of `keras.regularizers.Regularizer`
12 |
13 |
14 | ## Example
15 |
16 | ```python
17 | from keras import regularizers
18 | model.add(Dense(64, input_dim=64,
19 | kernel_regularizer=regularizers.l2(0.01),
20 | activity_regularizer=regularizers.l1(0.01)))
21 | ```
22 |
23 | ## Available penalties
24 |
25 | ```python
26 | keras.regularizers.l1(0.)
27 | keras.regularizers.l2(0.)
28 | keras.regularizers.l1_l2(0.)
29 | ```
30 |
31 | ## Developing new regularizers
32 |
33 | Any function that takes in a weight matrix and returns a loss contribution tensor can be used as a regularizer, e.g.:
34 |
35 | ```python
36 | from keras import backend as K
37 |
38 | def l1_reg(weight_matrix):
39 | return 0.01 * K.sum(K.abs(weight_matrix))
40 |
41 | model.add(Dense(64, input_dim=64,
42 | kernel_regularizer=l1_reg))
43 | ```
44 |
45 | Alternatively, you can write your regularizers in an object-oriented way;
46 | see the [keras/regularizers.py](https://github.com/keras-team/keras/blob/master/keras/regularizers.py) module for examples.
--------------------------------------------------------------------------------
/docs/templates/scikit-learn-api.md:
--------------------------------------------------------------------------------
1 | # Wrappers for the Scikit-Learn API
2 |
3 | You can use `Sequential` Keras models (single-input only) as part of your Scikit-Learn workflow via the wrappers found at `keras.wrappers.scikit_learn.py`.
4 |
5 | There are two wrappers available:
6 |
7 | `keras.wrappers.scikit_learn.KerasClassifier(build_fn=None, **sk_params)`, which implements the Scikit-Learn classifier interface,
8 |
9 | `keras.wrappers.scikit_learn.KerasRegressor(build_fn=None, **sk_params)`, which implements the Scikit-Learn regressor interface.
10 |
11 | ### Arguments
12 |
13 | - __build_fn__: callable function or class instance
14 | - __sk_params__: model parameters & fitting parameters
15 |
16 | `build_fn` should construct, compile and return a Keras model, which
17 | will then be used to fit/predict. One of the following
18 | three values could be passed to `build_fn`:
19 |
20 | 1. A function
21 | 2. An instance of a class that implements the `__call__` method
22 | 3. None. This means you implement a class that inherits from either
23 | `KerasClassifier` or `KerasRegressor`. The `__call__` method of the
24 | present class will then be treated as the default `build_fn`.
25 |
26 | `sk_params` takes both model parameters and fitting parameters. Legal model
27 | parameters are the arguments of `build_fn`. Note that like all other
28 | estimators in scikit-learn, `build_fn` should provide default values for
29 | its arguments, so that you could create the estimator without passing any
30 | values to `sk_params`.
31 |
32 | `sk_params` could also accept parameters for calling `fit`, `predict`,
33 | `predict_proba`, and `score` methods (e.g., `epochs`, `batch_size`).
34 | fitting (predicting) parameters are selected in the following order:
35 |
36 | 1. Values passed to the dictionary arguments of
37 | `fit`, `predict`, `predict_proba`, and `score` methods
38 | 2. Values passed to `sk_params`
39 | 3. The default values of the `keras.models.Sequential`
40 | `fit`, `predict`, `predict_proba` and `score` methods
41 |
42 | When using scikit-learn's `grid_search` API, legal tunable parameters are
43 | those you could pass to `sk_params`, including fitting parameters.
44 | In other words, you could use `grid_search` to search for the best
45 | `batch_size` or `epochs` as well as the model parameters.
46 |
--------------------------------------------------------------------------------
/docs/templates/visualization.md:
--------------------------------------------------------------------------------
1 |
2 | ## Model visualization
3 |
4 | The `keras.utils.vis_utils` module provides utility functions to plot
5 | a Keras model (using `graphviz`).
6 |
7 | This will plot a graph of the model and save it to a file:
8 | ```python
9 | from keras.utils import plot_model
10 | plot_model(model, to_file='model.png')
11 | ```
12 |
13 | `plot_model` takes two optional arguments:
14 |
15 | - `show_shapes` (defaults to False) controls whether output shapes are shown in the graph.
16 | - `show_layer_names` (defaults to True) controls whether layer names are shown in the graph.
17 |
18 | You can also directly obtain the `pydot.Graph` object and render it yourself,
19 | for example to show it in an ipython notebook :
20 | ```python
21 | from IPython.display import SVG
22 | from keras.utils.vis_utils import model_to_dot
23 |
24 | SVG(model_to_dot(model).create(prog='dot', format='svg'))
25 | ```
26 |
--------------------------------------------------------------------------------
/examples/README.md:
--------------------------------------------------------------------------------
1 | # Keras examples directory
2 |
3 | ## Vision models examples
4 |
5 | [mnist_mlp.py](mnist_mlp.py)
6 | Trains a simple deep multi-layer perceptron on the MNIST dataset.
7 |
8 | [mnist_cnn.py](mnist_cnn.py)
9 | Trains a simple convnet on the MNIST dataset.
10 |
11 | [cifar10_cnn.py](cifar10_cnn.py)
12 | Trains a simple deep CNN on the CIFAR10 small images dataset.
13 |
14 | [cifar10_resnet.py](cifar10_resnet.py)
15 | Trains a ResNet on the CIFAR10 small images dataset.
16 |
17 | [conv_lstm.py](conv_lstm.py)
18 | Demonstrates the use of a convolutional LSTM network.
19 |
20 | [image_ocr.py](image_ocr.py)
21 | Trains a convolutional stack followed by a recurrent stack and a CTC logloss function to perform optical character recognition (OCR).
22 |
23 | [mnist_acgan.py](mnist_acgan.py)
24 | Implementation of AC-GAN (Auxiliary Classifier GAN) on the MNIST dataset
25 |
26 | [mnist_hierarchical_rnn.py](mnist_hierarchical_rnn.py)
27 | Trains a Hierarchical RNN (HRNN) to classify MNIST digits.
28 |
29 | [mnist_siamese.py](mnist_siamese.py)
30 | Trains a Siamese multi-layer perceptron on pairs of digits from the MNIST dataset.
31 |
32 | [mnist_swwae.py](mnist_swwae.py)
33 | Trains a Stacked What-Where AutoEncoder built on residual blocks on the MNIST dataset.
34 |
35 | [mnist_transfer_cnn.py](mnist_transfer_cnn.py)
36 | Transfer learning toy example.
37 |
38 | ----
39 |
40 | ## Text & sequences examples
41 |
42 | [addition_rnn.py](addition_rnn.py)
43 | Implementation of sequence to sequence learning for performing addition of two numbers (as strings).
44 |
45 | [babi_rnn.py](babi_rnn.py)
46 | Trains a two-branch recurrent network on the bAbI dataset for reading comprehension.
47 |
48 | [babi_memnn.py](babi_memnn.py)
49 | Trains a memory network on the bAbI dataset for reading comprehension.
50 |
51 | [imdb_bidirectional_lstm.py](imdb_bidirectional_lstm.py)
52 | Trains a Bidirectional LSTM on the IMDB sentiment classification task.
53 |
54 | [imdb_cnn.py](imdb_cnn.py)
55 | Demonstrates the use of Convolution1D for text classification.
56 |
57 | [imdb_cnn_lstm.py](imdb_cnn_lstm.py)
58 | Trains a convolutional stack followed by a recurrent stack network on the IMDB sentiment classification task.
59 |
60 | [imdb_fasttext.py](imdb_fasttext.py)
61 | Trains a FastText model on the IMDB sentiment classification task.
62 |
63 | [imdb_lstm.py](imdb_lstm.py)
64 | Trains an LSTM model on the IMDB sentiment classification task.
65 |
66 | [lstm_stateful.py](lstm_stateful.py)
67 | Demonstrates how to use stateful RNNs to model long sequences efficiently.
68 |
69 | [pretrained_word_embeddings.py](pretrained_word_embeddings.py)
70 | Loads pre-trained word embeddings (GloVe embeddings) into a frozen Keras Embedding layer, and uses it to train a text classification model on the 20 Newsgroup dataset.
71 |
72 | [reuters_mlp.py](reuters_mlp.py)
73 | Trains and evaluate a simple MLP on the Reuters newswire topic classification task.
74 |
75 | ----
76 |
77 | ## Generative models examples
78 |
79 | [lstm_text_generation.py](lstm_text_generation.py)
80 | Generates text from Nietzsche's writings.
81 |
82 | [conv_filter_visualization.py](conv_filter_visualization.py)
83 | Visualization of the filters of VGG16, via gradient ascent in input space.
84 |
85 | [deep_dream.py](deep_dream.py)
86 | Deep Dreams in Keras.
87 |
88 | [neural_doodle.py](neural_doodle.py)
89 | Neural doodle.
90 |
91 | [neural_style_transfer.py](neural_style_transfer.py)
92 | Neural style transfer.
93 |
94 | [variational_autoencoder.py](variational_autoencoder.py)
95 | Demonstrates how to build a variational autoencoder.
96 |
97 | [variational_autoencoder_deconv.py](variational_autoencoder_deconv.py)
98 | Demonstrates how to build a variational autoencoder with Keras using deconvolution layers.
99 |
100 | ----
101 |
102 | ## Examples demonstrating specific Keras functionality
103 |
104 | [antirectifier.py](antirectifier.py)
105 | Demonstrates how to write custom layers for Keras.
106 |
107 | [mnist_sklearn_wrapper.py](mnist_sklearn_wrapper.py)
108 | Demonstrates how to use the sklearn wrapper.
109 |
110 | [mnist_irnn.py](mnist_irnn.py)
111 | Reproduction of the IRNN experiment with pixel-by-pixel sequential MNIST in "A Simple Way to Initialize Recurrent Networks of Rectified Linear Units" by Le et al.
112 |
113 | [mnist_net2net.py](mnist_net2net.py)
114 | Reproduction of the Net2Net experiment with MNIST in "Net2Net: Accelerating Learning via Knowledge Transfer".
115 |
116 | [reuters_mlp_relu_vs_selu.py](reuters_mlp_relu_vs_selu.py)
117 | Compares self-normalizing MLPs with regular MLPs.
118 |
119 | [mnist_tfrecord.py](mnist_tfrecord.py)
120 | MNIST dataset with TFRecords, the standard TensorFlow data format.
121 |
122 | [mnist_dataset_api.py](mnist_dataset_api.py)
123 | MNIST dataset with TensorFlow's Dataset API.
--------------------------------------------------------------------------------
/examples/antirectifier.py:
--------------------------------------------------------------------------------
1 | '''The example demonstrates how to write custom layers for Keras.
2 |
3 | We build a custom activation layer called 'Antirectifier',
4 | which modifies the shape of the tensor that passes through it.
5 | We need to specify two methods: `compute_output_shape` and `call`.
6 |
7 | Note that the same result can also be achieved via a Lambda layer.
8 |
9 | Because our custom layer is written with primitives from the Keras
10 | backend (`K`), our code can run both on TensorFlow and Theano.
11 | '''
12 |
13 | from __future__ import print_function
14 | import keras
15 | from keras.models import Sequential
16 | from keras import layers
17 | from keras.datasets import mnist
18 | from keras import backend as K
19 |
20 |
21 | class Antirectifier(layers.Layer):
22 | '''This is the combination of a sample-wise
23 | L2 normalization with the concatenation of the
24 | positive part of the input with the negative part
25 | of the input. The result is a tensor of samples that are
26 | twice as large as the input samples.
27 |
28 | It can be used in place of a ReLU.
29 |
30 | # Input shape
31 | 2D tensor of shape (samples, n)
32 |
33 | # Output shape
34 | 2D tensor of shape (samples, 2*n)
35 |
36 | # Theoretical justification
37 | When applying ReLU, assuming that the distribution
38 | of the previous output is approximately centered around 0.,
39 | you are discarding half of your input. This is inefficient.
40 |
41 | Antirectifier allows to return all-positive outputs like ReLU,
42 | without discarding any data.
43 |
44 | Tests on MNIST show that Antirectifier allows to train networks
45 | with twice less parameters yet with comparable
46 | classification accuracy as an equivalent ReLU-based network.
47 | '''
48 |
49 | def compute_output_shape(self, input_shape):
50 | shape = list(input_shape)
51 | assert len(shape) == 2 # only valid for 2D tensors
52 | shape[-1] *= 2
53 | return tuple(shape)
54 |
55 | def call(self, inputs):
56 | inputs -= K.mean(inputs, axis=1, keepdims=True)
57 | inputs = K.l2_normalize(inputs, axis=1)
58 | pos = K.relu(inputs)
59 | neg = K.relu(-inputs)
60 | return K.concatenate([pos, neg], axis=1)
61 |
62 | # global parameters
63 | batch_size = 128
64 | num_classes = 10
65 | epochs = 40
66 |
67 | # the data, split between train and test sets
68 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
69 |
70 | x_train = x_train.reshape(60000, 784)
71 | x_test = x_test.reshape(10000, 784)
72 | x_train = x_train.astype('float32')
73 | x_test = x_test.astype('float32')
74 | x_train /= 255
75 | x_test /= 255
76 | print(x_train.shape[0], 'train samples')
77 | print(x_test.shape[0], 'test samples')
78 |
79 | # convert class vectors to binary class matrices
80 | y_train = keras.utils.to_categorical(y_train, num_classes)
81 | y_test = keras.utils.to_categorical(y_test, num_classes)
82 |
83 | # build the model
84 | model = Sequential()
85 | model.add(layers.Dense(256, input_shape=(784,)))
86 | model.add(Antirectifier())
87 | model.add(layers.Dropout(0.1))
88 | model.add(layers.Dense(256))
89 | model.add(Antirectifier())
90 | model.add(layers.Dropout(0.1))
91 | model.add(layers.Dense(num_classes))
92 | model.add(layers.Activation('softmax'))
93 |
94 | # compile the model
95 | model.compile(loss='categorical_crossentropy',
96 | optimizer='rmsprop',
97 | metrics=['accuracy'])
98 |
99 | # train the model
100 | model.fit(x_train, y_train,
101 | batch_size=batch_size,
102 | epochs=epochs,
103 | verbose=1,
104 | validation_data=(x_test, y_test))
105 |
106 | # next, compare with an equivalent network
107 | # with2x bigger Dense layers and ReLU
108 |
--------------------------------------------------------------------------------
/examples/conv_filter_visualization.py:
--------------------------------------------------------------------------------
1 | '''Visualization of the filters of VGG16, via gradient ascent in input space.
2 |
3 | This script can run on CPU in a few minutes.
4 |
5 | Results example: http://i.imgur.com/4nj4KjN.jpg
6 | '''
7 | from __future__ import print_function
8 |
9 | import numpy as np
10 | import time
11 | from keras.preprocessing.image import save_img
12 | from keras.applications import vgg16
13 | from keras import backend as K
14 |
15 | # dimensions of the generated pictures for each filter.
16 | img_width = 128
17 | img_height = 128
18 |
19 | # the name of the layer we want to visualize
20 | # (see model definition at keras/applications/vgg16.py)
21 | layer_name = 'block5_conv1'
22 |
23 | # util function to convert a tensor into a valid image
24 |
25 |
26 | def deprocess_image(x):
27 | # normalize tensor: center on 0., ensure std is 0.1
28 | x -= x.mean()
29 | x /= (x.std() + K.epsilon())
30 | x *= 0.1
31 |
32 | # clip to [0, 1]
33 | x += 0.5
34 | x = np.clip(x, 0, 1)
35 |
36 | # convert to RGB array
37 | x *= 255
38 | if K.image_data_format() == 'channels_first':
39 | x = x.transpose((1, 2, 0))
40 | x = np.clip(x, 0, 255).astype('uint8')
41 | return x
42 |
43 |
44 | # build the VGG16 network with ImageNet weights
45 | model = vgg16.VGG16(weights='imagenet', include_top=False)
46 | print('Model loaded.')
47 |
48 | model.summary()
49 |
50 | # this is the placeholder for the input images
51 | input_img = model.input
52 |
53 | # get the symbolic outputs of each "key" layer (we gave them unique names).
54 | layer_dict = dict([(layer.name, layer) for layer in model.layers[1:]])
55 |
56 |
57 | def normalize(x):
58 | # utility function to normalize a tensor by its L2 norm
59 | return x / (K.sqrt(K.mean(K.square(x))) + K.epsilon())
60 |
61 |
62 | kept_filters = []
63 | for filter_index in range(200):
64 | # we only scan through the first 200 filters,
65 | # but there are actually 512 of them
66 | print('Processing filter %d' % filter_index)
67 | start_time = time.time()
68 |
69 | # we build a loss function that maximizes the activation
70 | # of the nth filter of the layer considered
71 | layer_output = layer_dict[layer_name].output
72 | if K.image_data_format() == 'channels_first':
73 | loss = K.mean(layer_output[:, filter_index, :, :])
74 | else:
75 | loss = K.mean(layer_output[:, :, :, filter_index])
76 |
77 | # we compute the gradient of the input picture wrt this loss
78 | grads = K.gradients(loss, input_img)[0]
79 |
80 | # normalization trick: we normalize the gradient
81 | grads = normalize(grads)
82 |
83 | # this function returns the loss and grads given the input picture
84 | iterate = K.function([input_img], [loss, grads])
85 |
86 | # step size for gradient ascent
87 | step = 1.
88 |
89 | # we start from a gray image with some random noise
90 | if K.image_data_format() == 'channels_first':
91 | input_img_data = np.random.random((1, 3, img_width, img_height))
92 | else:
93 | input_img_data = np.random.random((1, img_width, img_height, 3))
94 | input_img_data = (input_img_data - 0.5) * 20 + 128
95 |
96 | # we run gradient ascent for 20 steps
97 | for i in range(20):
98 | loss_value, grads_value = iterate([input_img_data])
99 | input_img_data += grads_value * step
100 |
101 | print('Current loss value:', loss_value)
102 | if loss_value <= 0.:
103 | # some filters get stuck to 0, we can skip them
104 | break
105 |
106 | # decode the resulting input image
107 | if loss_value > 0:
108 | img = deprocess_image(input_img_data[0])
109 | kept_filters.append((img, loss_value))
110 | end_time = time.time()
111 | print('Filter %d processed in %ds' % (filter_index, end_time - start_time))
112 |
113 | # we will stich the best 64 filters on a 8 x 8 grid.
114 | n = 8
115 |
116 | # the filters that have the highest loss are assumed to be better-looking.
117 | # we will only keep the top 64 filters.
118 | kept_filters.sort(key=lambda x: x[1], reverse=True)
119 | kept_filters = kept_filters[:n * n]
120 |
121 | # build a black picture with enough space for
122 | # our 8 x 8 filters of size 128 x 128, with a 5px margin in between
123 | margin = 5
124 | width = n * img_width + (n - 1) * margin
125 | height = n * img_height + (n - 1) * margin
126 | stitched_filters = np.zeros((width, height, 3))
127 |
128 | # fill the picture with our saved filters
129 | for i in range(n):
130 | for j in range(n):
131 | img, loss = kept_filters[i * n + j]
132 | stitched_filters[(img_width + margin) * i: (img_width + margin) * i + img_width,
133 | (img_height + margin) * j: (img_height + margin) * j + img_height, :] = img
134 |
135 | # save the result to disk
136 | save_img('stitched_filters_%dx%d.png' % (n, n), stitched_filters)
137 |
--------------------------------------------------------------------------------
/examples/imdb_bidirectional_lstm.py:
--------------------------------------------------------------------------------
1 | '''Trains a Bidirectional LSTM on the IMDB sentiment classification task.
2 |
3 | Output after 4 epochs on CPU: ~0.8146
4 | Time per epoch on CPU (Core i7): ~150s.
5 | '''
6 |
7 | from __future__ import print_function
8 | import numpy as np
9 |
10 | from keras.preprocessing import sequence
11 | from keras.models import Sequential
12 | from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional
13 | from keras.datasets import imdb
14 |
15 |
16 | max_features = 20000
17 | # cut texts after this number of words
18 | # (among top max_features most common words)
19 | maxlen = 100
20 | batch_size = 32
21 |
22 | print('Loading data...')
23 | (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
24 | print(len(x_train), 'train sequences')
25 | print(len(x_test), 'test sequences')
26 |
27 | print('Pad sequences (samples x time)')
28 | x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
29 | x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
30 | print('x_train shape:', x_train.shape)
31 | print('x_test shape:', x_test.shape)
32 | y_train = np.array(y_train)
33 | y_test = np.array(y_test)
34 |
35 | model = Sequential()
36 | model.add(Embedding(max_features, 128, input_length=maxlen))
37 | model.add(Bidirectional(LSTM(64)))
38 | model.add(Dropout(0.5))
39 | model.add(Dense(1, activation='sigmoid'))
40 |
41 | # try using different optimizers and different optimizer configs
42 | model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])
43 |
44 | print('Train...')
45 | model.fit(x_train, y_train,
46 | batch_size=batch_size,
47 | epochs=4,
48 | validation_data=[x_test, y_test])
49 |
--------------------------------------------------------------------------------
/examples/imdb_cnn.py:
--------------------------------------------------------------------------------
1 | '''This example demonstrates the use of Convolution1D for text classification.
2 |
3 | Gets to 0.89 test accuracy after 2 epochs.
4 | 90s/epoch on Intel i5 2.4Ghz CPU.
5 | 10s/epoch on Tesla K40 GPU.
6 | '''
7 | from __future__ import print_function
8 |
9 | from keras.preprocessing import sequence
10 | from keras.models import Sequential
11 | from keras.layers import Dense, Dropout, Activation
12 | from keras.layers import Embedding
13 | from keras.layers import Conv1D, GlobalMaxPooling1D
14 | from keras.datasets import imdb
15 |
16 | # set parameters:
17 | max_features = 5000
18 | maxlen = 400
19 | batch_size = 32
20 | embedding_dims = 50
21 | filters = 250
22 | kernel_size = 3
23 | hidden_dims = 250
24 | epochs = 2
25 |
26 | print('Loading data...')
27 | (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
28 | print(len(x_train), 'train sequences')
29 | print(len(x_test), 'test sequences')
30 |
31 | print('Pad sequences (samples x time)')
32 | x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
33 | x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
34 | print('x_train shape:', x_train.shape)
35 | print('x_test shape:', x_test.shape)
36 |
37 | print('Build model...')
38 | model = Sequential()
39 |
40 | # we start off with an efficient embedding layer which maps
41 | # our vocab indices into embedding_dims dimensions
42 | model.add(Embedding(max_features,
43 | embedding_dims,
44 | input_length=maxlen))
45 | model.add(Dropout(0.2))
46 |
47 | # we add a Convolution1D, which will learn filters
48 | # word group filters of size filter_length:
49 | model.add(Conv1D(filters,
50 | kernel_size,
51 | padding='valid',
52 | activation='relu',
53 | strides=1))
54 | # we use max pooling:
55 | model.add(GlobalMaxPooling1D())
56 |
57 | # We add a vanilla hidden layer:
58 | model.add(Dense(hidden_dims))
59 | model.add(Dropout(0.2))
60 | model.add(Activation('relu'))
61 |
62 | # We project onto a single unit output layer, and squash it with a sigmoid:
63 | model.add(Dense(1))
64 | model.add(Activation('sigmoid'))
65 |
66 | model.compile(loss='binary_crossentropy',
67 | optimizer='adam',
68 | metrics=['accuracy'])
69 | model.fit(x_train, y_train,
70 | batch_size=batch_size,
71 | epochs=epochs,
72 | validation_data=(x_test, y_test))
73 |
--------------------------------------------------------------------------------
/examples/imdb_cnn_lstm.py:
--------------------------------------------------------------------------------
1 | '''Train a recurrent convolutional network on the IMDB sentiment
2 | classification task.
3 |
4 | Gets to 0.8498 test accuracy after 2 epochs. 41s/epoch on K520 GPU.
5 | '''
6 | from __future__ import print_function
7 |
8 | from keras.preprocessing import sequence
9 | from keras.models import Sequential
10 | from keras.layers import Dense, Dropout, Activation
11 | from keras.layers import Embedding
12 | from keras.layers import LSTM
13 | from keras.layers import Conv1D, MaxPooling1D
14 | from keras.datasets import imdb
15 |
16 | # Embedding
17 | max_features = 20000
18 | maxlen = 100
19 | embedding_size = 128
20 |
21 | # Convolution
22 | kernel_size = 5
23 | filters = 64
24 | pool_size = 4
25 |
26 | # LSTM
27 | lstm_output_size = 70
28 |
29 | # Training
30 | batch_size = 30
31 | epochs = 2
32 |
33 | '''
34 | Note:
35 | batch_size is highly sensitive.
36 | Only 2 epochs are needed as the dataset is very small.
37 | '''
38 |
39 | print('Loading data...')
40 | (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
41 | print(len(x_train), 'train sequences')
42 | print(len(x_test), 'test sequences')
43 |
44 | print('Pad sequences (samples x time)')
45 | x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
46 | x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
47 | print('x_train shape:', x_train.shape)
48 | print('x_test shape:', x_test.shape)
49 |
50 | print('Build model...')
51 |
52 | model = Sequential()
53 | model.add(Embedding(max_features, embedding_size, input_length=maxlen))
54 | model.add(Dropout(0.25))
55 | model.add(Conv1D(filters,
56 | kernel_size,
57 | padding='valid',
58 | activation='relu',
59 | strides=1))
60 | model.add(MaxPooling1D(pool_size=pool_size))
61 | model.add(LSTM(lstm_output_size))
62 | model.add(Dense(1))
63 | model.add(Activation('sigmoid'))
64 |
65 | model.compile(loss='binary_crossentropy',
66 | optimizer='adam',
67 | metrics=['accuracy'])
68 |
69 | print('Train...')
70 | model.fit(x_train, y_train,
71 | batch_size=batch_size,
72 | epochs=epochs,
73 | validation_data=(x_test, y_test))
74 | score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)
75 | print('Test score:', score)
76 | print('Test accuracy:', acc)
77 |
--------------------------------------------------------------------------------
/examples/imdb_lstm.py:
--------------------------------------------------------------------------------
1 | '''Trains an LSTM model on the IMDB sentiment classification task.
2 |
3 | The dataset is actually too small for LSTM to be of any advantage
4 | compared to simpler, much faster methods such as TF-IDF + LogReg.
5 |
6 | # Notes
7 |
8 | - RNNs are tricky. Choice of batch size is important,
9 | choice of loss and optimizer is critical, etc.
10 | Some configurations won't converge.
11 |
12 | - LSTM loss decrease patterns during training can be quite different
13 | from what you see with CNNs/MLPs/etc.
14 | '''
15 | from __future__ import print_function
16 |
17 | from keras.preprocessing import sequence
18 | from keras.models import Sequential
19 | from keras.layers import Dense, Embedding
20 | from keras.layers import LSTM
21 | from keras.datasets import imdb
22 |
23 | max_features = 20000
24 | maxlen = 80 # cut texts after this number of words (among top max_features most common words)
25 | batch_size = 32
26 |
27 | print('Loading data...')
28 | (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
29 | print(len(x_train), 'train sequences')
30 | print(len(x_test), 'test sequences')
31 |
32 | print('Pad sequences (samples x time)')
33 | x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
34 | x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
35 | print('x_train shape:', x_train.shape)
36 | print('x_test shape:', x_test.shape)
37 |
38 | print('Build model...')
39 | model = Sequential()
40 | model.add(Embedding(max_features, 128))
41 | model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2))
42 | model.add(Dense(1, activation='sigmoid'))
43 |
44 | # try using different optimizers and different optimizer configs
45 | model.compile(loss='binary_crossentropy',
46 | optimizer='adam',
47 | metrics=['accuracy'])
48 |
49 | print('Train...')
50 | model.fit(x_train, y_train,
51 | batch_size=batch_size,
52 | epochs=15,
53 | validation_data=(x_test, y_test))
54 | score, acc = model.evaluate(x_test, y_test,
55 | batch_size=batch_size)
56 | print('Test score:', score)
57 | print('Test accuracy:', acc)
58 |
--------------------------------------------------------------------------------
/examples/lstm_text_generation.py:
--------------------------------------------------------------------------------
1 | '''Example script to generate text from Nietzsche's writings.
2 |
3 | At least 20 epochs are required before the generated text
4 | starts sounding coherent.
5 |
6 | It is recommended to run this script on GPU, as recurrent
7 | networks are quite computationally intensive.
8 |
9 | If you try this script on new data, make sure your corpus
10 | has at least ~100k characters. ~1M is better.
11 | '''
12 |
13 | from __future__ import print_function
14 | from keras.callbacks import LambdaCallback
15 | from keras.models import Sequential
16 | from keras.layers import Dense, Activation
17 | from keras.layers import LSTM
18 | from keras.optimizers import RMSprop
19 | from keras.utils.data_utils import get_file
20 | import numpy as np
21 | import random
22 | import sys
23 | import io
24 |
25 | path = get_file('nietzsche.txt', origin='https://s3.amazonaws.com/text-datasets/nietzsche.txt')
26 | with io.open(path, encoding='utf-8') as f:
27 | text = f.read().lower()
28 | print('corpus length:', len(text))
29 |
30 | chars = sorted(list(set(text)))
31 | print('total chars:', len(chars))
32 | char_indices = dict((c, i) for i, c in enumerate(chars))
33 | indices_char = dict((i, c) for i, c in enumerate(chars))
34 |
35 | # cut the text in semi-redundant sequences of maxlen characters
36 | maxlen = 40
37 | step = 3
38 | sentences = []
39 | next_chars = []
40 | for i in range(0, len(text) - maxlen, step):
41 | sentences.append(text[i: i + maxlen])
42 | next_chars.append(text[i + maxlen])
43 | print('nb sequences:', len(sentences))
44 |
45 | print('Vectorization...')
46 | x = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
47 | y = np.zeros((len(sentences), len(chars)), dtype=np.bool)
48 | for i, sentence in enumerate(sentences):
49 | for t, char in enumerate(sentence):
50 | x[i, t, char_indices[char]] = 1
51 | y[i, char_indices[next_chars[i]]] = 1
52 |
53 |
54 | # build the model: a single LSTM
55 | print('Build model...')
56 | model = Sequential()
57 | model.add(LSTM(128, input_shape=(maxlen, len(chars))))
58 | model.add(Dense(len(chars)))
59 | model.add(Activation('softmax'))
60 |
61 | optimizer = RMSprop(lr=0.01)
62 | model.compile(loss='categorical_crossentropy', optimizer=optimizer)
63 |
64 |
65 | def sample(preds, temperature=1.0):
66 | # helper function to sample an index from a probability array
67 | preds = np.asarray(preds).astype('float64')
68 | preds = np.log(preds) / temperature
69 | exp_preds = np.exp(preds)
70 | preds = exp_preds / np.sum(exp_preds)
71 | probas = np.random.multinomial(1, preds, 1)
72 | return np.argmax(probas)
73 |
74 |
75 | def on_epoch_end(epoch, logs):
76 | # Function invoked at end of each epoch. Prints generated text.
77 | print()
78 | print('----- Generating text after Epoch: %d' % epoch)
79 |
80 | start_index = random.randint(0, len(text) - maxlen - 1)
81 | for diversity in [0.2, 0.5, 1.0, 1.2]:
82 | print('----- diversity:', diversity)
83 |
84 | generated = ''
85 | sentence = text[start_index: start_index + maxlen]
86 | generated += sentence
87 | print('----- Generating with seed: "' + sentence + '"')
88 | sys.stdout.write(generated)
89 |
90 | for i in range(400):
91 | x_pred = np.zeros((1, maxlen, len(chars)))
92 | for t, char in enumerate(sentence):
93 | x_pred[0, t, char_indices[char]] = 1.
94 |
95 | preds = model.predict(x_pred, verbose=0)[0]
96 | next_index = sample(preds, diversity)
97 | next_char = indices_char[next_index]
98 |
99 | generated += next_char
100 | sentence = sentence[1:] + next_char
101 |
102 | sys.stdout.write(next_char)
103 | sys.stdout.flush()
104 | print()
105 |
106 | print_callback = LambdaCallback(on_epoch_end=on_epoch_end)
107 |
108 | model.fit(x, y,
109 | batch_size=128,
110 | epochs=60,
111 | callbacks=[print_callback])
112 |
--------------------------------------------------------------------------------
/examples/mnist_cnn.py:
--------------------------------------------------------------------------------
1 | '''Trains a simple convnet on the MNIST dataset.
2 |
3 | Gets to 99.25% test accuracy after 12 epochs
4 | (there is still a lot of margin for parameter tuning).
5 | 16 seconds per epoch on a GRID K520 GPU.
6 | '''
7 |
8 | from __future__ import print_function
9 | import keras
10 | from keras.datasets import mnist
11 | from keras.models import Sequential
12 | from keras.layers import Dense, Dropout, Flatten
13 | from keras.layers import Conv2D, MaxPooling2D
14 | from keras import backend as K
15 |
16 | batch_size = 128
17 | num_classes = 10
18 | epochs = 12
19 |
20 | # input image dimensions
21 | img_rows, img_cols = 28, 28
22 |
23 | # the data, split between train and test sets
24 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
25 |
26 | if K.image_data_format() == 'channels_first':
27 | x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
28 | x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
29 | input_shape = (1, img_rows, img_cols)
30 | else:
31 | x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
32 | x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
33 | input_shape = (img_rows, img_cols, 1)
34 |
35 | x_train = x_train.astype('float32')
36 | x_test = x_test.astype('float32')
37 | x_train /= 255
38 | x_test /= 255
39 | print('x_train shape:', x_train.shape)
40 | print(x_train.shape[0], 'train samples')
41 | print(x_test.shape[0], 'test samples')
42 |
43 | # convert class vectors to binary class matrices
44 | y_train = keras.utils.to_categorical(y_train, num_classes)
45 | y_test = keras.utils.to_categorical(y_test, num_classes)
46 |
47 | model = Sequential()
48 | model.add(Conv2D(32, kernel_size=(3, 3),
49 | activation='relu',
50 | input_shape=input_shape))
51 | model.add(Conv2D(64, (3, 3), activation='relu'))
52 | model.add(MaxPooling2D(pool_size=(2, 2)))
53 | model.add(Dropout(0.25))
54 | model.add(Flatten())
55 | model.add(Dense(128, activation='relu'))
56 | model.add(Dropout(0.5))
57 | model.add(Dense(num_classes, activation='softmax'))
58 |
59 | model.compile(loss=keras.losses.categorical_crossentropy,
60 | optimizer=keras.optimizers.Adadelta(),
61 | metrics=['accuracy'])
62 |
63 | model.fit(x_train, y_train,
64 | batch_size=batch_size,
65 | epochs=epochs,
66 | verbose=1,
67 | validation_data=(x_test, y_test))
68 | score = model.evaluate(x_test, y_test, verbose=0)
69 | print('Test loss:', score[0])
70 | print('Test accuracy:', score[1])
71 |
--------------------------------------------------------------------------------
/examples/mnist_dataset_api.py:
--------------------------------------------------------------------------------
1 | '''MNIST classification with TensorFlow's Dataset API.
2 |
3 | Introduced in TensorFlow 1.3, the Dataset API is now the
4 | standard method for loading data into TensorFlow models.
5 | A Dataset is a sequence of elements, which are themselves
6 | composed of tf.Tensor components. For more details, see:
7 | https://www.tensorflow.org/programmers_guide/datasets
8 |
9 | To use this with Keras, we make a dataset out of elements
10 | of the form (input batch, output batch). From there, we
11 | create a one-shot iterator and a graph node corresponding
12 | to its get_next() method. Its components are then provided
13 | to the network's Input layer and the Model.compile() method,
14 | respectively.
15 |
16 | This example is intended to closely follow the
17 | mnist_tfrecord.py example.
18 | '''
19 | import numpy as np
20 | import os
21 | import tempfile
22 |
23 | import keras
24 | from keras import backend as K
25 | from keras import layers
26 | from keras.datasets import mnist
27 |
28 | import tensorflow as tf
29 |
30 |
31 | if K.backend() != 'tensorflow':
32 | raise RuntimeError('This example can only run with the TensorFlow backend,'
33 | ' because it requires the Datset API, which is not'
34 | ' supported on other platforms.')
35 |
36 |
37 | def cnn_layers(inputs):
38 | x = layers.Conv2D(32, (3, 3),
39 | activation='relu', padding='valid')(inputs)
40 | x = layers.MaxPooling2D(pool_size=(2, 2))(x)
41 | x = layers.Conv2D(64, (3, 3), activation='relu')(x)
42 | x = layers.MaxPooling2D(pool_size=(2, 2))(x)
43 | x = layers.Flatten()(x)
44 | x = layers.Dense(512, activation='relu')(x)
45 | x = layers.Dropout(0.5)(x)
46 | predictions = layers.Dense(num_classes,
47 | activation='softmax',
48 | name='x_train_out')(x)
49 | return predictions
50 |
51 |
52 | batch_size = 128
53 | buffer_size = 10000
54 | steps_per_epoch = int(np.ceil(60000 / float(batch_size))) # = 469
55 | epochs = 5
56 | num_classes = 10
57 |
58 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
59 | x_train = x_train.astype(np.float32) / 255
60 | x_train = np.expand_dims(x_train, -1)
61 | y_train = tf.one_hot(y_train, num_classes)
62 |
63 | # Create the dataset and its associated one-shot iterator.
64 | dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
65 | dataset = dataset.repeat()
66 | dataset = dataset.shuffle(buffer_size)
67 | dataset = dataset.batch(batch_size)
68 | iterator = dataset.make_one_shot_iterator()
69 |
70 | # Model creation using tensors from the get_next() graph node.
71 | inputs, targets = iterator.get_next()
72 | model_input = layers.Input(tensor=inputs)
73 | model_output = cnn_layers(model_input)
74 | train_model = keras.models.Model(inputs=model_input, outputs=model_output)
75 |
76 | train_model.compile(optimizer=keras.optimizers.RMSprop(lr=2e-3, decay=1e-5),
77 | loss='categorical_crossentropy',
78 | metrics=['accuracy'],
79 | target_tensors=[targets])
80 | train_model.summary()
81 |
82 | train_model.fit(epochs=epochs,
83 | steps_per_epoch=steps_per_epoch)
84 |
85 | # Save the model weights.
86 | weight_path = os.path.join(tempfile.gettempdir(), 'saved_wt.h5')
87 | train_model.save_weights(weight_path)
88 |
89 | # Clean up the TF session.
90 | K.clear_session()
91 |
92 | # Second session to test loading trained model without tensors.
93 | x_test = x_test.astype(np.float32)
94 | x_test = np.expand_dims(x_test, -1)
95 |
96 | x_test_inp = layers.Input(shape=x_test.shape[1:])
97 | test_out = cnn_layers(x_test_inp)
98 | test_model = keras.models.Model(inputs=x_test_inp, outputs=test_out)
99 |
100 | test_model.load_weights(weight_path)
101 | test_model.compile(optimizer='rmsprop',
102 | loss='sparse_categorical_crossentropy',
103 | metrics=['accuracy'])
104 | test_model.summary()
105 |
106 | loss, acc = test_model.evaluate(x_test, y_test, num_classes)
107 | print('\nTest accuracy: {0}'.format(acc))
108 |
--------------------------------------------------------------------------------
/examples/mnist_hierarchical_rnn.py:
--------------------------------------------------------------------------------
1 | """Example of using Hierarchical RNN (HRNN) to classify MNIST digits.
2 |
3 | HRNNs can learn across multiple levels
4 | of temporal hierarchy over a complex sequence.
5 | Usually, the first recurrent layer of an HRNN
6 | encodes a sentence (e.g. of word vectors)
7 | into a sentence vector.
8 | The second recurrent layer then encodes a sequence of
9 | such vectors (encoded by the first layer) into a document vector.
10 | This document vector is considered to preserve both
11 | the word-level and sentence-level structure of the context.
12 |
13 | # References
14 |
15 | - [A Hierarchical Neural Autoencoder for Paragraphs and Documents](https://arxiv.org/abs/1506.01057)
16 | Encodes paragraphs and documents with HRNN.
17 | Results have shown that HRNN outperforms standard
18 | RNNs and may play some role in more sophisticated generation tasks like
19 | summarization or question answering.
20 | - [Hierarchical recurrent neural network for skeleton based action recognition](http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7298714)
21 | Achieved state-of-the-art results on
22 | skeleton based action recognition with 3 levels
23 | of bidirectional HRNN combined with fully connected layers.
24 |
25 | In the below MNIST example the first LSTM layer first encodes every
26 | column of pixels of shape (28, 1) to a column vector of shape (128,).
27 | The second LSTM layer encodes then these 28 column vectors of shape (28, 128)
28 | to a image vector representing the whole image.
29 | A final Dense layer is added for prediction.
30 |
31 | After 5 epochs: train acc: 0.9858, val acc: 0.9864
32 | """
33 | from __future__ import print_function
34 |
35 | import keras
36 | from keras.datasets import mnist
37 | from keras.models import Model
38 | from keras.layers import Input, Dense, TimeDistributed
39 | from keras.layers import LSTM
40 |
41 | # Training parameters.
42 | batch_size = 32
43 | num_classes = 10
44 | epochs = 5
45 |
46 | # Embedding dimensions.
47 | row_hidden = 128
48 | col_hidden = 128
49 |
50 | # The data, split between train and test sets.
51 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
52 |
53 | # Reshapes data to 4D for Hierarchical RNN.
54 | x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
55 | x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
56 | x_train = x_train.astype('float32')
57 | x_test = x_test.astype('float32')
58 | x_train /= 255
59 | x_test /= 255
60 | print('x_train shape:', x_train.shape)
61 | print(x_train.shape[0], 'train samples')
62 | print(x_test.shape[0], 'test samples')
63 |
64 | # Converts class vectors to binary class matrices.
65 | y_train = keras.utils.to_categorical(y_train, num_classes)
66 | y_test = keras.utils.to_categorical(y_test, num_classes)
67 |
68 | row, col, pixel = x_train.shape[1:]
69 |
70 | # 4D input.
71 | x = Input(shape=(row, col, pixel))
72 |
73 | # Encodes a row of pixels using TimeDistributed Wrapper.
74 | encoded_rows = TimeDistributed(LSTM(row_hidden))(x)
75 |
76 | # Encodes columns of encoded rows.
77 | encoded_columns = LSTM(col_hidden)(encoded_rows)
78 |
79 | # Final predictions and model.
80 | prediction = Dense(num_classes, activation='softmax')(encoded_columns)
81 | model = Model(x, prediction)
82 | model.compile(loss='categorical_crossentropy',
83 | optimizer='rmsprop',
84 | metrics=['accuracy'])
85 |
86 | # Training.
87 | model.fit(x_train, y_train,
88 | batch_size=batch_size,
89 | epochs=epochs,
90 | verbose=1,
91 | validation_data=(x_test, y_test))
92 |
93 | # Evaluation.
94 | scores = model.evaluate(x_test, y_test, verbose=0)
95 | print('Test loss:', scores[0])
96 | print('Test accuracy:', scores[1])
97 |
--------------------------------------------------------------------------------
/examples/mnist_irnn.py:
--------------------------------------------------------------------------------
1 | '''This is a reproduction of the IRNN experiment
2 | with pixel-by-pixel sequential MNIST in
3 | "A Simple Way to Initialize Recurrent Networks of Rectified Linear Units"
4 | by Quoc V. Le, Navdeep Jaitly, Geoffrey E. Hinton
5 |
6 | arxiv:1504.00941v2 [cs.NE] 7 Apr 2015
7 | http://arxiv.org/pdf/1504.00941v2.pdf
8 |
9 | Optimizer is replaced with RMSprop which yields more stable and steady
10 | improvement.
11 |
12 | Reaches 0.93 train/test accuracy after 900 epochs
13 | (which roughly corresponds to 1687500 steps in the original paper.)
14 | '''
15 |
16 | from __future__ import print_function
17 |
18 | import keras
19 | from keras.datasets import mnist
20 | from keras.models import Sequential
21 | from keras.layers import Dense, Activation
22 | from keras.layers import SimpleRNN
23 | from keras import initializers
24 | from keras.optimizers import RMSprop
25 |
26 | batch_size = 32
27 | num_classes = 10
28 | epochs = 200
29 | hidden_units = 100
30 |
31 | learning_rate = 1e-6
32 | clip_norm = 1.0
33 |
34 | # the data, split between train and test sets
35 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
36 |
37 | x_train = x_train.reshape(x_train.shape[0], -1, 1)
38 | x_test = x_test.reshape(x_test.shape[0], -1, 1)
39 | x_train = x_train.astype('float32')
40 | x_test = x_test.astype('float32')
41 | x_train /= 255
42 | x_test /= 255
43 | print('x_train shape:', x_train.shape)
44 | print(x_train.shape[0], 'train samples')
45 | print(x_test.shape[0], 'test samples')
46 |
47 | # convert class vectors to binary class matrices
48 | y_train = keras.utils.to_categorical(y_train, num_classes)
49 | y_test = keras.utils.to_categorical(y_test, num_classes)
50 |
51 | print('Evaluate IRNN...')
52 | model = Sequential()
53 | model.add(SimpleRNN(hidden_units,
54 | kernel_initializer=initializers.RandomNormal(stddev=0.001),
55 | recurrent_initializer=initializers.Identity(gain=1.0),
56 | activation='relu',
57 | input_shape=x_train.shape[1:]))
58 | model.add(Dense(num_classes))
59 | model.add(Activation('softmax'))
60 | rmsprop = RMSprop(lr=learning_rate)
61 | model.compile(loss='categorical_crossentropy',
62 | optimizer=rmsprop,
63 | metrics=['accuracy'])
64 |
65 | model.fit(x_train, y_train,
66 | batch_size=batch_size,
67 | epochs=epochs,
68 | verbose=1,
69 | validation_data=(x_test, y_test))
70 |
71 | scores = model.evaluate(x_test, y_test, verbose=0)
72 | print('IRNN test score:', scores[0])
73 | print('IRNN test accuracy:', scores[1])
74 |
--------------------------------------------------------------------------------
/examples/mnist_mlp.py:
--------------------------------------------------------------------------------
1 | '''Trains a simple deep NN on the MNIST dataset.
2 |
3 | Gets to 98.40% test accuracy after 20 epochs
4 | (there is *a lot* of margin for parameter tuning).
5 | 2 seconds per epoch on a K520 GPU.
6 | '''
7 |
8 | from __future__ import print_function
9 |
10 | import keras
11 | from keras.datasets import mnist
12 | from keras.models import Sequential
13 | from keras.layers import Dense, Dropout
14 | from keras.optimizers import RMSprop
15 |
16 | batch_size = 128
17 | num_classes = 10
18 | epochs = 20
19 |
20 | # the data, split between train and test sets
21 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
22 |
23 | x_train = x_train.reshape(60000, 784)
24 | x_test = x_test.reshape(10000, 784)
25 | x_train = x_train.astype('float32')
26 | x_test = x_test.astype('float32')
27 | x_train /= 255
28 | x_test /= 255
29 | print(x_train.shape[0], 'train samples')
30 | print(x_test.shape[0], 'test samples')
31 |
32 | # convert class vectors to binary class matrices
33 | y_train = keras.utils.to_categorical(y_train, num_classes)
34 | y_test = keras.utils.to_categorical(y_test, num_classes)
35 |
36 | model = Sequential()
37 | model.add(Dense(512, activation='relu', input_shape=(784,)))
38 | model.add(Dropout(0.2))
39 | model.add(Dense(512, activation='relu'))
40 | model.add(Dropout(0.2))
41 | model.add(Dense(num_classes, activation='softmax'))
42 |
43 | model.summary()
44 |
45 | model.compile(loss='categorical_crossentropy',
46 | optimizer=RMSprop(),
47 | metrics=['accuracy'])
48 |
49 | history = model.fit(x_train, y_train,
50 | batch_size=batch_size,
51 | epochs=epochs,
52 | verbose=1,
53 | validation_data=(x_test, y_test))
54 | score = model.evaluate(x_test, y_test, verbose=0)
55 | print('Test loss:', score[0])
56 | print('Test accuracy:', score[1])
57 |
--------------------------------------------------------------------------------
/examples/mnist_siamese.py:
--------------------------------------------------------------------------------
1 | '''Trains a Siamese MLP on pairs of digits from the MNIST dataset.
2 |
3 | It follows Hadsell-et-al.'06 [1] by computing the Euclidean distance on the
4 | output of the shared network and by optimizing the contrastive loss (see paper
5 | for mode details).
6 |
7 | # References
8 |
9 | - Dimensionality Reduction by Learning an Invariant Mapping
10 | http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf
11 |
12 | Gets to 97.2% test accuracy after 20 epochs.
13 | 2 seconds per epoch on a Titan X Maxwell GPU
14 | '''
15 | from __future__ import absolute_import
16 | from __future__ import print_function
17 | import numpy as np
18 |
19 | import random
20 | from keras.datasets import mnist
21 | from keras.models import Model
22 | from keras.layers import Input, Flatten, Dense, Dropout, Lambda
23 | from keras.optimizers import RMSprop
24 | from keras import backend as K
25 |
26 | num_classes = 10
27 | epochs = 20
28 |
29 |
30 | def euclidean_distance(vects):
31 | x, y = vects
32 | return K.sqrt(K.maximum(K.sum(K.square(x - y), axis=1, keepdims=True), K.epsilon()))
33 |
34 |
35 | def eucl_dist_output_shape(shapes):
36 | shape1, shape2 = shapes
37 | return (shape1[0], 1)
38 |
39 |
40 | def contrastive_loss(y_true, y_pred):
41 | '''Contrastive loss from Hadsell-et-al.'06
42 | http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf
43 | '''
44 | margin = 1
45 | return K.mean(y_true * K.square(y_pred) +
46 | (1 - y_true) * K.square(K.maximum(margin - y_pred, 0)))
47 |
48 |
49 | def create_pairs(x, digit_indices):
50 | '''Positive and negative pair creation.
51 | Alternates between positive and negative pairs.
52 | '''
53 | pairs = []
54 | labels = []
55 | n = min([len(digit_indices[d]) for d in range(num_classes)]) - 1
56 | for d in range(num_classes):
57 | for i in range(n):
58 | z1, z2 = digit_indices[d][i], digit_indices[d][i + 1]
59 | pairs += [[x[z1], x[z2]]]
60 | inc = random.randrange(1, num_classes)
61 | dn = (d + inc) % num_classes
62 | z1, z2 = digit_indices[d][i], digit_indices[dn][i]
63 | pairs += [[x[z1], x[z2]]]
64 | labels += [1, 0]
65 | return np.array(pairs), np.array(labels)
66 |
67 |
68 | def create_base_network(input_shape):
69 | '''Base network to be shared (eq. to feature extraction).
70 | '''
71 | input = Input(shape=input_shape)
72 | x = Flatten()(input)
73 | x = Dense(128, activation='relu')(x)
74 | x = Dropout(0.1)(x)
75 | x = Dense(128, activation='relu')(x)
76 | x = Dropout(0.1)(x)
77 | x = Dense(128, activation='relu')(x)
78 | return Model(input, x)
79 |
80 |
81 | def compute_accuracy(y_true, y_pred):
82 | '''Compute classification accuracy with a fixed threshold on distances.
83 | '''
84 | pred = y_pred.ravel() < 0.5
85 | return np.mean(pred == y_true)
86 |
87 |
88 | def accuracy(y_true, y_pred):
89 | '''Compute classification accuracy with a fixed threshold on distances.
90 | '''
91 | return K.mean(K.equal(y_true, K.cast(y_pred < 0.5, y_true.dtype)))
92 |
93 |
94 | # the data, split between train and test sets
95 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
96 | x_train = x_train.astype('float32')
97 | x_test = x_test.astype('float32')
98 | x_train /= 255
99 | x_test /= 255
100 | input_shape = x_train.shape[1:]
101 |
102 | # create training+test positive and negative pairs
103 | digit_indices = [np.where(y_train == i)[0] for i in range(num_classes)]
104 | tr_pairs, tr_y = create_pairs(x_train, digit_indices)
105 |
106 | digit_indices = [np.where(y_test == i)[0] for i in range(num_classes)]
107 | te_pairs, te_y = create_pairs(x_test, digit_indices)
108 |
109 | # network definition
110 | base_network = create_base_network(input_shape)
111 |
112 | input_a = Input(shape=input_shape)
113 | input_b = Input(shape=input_shape)
114 |
115 | # because we re-use the same instance `base_network`,
116 | # the weights of the network
117 | # will be shared across the two branches
118 | processed_a = base_network(input_a)
119 | processed_b = base_network(input_b)
120 |
121 | distance = Lambda(euclidean_distance,
122 | output_shape=eucl_dist_output_shape)([processed_a, processed_b])
123 |
124 | model = Model([input_a, input_b], distance)
125 |
126 | # train
127 | rms = RMSprop()
128 | model.compile(loss=contrastive_loss, optimizer=rms, metrics=[accuracy])
129 | model.fit([tr_pairs[:, 0], tr_pairs[:, 1]], tr_y,
130 | batch_size=128,
131 | epochs=epochs,
132 | validation_data=([te_pairs[:, 0], te_pairs[:, 1]], te_y))
133 |
134 | # compute final accuracy on training and test sets
135 | y_pred = model.predict([tr_pairs[:, 0], tr_pairs[:, 1]])
136 | tr_acc = compute_accuracy(tr_y, y_pred)
137 | y_pred = model.predict([te_pairs[:, 0], te_pairs[:, 1]])
138 | te_acc = compute_accuracy(te_y, y_pred)
139 |
140 | print('* Accuracy on training set: %0.2f%%' % (100 * tr_acc))
141 | print('* Accuracy on test set: %0.2f%%' % (100 * te_acc))
142 |
--------------------------------------------------------------------------------
/examples/mnist_sklearn_wrapper.py:
--------------------------------------------------------------------------------
1 | '''Example of how to use sklearn wrapper
2 |
3 | Builds simple CNN models on MNIST and uses sklearn's GridSearchCV to find best model
4 | '''
5 |
6 | from __future__ import print_function
7 |
8 | import keras
9 | from keras.datasets import mnist
10 | from keras.models import Sequential
11 | from keras.layers import Dense, Dropout, Activation, Flatten
12 | from keras.layers import Conv2D, MaxPooling2D
13 | from keras.wrappers.scikit_learn import KerasClassifier
14 | from keras import backend as K
15 | from sklearn.grid_search import GridSearchCV
16 |
17 |
18 | num_classes = 10
19 |
20 | # input image dimensions
21 | img_rows, img_cols = 28, 28
22 |
23 | # load training data and do basic data normalization
24 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
25 |
26 | if K.image_data_format() == 'channels_first':
27 | x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
28 | x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
29 | input_shape = (1, img_rows, img_cols)
30 | else:
31 | x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
32 | x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
33 | input_shape = (img_rows, img_cols, 1)
34 |
35 | x_train = x_train.astype('float32')
36 | x_test = x_test.astype('float32')
37 | x_train /= 255
38 | x_test /= 255
39 |
40 | # convert class vectors to binary class matrices
41 | y_train = keras.utils.to_categorical(y_train, num_classes)
42 | y_test = keras.utils.to_categorical(y_test, num_classes)
43 |
44 |
45 | def make_model(dense_layer_sizes, filters, kernel_size, pool_size):
46 | '''Creates model comprised of 2 convolutional layers followed by dense layers
47 |
48 | dense_layer_sizes: List of layer sizes.
49 | This list has one number for each layer
50 | filters: Number of convolutional filters in each convolutional layer
51 | kernel_size: Convolutional kernel size
52 | pool_size: Size of pooling area for max pooling
53 | '''
54 |
55 | model = Sequential()
56 | model.add(Conv2D(filters, kernel_size,
57 | padding='valid',
58 | input_shape=input_shape))
59 | model.add(Activation('relu'))
60 | model.add(Conv2D(filters, kernel_size))
61 | model.add(Activation('relu'))
62 | model.add(MaxPooling2D(pool_size=pool_size))
63 | model.add(Dropout(0.25))
64 |
65 | model.add(Flatten())
66 | for layer_size in dense_layer_sizes:
67 | model.add(Dense(layer_size))
68 | model.add(Activation('relu'))
69 | model.add(Dropout(0.5))
70 | model.add(Dense(num_classes))
71 | model.add(Activation('softmax'))
72 |
73 | model.compile(loss='categorical_crossentropy',
74 | optimizer='adadelta',
75 | metrics=['accuracy'])
76 |
77 | return model
78 |
79 | dense_size_candidates = [[32], [64], [32, 32], [64, 64]]
80 | my_classifier = KerasClassifier(make_model, batch_size=32)
81 | validator = GridSearchCV(my_classifier,
82 | param_grid={'dense_layer_sizes': dense_size_candidates,
83 | # epochs is avail for tuning even when not
84 | # an argument to model building function
85 | 'epochs': [3, 6],
86 | 'filters': [8],
87 | 'kernel_size': [3],
88 | 'pool_size': [2]},
89 | scoring='neg_log_loss',
90 | n_jobs=1)
91 | validator.fit(x_train, y_train)
92 |
93 | print('The parameters of the best model are: ')
94 | print(validator.best_params_)
95 |
96 | # validator.best_estimator_ returns sklearn-wrapped version of best model.
97 | # validator.best_estimator_.model returns the (unwrapped) keras model
98 | best_model = validator.best_estimator_.model
99 | metric_names = best_model.metrics_names
100 | metric_values = best_model.evaluate(x_test, y_test)
101 | for metric, value in zip(metric_names, metric_values):
102 | print(metric, ': ', value)
103 |
--------------------------------------------------------------------------------
/examples/mnist_transfer_cnn.py:
--------------------------------------------------------------------------------
1 | '''Transfer learning toy example.
2 |
3 | 1 - Train a simple convnet on the MNIST dataset the first 5 digits [0..4].
4 | 2 - Freeze convolutional layers and fine-tune dense layers
5 | for the classification of digits [5..9].
6 |
7 | Get to 99.8% test accuracy after 5 epochs
8 | for the first five digits classifier
9 | and 99.2% for the last five digits after transfer + fine-tuning.
10 | '''
11 |
12 | from __future__ import print_function
13 |
14 | import datetime
15 | import keras
16 | from keras.datasets import mnist
17 | from keras.models import Sequential
18 | from keras.layers import Dense, Dropout, Activation, Flatten
19 | from keras.layers import Conv2D, MaxPooling2D
20 | from keras import backend as K
21 |
22 | now = datetime.datetime.now
23 |
24 | batch_size = 128
25 | num_classes = 5
26 | epochs = 5
27 |
28 | # input image dimensions
29 | img_rows, img_cols = 28, 28
30 | # number of convolutional filters to use
31 | filters = 32
32 | # size of pooling area for max pooling
33 | pool_size = 2
34 | # convolution kernel size
35 | kernel_size = 3
36 |
37 | if K.image_data_format() == 'channels_first':
38 | input_shape = (1, img_rows, img_cols)
39 | else:
40 | input_shape = (img_rows, img_cols, 1)
41 |
42 |
43 | def train_model(model, train, test, num_classes):
44 | x_train = train[0].reshape((train[0].shape[0],) + input_shape)
45 | x_test = test[0].reshape((test[0].shape[0],) + input_shape)
46 | x_train = x_train.astype('float32')
47 | x_test = x_test.astype('float32')
48 | x_train /= 255
49 | x_test /= 255
50 | print('x_train shape:', x_train.shape)
51 | print(x_train.shape[0], 'train samples')
52 | print(x_test.shape[0], 'test samples')
53 |
54 | # convert class vectors to binary class matrices
55 | y_train = keras.utils.to_categorical(train[1], num_classes)
56 | y_test = keras.utils.to_categorical(test[1], num_classes)
57 |
58 | model.compile(loss='categorical_crossentropy',
59 | optimizer='adadelta',
60 | metrics=['accuracy'])
61 |
62 | t = now()
63 | model.fit(x_train, y_train,
64 | batch_size=batch_size,
65 | epochs=epochs,
66 | verbose=1,
67 | validation_data=(x_test, y_test))
68 | print('Training time: %s' % (now() - t))
69 | score = model.evaluate(x_test, y_test, verbose=0)
70 | print('Test score:', score[0])
71 | print('Test accuracy:', score[1])
72 |
73 |
74 | # the data, split between train and test sets
75 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
76 |
77 | # create two datasets one with digits below 5 and one with 5 and above
78 | x_train_lt5 = x_train[y_train < 5]
79 | y_train_lt5 = y_train[y_train < 5]
80 | x_test_lt5 = x_test[y_test < 5]
81 | y_test_lt5 = y_test[y_test < 5]
82 |
83 | x_train_gte5 = x_train[y_train >= 5]
84 | y_train_gte5 = y_train[y_train >= 5] - 5
85 | x_test_gte5 = x_test[y_test >= 5]
86 | y_test_gte5 = y_test[y_test >= 5] - 5
87 |
88 | # define two groups of layers: feature (convolutions) and classification (dense)
89 | feature_layers = [
90 | Conv2D(filters, kernel_size,
91 | padding='valid',
92 | input_shape=input_shape),
93 | Activation('relu'),
94 | Conv2D(filters, kernel_size),
95 | Activation('relu'),
96 | MaxPooling2D(pool_size=pool_size),
97 | Dropout(0.25),
98 | Flatten(),
99 | ]
100 |
101 | classification_layers = [
102 | Dense(128),
103 | Activation('relu'),
104 | Dropout(0.5),
105 | Dense(num_classes),
106 | Activation('softmax')
107 | ]
108 |
109 | # create complete model
110 | model = Sequential(feature_layers + classification_layers)
111 |
112 | # train model for 5-digit classification [0..4]
113 | train_model(model,
114 | (x_train_lt5, y_train_lt5),
115 | (x_test_lt5, y_test_lt5), num_classes)
116 |
117 | # freeze feature layers and rebuild model
118 | for l in feature_layers:
119 | l.trainable = False
120 |
121 | # transfer: train dense layers for new classification task [5..9]
122 | train_model(model,
123 | (x_train_gte5, y_train_gte5),
124 | (x_test_gte5, y_test_gte5), num_classes)
125 |
--------------------------------------------------------------------------------
/examples/reuters_mlp.py:
--------------------------------------------------------------------------------
1 | '''Trains and evaluate a simple MLP
2 | on the Reuters newswire topic classification task.
3 | '''
4 | from __future__ import print_function
5 |
6 | import numpy as np
7 | import keras
8 | from keras.datasets import reuters
9 | from keras.models import Sequential
10 | from keras.layers import Dense, Dropout, Activation
11 | from keras.preprocessing.text import Tokenizer
12 |
13 | max_words = 1000
14 | batch_size = 32
15 | epochs = 5
16 |
17 | print('Loading data...')
18 | (x_train, y_train), (x_test, y_test) = reuters.load_data(num_words=max_words,
19 | test_split=0.2)
20 | print(len(x_train), 'train sequences')
21 | print(len(x_test), 'test sequences')
22 |
23 | num_classes = np.max(y_train) + 1
24 | print(num_classes, 'classes')
25 |
26 | print('Vectorizing sequence data...')
27 | tokenizer = Tokenizer(num_words=max_words)
28 | x_train = tokenizer.sequences_to_matrix(x_train, mode='binary')
29 | x_test = tokenizer.sequences_to_matrix(x_test, mode='binary')
30 | print('x_train shape:', x_train.shape)
31 | print('x_test shape:', x_test.shape)
32 |
33 | print('Convert class vector to binary class matrix '
34 | '(for use with categorical_crossentropy)')
35 | y_train = keras.utils.to_categorical(y_train, num_classes)
36 | y_test = keras.utils.to_categorical(y_test, num_classes)
37 | print('y_train shape:', y_train.shape)
38 | print('y_test shape:', y_test.shape)
39 |
40 | print('Building model...')
41 | model = Sequential()
42 | model.add(Dense(512, input_shape=(max_words,)))
43 | model.add(Activation('relu'))
44 | model.add(Dropout(0.5))
45 | model.add(Dense(num_classes))
46 | model.add(Activation('softmax'))
47 |
48 | model.compile(loss='categorical_crossentropy',
49 | optimizer='adam',
50 | metrics=['accuracy'])
51 |
52 | history = model.fit(x_train, y_train,
53 | batch_size=batch_size,
54 | epochs=epochs,
55 | verbose=1,
56 | validation_split=0.1)
57 | score = model.evaluate(x_test, y_test,
58 | batch_size=batch_size, verbose=1)
59 | print('Test score:', score[0])
60 | print('Test accuracy:', score[1])
61 |
--------------------------------------------------------------------------------
/examples/tensorboard_embeddings_mnist.py:
--------------------------------------------------------------------------------
1 | '''Trains a simple convnet on the MNIST dataset and embeds test data.
2 |
3 | The test data is embedded using the weights of the final dense layer, just
4 | before the classification head. This embedding can then be visualized using
5 | TensorBoard's Embedding Projector.
6 | '''
7 |
8 | from __future__ import print_function
9 |
10 | from os import makedirs
11 | from os.path import exists, join
12 |
13 | import keras
14 | from keras.callbacks import TensorBoard
15 | from keras.datasets import mnist
16 | from keras.models import Sequential
17 | from keras.layers import Dense, Dropout, Flatten
18 | from keras.layers import Conv2D, MaxPooling2D
19 | from keras import backend as K
20 |
21 | import numpy as np
22 |
23 | batch_size = 128
24 | num_classes = 10
25 | epochs = 12
26 | log_dir = './logs'
27 |
28 | if not exists(log_dir):
29 | makedirs(log_dir)
30 |
31 | # input image dimensions
32 | img_rows, img_cols = 28, 28
33 |
34 | # the data, split between train and test sets
35 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
36 |
37 | if K.image_data_format() == 'channels_first':
38 | x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
39 | x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
40 | input_shape = (1, img_rows, img_cols)
41 | else:
42 | x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
43 | x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
44 | input_shape = (img_rows, img_cols, 1)
45 |
46 | x_train = x_train.astype('float32')
47 | x_test = x_test.astype('float32')
48 | x_train /= 255
49 | x_test /= 255
50 | print('x_train shape:', x_train.shape)
51 | print(x_train.shape[0], 'train samples')
52 | print(x_test.shape[0], 'test samples')
53 |
54 | # save class labels to disk to color data points in TensorBoard accordingly
55 | with open(join(log_dir, 'metadata.tsv'), 'w') as f:
56 | np.savetxt(f, y_test)
57 |
58 | # convert class vectors to binary class matrices
59 | y_train = keras.utils.to_categorical(y_train, num_classes)
60 | y_test = keras.utils.to_categorical(y_test, num_classes)
61 |
62 | tensorboard = TensorBoard(batch_size=batch_size,
63 | embeddings_freq=1,
64 | embeddings_layer_names=['features'],
65 | embeddings_metadata='metadata.tsv',
66 | embeddings_data=x_test)
67 |
68 | model = Sequential()
69 | model.add(Conv2D(32, kernel_size=(3, 3),
70 | activation='relu',
71 | input_shape=input_shape))
72 | model.add(Conv2D(64, (3, 3), activation='relu'))
73 | model.add(MaxPooling2D(pool_size=(2, 2)))
74 | model.add(Dropout(0.25))
75 | model.add(Flatten())
76 | model.add(Dense(128, activation='relu', name='features'))
77 | model.add(Dropout(0.5))
78 | model.add(Dense(num_classes, activation='softmax'))
79 |
80 | model.compile(loss=keras.losses.categorical_crossentropy,
81 | optimizer=keras.optimizers.Adadelta(),
82 | metrics=['accuracy'])
83 |
84 | model.fit(x_train, y_train,
85 | batch_size=batch_size,
86 | callbacks=[tensorboard],
87 | epochs=epochs,
88 | verbose=1,
89 | validation_data=(x_test, y_test))
90 | score = model.evaluate(x_test, y_test, verbose=0)
91 | print('Test loss:', score[0])
92 | print('Test accuracy:', score[1])
93 |
94 | # You can now launch tensorboard with `tensorboard --logdir=./logs` on your
95 | # command line and then go to http://localhost:6006/#projector to view the
96 | # embeddings
97 |
--------------------------------------------------------------------------------
/keras/__init__.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 |
3 | from . import utils
4 | from . import activations
5 | from . import applications
6 | from . import backend
7 | from . import datasets
8 | from . import engine
9 | from . import layers
10 | from . import preprocessing
11 | from . import wrappers
12 | from . import callbacks
13 | from . import constraints
14 | from . import initializers
15 | from . import metrics
16 | from . import models
17 | from . import losses
18 | from . import optimizers
19 | from . import regularizers
20 |
21 | # Also importable from root
22 | from .layers import Input
23 | from .models import Model
24 | from .models import Sequential
25 |
26 | __version__ = '2.2.0'
27 |
--------------------------------------------------------------------------------
/keras/applications/__init__.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from .. import backend
6 | from .. import engine
7 | from .. import layers
8 | from .. import models
9 | from .. import utils
10 |
11 | import keras_applications
12 |
13 | keras_applications.set_keras_submodules(
14 | backend=backend,
15 | engine=engine,
16 | layers=layers,
17 | models=models,
18 | utils=utils)
19 |
20 | from .vgg16 import VGG16
21 | from .vgg19 import VGG19
22 | from .resnet50 import ResNet50
23 | from .inception_v3 import InceptionV3
24 | from .inception_resnet_v2 import InceptionResNetV2
25 | from .xception import Xception
26 | from .mobilenet import MobileNet
27 | from .mobilenetv2 import MobileNetV2
28 | from .densenet import DenseNet121, DenseNet169, DenseNet201
29 | from .nasnet import NASNetMobile, NASNetLarge
30 |
--------------------------------------------------------------------------------
/keras/applications/densenet.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import densenet
6 |
7 | DenseNet121 = densenet.DenseNet121
8 | DenseNet169 = densenet.DenseNet169
9 | DenseNet201 = densenet.DenseNet201
10 | decode_predictions = densenet.decode_predictions
11 | preprocess_input = densenet.preprocess_input
12 |
--------------------------------------------------------------------------------
/keras/applications/inception_resnet_v2.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import inception_resnet_v2
6 |
7 | InceptionResNetV2 = inception_resnet_v2.InceptionResNetV2
8 | decode_predictions = inception_resnet_v2.decode_predictions
9 | preprocess_input = inception_resnet_v2.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/applications/inception_v3.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import inception_v3
6 |
7 | InceptionV3 = inception_v3.InceptionV3
8 | decode_predictions = inception_v3.decode_predictions
9 | preprocess_input = inception_v3.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/applications/mobilenet.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import mobilenet
6 |
7 | MobileNet = mobilenet.MobileNet
8 | decode_predictions = mobilenet.decode_predictions
9 | preprocess_input = mobilenet.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/applications/mobilenetv2.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import mobilenet_v2
6 |
7 | MobileNetV2 = mobilenet_v2.MobileNetV2
8 | decode_predictions = mobilenet_v2.decode_predictions
9 | preprocess_input = mobilenet_v2.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/applications/nasnet.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import nasnet
6 |
7 | NASNetMobile = nasnet.NASNetMobile
8 | NASNetLarge = nasnet.NASNetLarge
9 | decode_predictions = nasnet.decode_predictions
10 | preprocess_input = nasnet.preprocess_input
11 |
--------------------------------------------------------------------------------
/keras/applications/resnet50.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import resnet50
6 |
7 | ResNet50 = resnet50.ResNet50
8 | decode_predictions = resnet50.decode_predictions
9 | preprocess_input = resnet50.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/applications/vgg16.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import vgg16
6 |
7 | VGG16 = vgg16.VGG16
8 | decode_predictions = vgg16.decode_predictions
9 | preprocess_input = vgg16.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/applications/vgg19.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import vgg19
6 |
7 | VGG19 = vgg19.VGG19
8 | decode_predictions = vgg19.decode_predictions
9 | preprocess_input = vgg19.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/applications/xception.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from keras_applications import xception
6 |
7 | Xception = xception.Xception
8 | decode_predictions = xception.decode_predictions
9 | preprocess_input = xception.preprocess_input
10 |
--------------------------------------------------------------------------------
/keras/backend/__init__.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import print_function
3 | import os
4 | import json
5 | import sys
6 | import importlib
7 | from .common import epsilon
8 | from .common import floatx
9 | from .common import set_epsilon
10 | from .common import set_floatx
11 | from .common import cast_to_floatx
12 | from .common import image_data_format
13 | from .common import set_image_data_format
14 |
15 | # Set Keras base dir path given KERAS_HOME env variable, if applicable.
16 | # Otherwise either ~/.keras or /tmp.
17 | if 'KERAS_HOME' in os.environ:
18 | _keras_dir = os.environ.get('KERAS_HOME')
19 | else:
20 | _keras_base_dir = os.path.expanduser('~')
21 | if not os.access(_keras_base_dir, os.W_OK):
22 | _keras_base_dir = '/tmp'
23 | _keras_dir = os.path.join(_keras_base_dir, '.keras')
24 |
25 | # Default backend: TensorFlow.
26 | _BACKEND = 'tensorflow'
27 |
28 | # Attempt to read Keras config file.
29 | _config_path = os.path.expanduser(os.path.join(_keras_dir, 'keras.json'))
30 | if os.path.exists(_config_path):
31 | try:
32 | with open(_config_path) as f:
33 | _config = json.load(f)
34 | except ValueError:
35 | _config = {}
36 | _floatx = _config.get('floatx', floatx())
37 | assert _floatx in {'float16', 'float32', 'float64'}
38 | _epsilon = _config.get('epsilon', epsilon())
39 | assert isinstance(_epsilon, float)
40 | _backend = _config.get('backend', _BACKEND)
41 | _image_data_format = _config.get('image_data_format',
42 | image_data_format())
43 | assert _image_data_format in {'channels_last', 'channels_first'}
44 |
45 | set_floatx(_floatx)
46 | set_epsilon(_epsilon)
47 | set_image_data_format(_image_data_format)
48 | _BACKEND = _backend
49 |
50 | # Save config file, if possible.
51 | if not os.path.exists(_keras_dir):
52 | try:
53 | os.makedirs(_keras_dir)
54 | except OSError:
55 | # Except permission denied and potential race conditions
56 | # in multi-threaded environments.
57 | pass
58 |
59 | if not os.path.exists(_config_path):
60 | _config = {
61 | 'floatx': floatx(),
62 | 'epsilon': epsilon(),
63 | 'backend': _BACKEND,
64 | 'image_data_format': image_data_format()
65 | }
66 | try:
67 | with open(_config_path, 'w') as f:
68 | f.write(json.dumps(_config, indent=4))
69 | except IOError:
70 | # Except permission denied.
71 | pass
72 |
73 | # Set backend based on KERAS_BACKEND flag, if applicable.
74 | if 'KERAS_BACKEND' in os.environ:
75 | _backend = os.environ['KERAS_BACKEND']
76 | _BACKEND = _backend
77 |
78 | # Import backend functions.
79 | if _BACKEND == 'cntk':
80 | sys.stderr.write('Using CNTK backend\n')
81 | from .cntk_backend import *
82 | elif _BACKEND == 'theano':
83 | sys.stderr.write('Using Theano backend.\n')
84 | from .theano_backend import *
85 | elif _BACKEND == 'tensorflow':
86 | sys.stderr.write('Using TensorFlow backend.\n')
87 | from .tensorflow_backend import *
88 | else:
89 | # Try and load external backend.
90 | try:
91 | backend_module = importlib.import_module(_BACKEND)
92 | entries = backend_module.__dict__
93 | # Check if valid backend.
94 | # Module is a valid backend if it has the required entries.
95 | required_entries = ['placeholder', 'variable', 'function']
96 | for e in required_entries:
97 | if e not in entries:
98 | raise ValueError('Invalid backend. Missing required entry : ' + e)
99 | namespace = globals()
100 | for k, v in entries.items():
101 | # Make sure we don't override any entries from common, such as epsilon.
102 | if k not in namespace:
103 | namespace[k] = v
104 | sys.stderr.write('Using ' + _BACKEND + ' backend.\n')
105 | except ImportError:
106 | raise ValueError('Unable to import backend : ' + str(_BACKEND))
107 |
108 |
109 | def backend():
110 | """Publicly accessible method
111 | for determining the current backend.
112 |
113 | # Returns
114 | String, the name of the backend Keras is currently using.
115 |
116 | # Example
117 | ```python
118 | >>> keras.backend.backend()
119 | 'tensorflow'
120 | ```
121 | """
122 | return _BACKEND
123 |
--------------------------------------------------------------------------------
/keras/backend/common.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | import numpy as np
6 |
7 | # the type of float to use throughout the session.
8 | _FLOATX = 'float32'
9 | _EPSILON = 1e-7
10 | _IMAGE_DATA_FORMAT = 'channels_last'
11 |
12 |
13 | def epsilon():
14 | """Returns the value of the fuzz factor used in numeric expressions.
15 |
16 | # Returns
17 | A float.
18 |
19 | # Example
20 | ```python
21 | >>> keras.backend.epsilon()
22 | 1e-07
23 | ```
24 | """
25 | return _EPSILON
26 |
27 |
28 | def set_epsilon(e):
29 | """Sets the value of the fuzz factor used in numeric expressions.
30 |
31 | # Arguments
32 | e: float. New value of epsilon.
33 |
34 | # Example
35 | ```python
36 | >>> from keras import backend as K
37 | >>> K.epsilon()
38 | 1e-07
39 | >>> K.set_epsilon(1e-05)
40 | >>> K.epsilon()
41 | 1e-05
42 | ```
43 | """
44 | global _EPSILON
45 | _EPSILON = e
46 |
47 |
48 | def floatx():
49 | """Returns the default float type, as a string.
50 | (e.g. 'float16', 'float32', 'float64').
51 |
52 | # Returns
53 | String, the current default float type.
54 |
55 | # Example
56 | ```python
57 | >>> keras.backend.floatx()
58 | 'float32'
59 | ```
60 | """
61 | return _FLOATX
62 |
63 |
64 | def set_floatx(floatx):
65 | """Sets the default float type.
66 |
67 | # Arguments
68 | floatx: String, 'float16', 'float32', or 'float64'.
69 |
70 | # Example
71 | ```python
72 | >>> from keras import backend as K
73 | >>> K.floatx()
74 | 'float32'
75 | >>> K.set_floatx('float16')
76 | >>> K.floatx()
77 | 'float16'
78 | ```
79 | """
80 | global _FLOATX
81 | if floatx not in {'float16', 'float32', 'float64'}:
82 | raise ValueError('Unknown floatx type: ' + str(floatx))
83 | _FLOATX = str(floatx)
84 |
85 |
86 | def cast_to_floatx(x):
87 | """Cast a Numpy array to the default Keras float type.
88 |
89 | # Arguments
90 | x: Numpy array.
91 |
92 | # Returns
93 | The same Numpy array, cast to its new type.
94 |
95 | # Example
96 | ```python
97 | >>> from keras import backend as K
98 | >>> K.floatx()
99 | 'float32'
100 | >>> arr = numpy.array([1.0, 2.0], dtype='float64')
101 | >>> arr.dtype
102 | dtype('float64')
103 | >>> new_arr = K.cast_to_floatx(arr)
104 | >>> new_arr
105 | array([ 1., 2.], dtype=float32)
106 | >>> new_arr.dtype
107 | dtype('float32')
108 | ```
109 | """
110 | return np.asarray(x, dtype=_FLOATX)
111 |
112 |
113 | def image_data_format():
114 | """Returns the default image data format convention ('channels_first' or 'channels_last').
115 |
116 | # Returns
117 | A string, either `'channels_first'` or `'channels_last'`
118 |
119 | # Example
120 | ```python
121 | >>> keras.backend.image_data_format()
122 | 'channels_first'
123 | ```
124 | """
125 | return _IMAGE_DATA_FORMAT
126 |
127 |
128 | def set_image_data_format(data_format):
129 | """Sets the value of the data format convention.
130 |
131 | # Arguments
132 | data_format: string. `'channels_first'` or `'channels_last'`.
133 |
134 | # Example
135 | ```python
136 | >>> from keras import backend as K
137 | >>> K.image_data_format()
138 | 'channels_first'
139 | >>> K.set_image_data_format('channels_last')
140 | >>> K.image_data_format()
141 | 'channels_last'
142 | ```
143 | """
144 | global _IMAGE_DATA_FORMAT
145 | if data_format not in {'channels_last', 'channels_first'}:
146 | raise ValueError('Unknown data_format:', data_format)
147 | _IMAGE_DATA_FORMAT = str(data_format)
148 |
149 |
150 | # Legacy methods
151 |
152 | def set_image_dim_ordering(dim_ordering):
153 | """Legacy setter for `image_data_format`.
154 |
155 | # Arguments
156 | dim_ordering: string. `tf` or `th`.
157 |
158 | # Example
159 | ```python
160 | >>> from keras import backend as K
161 | >>> K.image_data_format()
162 | 'channels_first'
163 | >>> K.set_image_data_format('channels_last')
164 | >>> K.image_data_format()
165 | 'channels_last'
166 | ```
167 |
168 | # Raises
169 | ValueError: if `dim_ordering` is invalid.
170 | """
171 | global _IMAGE_DATA_FORMAT
172 | if dim_ordering not in {'tf', 'th'}:
173 | raise ValueError('Unknown dim_ordering:', dim_ordering)
174 | if dim_ordering == 'th':
175 | data_format = 'channels_first'
176 | else:
177 | data_format = 'channels_last'
178 | _IMAGE_DATA_FORMAT = data_format
179 |
180 |
181 | def image_dim_ordering():
182 | """Legacy getter for `image_data_format`.
183 |
184 | # Returns
185 | string, one of `'th'`, `'tf'`
186 | """
187 | if _IMAGE_DATA_FORMAT == 'channels_first':
188 | return 'th'
189 | else:
190 | return 'tf'
191 |
--------------------------------------------------------------------------------
/keras/datasets/__init__.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 |
3 | from . import mnist
4 | from . import imdb
5 | from . import reuters
6 | from . import cifar10
7 | from . import cifar100
8 | from . import boston_housing
9 | from . import fashion_mnist
10 |
--------------------------------------------------------------------------------
/keras/datasets/boston_housing.py:
--------------------------------------------------------------------------------
1 | """Boston housing price regression dataset.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from ..utils.data_utils import get_file
8 | import numpy as np
9 |
10 |
11 | def load_data(path='boston_housing.npz', test_split=0.2, seed=113):
12 | """Loads the Boston Housing dataset.
13 |
14 | # Arguments
15 | path: path where to cache the dataset locally
16 | (relative to ~/.keras/datasets).
17 | test_split: fraction of the data to reserve as test set.
18 | seed: Random seed for shuffling the data
19 | before computing the test split.
20 |
21 | # Returns
22 | Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`.
23 | """
24 | assert 0 <= test_split < 1
25 | path = get_file(path,
26 | origin='https://s3.amazonaws.com/keras-datasets/boston_housing.npz',
27 | file_hash='f553886a1f8d56431e820c5b82552d9d95cfcb96d1e678153f8839538947dff5')
28 | f = np.load(path)
29 | x = f['x']
30 | y = f['y']
31 | f.close()
32 |
33 | np.random.seed(seed)
34 | indices = np.arange(len(x))
35 | np.random.shuffle(indices)
36 | x = x[indices]
37 | y = y[indices]
38 |
39 | x_train = np.array(x[:int(len(x) * (1 - test_split))])
40 | y_train = np.array(y[:int(len(x) * (1 - test_split))])
41 | x_test = np.array(x[int(len(x) * (1 - test_split)):])
42 | y_test = np.array(y[int(len(x) * (1 - test_split)):])
43 | return (x_train, y_train), (x_test, y_test)
44 |
--------------------------------------------------------------------------------
/keras/datasets/cifar.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | """Utilities common to CIFAR10 and CIFAR100 datasets.
3 | """
4 | from __future__ import absolute_import
5 | from __future__ import division
6 | from __future__ import print_function
7 |
8 | import sys
9 | from six.moves import cPickle
10 |
11 |
12 | def load_batch(fpath, label_key='labels'):
13 | """Internal utility for parsing CIFAR data.
14 |
15 | # Arguments
16 | fpath: path the file to parse.
17 | label_key: key for label data in the retrieve
18 | dictionary.
19 |
20 | # Returns
21 | A tuple `(data, labels)`.
22 | """
23 | with open(fpath, 'rb') as f:
24 | if sys.version_info < (3,):
25 | d = cPickle.load(f)
26 | else:
27 | d = cPickle.load(f, encoding='bytes')
28 | # decode utf8
29 | d_decoded = {}
30 | for k, v in d.items():
31 | d_decoded[k.decode('utf8')] = v
32 | d = d_decoded
33 | data = d['data']
34 | labels = d[label_key]
35 |
36 | data = data.reshape(data.shape[0], 3, 32, 32)
37 | return data, labels
38 |
--------------------------------------------------------------------------------
/keras/datasets/cifar10.py:
--------------------------------------------------------------------------------
1 | """CIFAR10 small images classification dataset.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from .cifar import load_batch
8 | from ..utils.data_utils import get_file
9 | from .. import backend as K
10 | import numpy as np
11 | import os
12 |
13 |
14 | def load_data():
15 | """Loads CIFAR10 dataset.
16 |
17 | # Returns
18 | Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`.
19 | """
20 | dirname = 'cifar-10-batches-py'
21 | origin = 'https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz'
22 | path = get_file(dirname, origin=origin, untar=True)
23 |
24 | num_train_samples = 50000
25 |
26 | x_train = np.empty((num_train_samples, 3, 32, 32), dtype='uint8')
27 | y_train = np.empty((num_train_samples,), dtype='uint8')
28 |
29 | for i in range(1, 6):
30 | fpath = os.path.join(path, 'data_batch_' + str(i))
31 | (x_train[(i - 1) * 10000: i * 10000, :, :, :],
32 | y_train[(i - 1) * 10000: i * 10000]) = load_batch(fpath)
33 |
34 | fpath = os.path.join(path, 'test_batch')
35 | x_test, y_test = load_batch(fpath)
36 |
37 | y_train = np.reshape(y_train, (len(y_train), 1))
38 | y_test = np.reshape(y_test, (len(y_test), 1))
39 |
40 | if K.image_data_format() == 'channels_last':
41 | x_train = x_train.transpose(0, 2, 3, 1)
42 | x_test = x_test.transpose(0, 2, 3, 1)
43 |
44 | return (x_train, y_train), (x_test, y_test)
45 |
--------------------------------------------------------------------------------
/keras/datasets/cifar100.py:
--------------------------------------------------------------------------------
1 | """CIFAR100 small images classification dataset.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from .cifar import load_batch
8 | from ..utils.data_utils import get_file
9 | from .. import backend as K
10 | import numpy as np
11 | import os
12 |
13 |
14 | def load_data(label_mode='fine'):
15 | """Loads CIFAR100 dataset.
16 |
17 | # Arguments
18 | label_mode: one of "fine", "coarse".
19 |
20 | # Returns
21 | Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`.
22 |
23 | # Raises
24 | ValueError: in case of invalid `label_mode`.
25 | """
26 | if label_mode not in ['fine', 'coarse']:
27 | raise ValueError('`label_mode` must be one of `"fine"`, `"coarse"`.')
28 |
29 | dirname = 'cifar-100-python'
30 | origin = 'https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz'
31 | path = get_file(dirname, origin=origin, untar=True)
32 |
33 | fpath = os.path.join(path, 'train')
34 | x_train, y_train = load_batch(fpath, label_key=label_mode + '_labels')
35 |
36 | fpath = os.path.join(path, 'test')
37 | x_test, y_test = load_batch(fpath, label_key=label_mode + '_labels')
38 |
39 | y_train = np.reshape(y_train, (len(y_train), 1))
40 | y_test = np.reshape(y_test, (len(y_test), 1))
41 |
42 | if K.image_data_format() == 'channels_last':
43 | x_train = x_train.transpose(0, 2, 3, 1)
44 | x_test = x_test.transpose(0, 2, 3, 1)
45 |
46 | return (x_train, y_train), (x_test, y_test)
47 |
--------------------------------------------------------------------------------
/keras/datasets/fashion_mnist.py:
--------------------------------------------------------------------------------
1 | """Fashion-MNIST dataset.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import gzip
8 | import os
9 |
10 | from ..utils.data_utils import get_file
11 | import numpy as np
12 |
13 |
14 | def load_data():
15 | """Loads the Fashion-MNIST dataset.
16 |
17 | # Returns
18 | Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`.
19 | """
20 | dirname = os.path.join('datasets', 'fashion-mnist')
21 | base = 'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/'
22 | files = ['train-labels-idx1-ubyte.gz', 'train-images-idx3-ubyte.gz',
23 | 't10k-labels-idx1-ubyte.gz', 't10k-images-idx3-ubyte.gz']
24 |
25 | paths = []
26 | for fname in files:
27 | paths.append(get_file(fname,
28 | origin=base + fname,
29 | cache_subdir=dirname))
30 |
31 | with gzip.open(paths[0], 'rb') as lbpath:
32 | y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)
33 |
34 | with gzip.open(paths[1], 'rb') as imgpath:
35 | x_train = np.frombuffer(imgpath.read(), np.uint8,
36 | offset=16).reshape(len(y_train), 28, 28)
37 |
38 | with gzip.open(paths[2], 'rb') as lbpath:
39 | y_test = np.frombuffer(lbpath.read(), np.uint8, offset=8)
40 |
41 | with gzip.open(paths[3], 'rb') as imgpath:
42 | x_test = np.frombuffer(imgpath.read(), np.uint8,
43 | offset=16).reshape(len(y_test), 28, 28)
44 |
45 | return (x_train, y_train), (x_test, y_test)
46 |
--------------------------------------------------------------------------------
/keras/datasets/imdb.py:
--------------------------------------------------------------------------------
1 | """IMDB sentiment classification dataset.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from ..utils.data_utils import get_file
8 | from ..preprocessing.sequence import _remove_long_seq
9 | import numpy as np
10 | import json
11 | import warnings
12 |
13 |
14 | def load_data(path='imdb.npz', num_words=None, skip_top=0,
15 | maxlen=None, seed=113,
16 | start_char=1, oov_char=2, index_from=3, **kwargs):
17 | """Loads the IMDB dataset.
18 |
19 | # Arguments
20 | path: where to cache the data (relative to `~/.keras/dataset`).
21 | num_words: max number of words to include. Words are ranked
22 | by how often they occur (in the training set) and only
23 | the most frequent words are kept
24 | skip_top: skip the top N most frequently occurring words
25 | (which may not be informative).
26 | maxlen: sequences longer than this will be filtered out.
27 | seed: random seed for sample shuffling.
28 | start_char: The start of a sequence will be marked with this character.
29 | Set to 1 because 0 is usually the padding character.
30 | oov_char: words that were cut out because of the `num_words`
31 | or `skip_top` limit will be replaced with this character.
32 | index_from: index actual words with this index and higher.
33 |
34 | # Returns
35 | Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`.
36 |
37 | # Raises
38 | ValueError: in case `maxlen` is so low
39 | that no input sequence could be kept.
40 |
41 | Note that the 'out of vocabulary' character is only used for
42 | words that were present in the training set but are not included
43 | because they're not making the `num_words` cut here.
44 | Words that were not seen in the training set but are in the test set
45 | have simply been skipped.
46 | """
47 | # Legacy support
48 | if 'nb_words' in kwargs:
49 | warnings.warn('The `nb_words` argument in `load_data` '
50 | 'has been renamed `num_words`.')
51 | num_words = kwargs.pop('nb_words')
52 | if kwargs:
53 | raise TypeError('Unrecognized keyword arguments: ' + str(kwargs))
54 |
55 | path = get_file(path,
56 | origin='https://s3.amazonaws.com/text-datasets/imdb.npz',
57 | file_hash='599dadb1135973df5b59232a0e9a887c')
58 | with np.load(path) as f:
59 | x_train, labels_train = f['x_train'], f['y_train']
60 | x_test, labels_test = f['x_test'], f['y_test']
61 |
62 | np.random.seed(seed)
63 | indices = np.arange(len(x_train))
64 | np.random.shuffle(indices)
65 | x_train = x_train[indices]
66 | labels_train = labels_train[indices]
67 |
68 | indices = np.arange(len(x_test))
69 | np.random.shuffle(indices)
70 | x_test = x_test[indices]
71 | labels_test = labels_test[indices]
72 |
73 | xs = np.concatenate([x_train, x_test])
74 | labels = np.concatenate([labels_train, labels_test])
75 |
76 | if start_char is not None:
77 | xs = [[start_char] + [w + index_from for w in x] for x in xs]
78 | elif index_from:
79 | xs = [[w + index_from for w in x] for x in xs]
80 |
81 | if maxlen:
82 | xs, labels = _remove_long_seq(maxlen, xs, labels)
83 | if not xs:
84 | raise ValueError('After filtering for sequences shorter than maxlen=' +
85 | str(maxlen) + ', no sequence was kept. '
86 | 'Increase maxlen.')
87 | if not num_words:
88 | num_words = max([max(x) for x in xs])
89 |
90 | # by convention, use 2 as OOV word
91 | # reserve 'index_from' (=3 by default) characters:
92 | # 0 (padding), 1 (start), 2 (OOV)
93 | if oov_char is not None:
94 | xs = [[w if (skip_top <= w < num_words) else oov_char for w in x] for x in xs]
95 | else:
96 | xs = [[w for w in x if skip_top <= w < num_words] for x in xs]
97 |
98 | idx = len(x_train)
99 | x_train, y_train = np.array(xs[:idx]), np.array(labels[:idx])
100 | x_test, y_test = np.array(xs[idx:]), np.array(labels[idx:])
101 |
102 | return (x_train, y_train), (x_test, y_test)
103 |
104 |
105 | def get_word_index(path='imdb_word_index.json'):
106 | """Retrieves the dictionary mapping word indices back to words.
107 |
108 | # Arguments
109 | path: where to cache the data (relative to `~/.keras/dataset`).
110 |
111 | # Returns
112 | The word index dictionary.
113 | """
114 | path = get_file(path,
115 | origin='https://s3.amazonaws.com/text-datasets/imdb_word_index.json',
116 | file_hash='bfafd718b763782e994055a2d397834f')
117 | with open(path) as f:
118 | return json.load(f)
119 |
--------------------------------------------------------------------------------
/keras/datasets/mnist.py:
--------------------------------------------------------------------------------
1 | """MNIST handwritten digits dataset.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from ..utils.data_utils import get_file
8 | import numpy as np
9 |
10 |
11 | def load_data(path='mnist.npz'):
12 | """Loads the MNIST dataset.
13 |
14 | # Arguments
15 | path: path where to cache the dataset locally
16 | (relative to ~/.keras/datasets).
17 |
18 | # Returns
19 | Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`.
20 | """
21 | path = get_file(path,
22 | origin='https://s3.amazonaws.com/img-datasets/mnist.npz',
23 | file_hash='8a61469f7ea1b51cbae51d4f78837e45')
24 | f = np.load(path)
25 | x_train, y_train = f['x_train'], f['y_train']
26 | x_test, y_test = f['x_test'], f['y_test']
27 | f.close()
28 | return (x_train, y_train), (x_test, y_test)
29 |
--------------------------------------------------------------------------------
/keras/datasets/reuters.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | """Reuters topic classification dataset.
3 | """
4 | from __future__ import absolute_import
5 | from __future__ import division
6 | from __future__ import print_function
7 |
8 | from ..utils.data_utils import get_file
9 | from ..preprocessing.sequence import _remove_long_seq
10 | import numpy as np
11 | import json
12 | import warnings
13 |
14 |
15 | def load_data(path='reuters.npz', num_words=None, skip_top=0,
16 | maxlen=None, test_split=0.2, seed=113,
17 | start_char=1, oov_char=2, index_from=3, **kwargs):
18 | """Loads the Reuters newswire classification dataset.
19 |
20 | # Arguments
21 | path: where to cache the data (relative to `~/.keras/dataset`).
22 | num_words: max number of words to include. Words are ranked
23 | by how often they occur (in the training set) and only
24 | the most frequent words are kept
25 | skip_top: skip the top N most frequently occurring words
26 | (which may not be informative).
27 | maxlen: truncate sequences after this length.
28 | test_split: Fraction of the dataset to be used as test data.
29 | seed: random seed for sample shuffling.
30 | start_char: The start of a sequence will be marked with this character.
31 | Set to 1 because 0 is usually the padding character.
32 | oov_char: words that were cut out because of the `num_words`
33 | or `skip_top` limit will be replaced with this character.
34 | index_from: index actual words with this index and higher.
35 |
36 | # Returns
37 | Tuple of Numpy arrays: `(x_train, y_train), (x_test, y_test)`.
38 |
39 | Note that the 'out of vocabulary' character is only used for
40 | words that were present in the training set but are not included
41 | because they're not making the `num_words` cut here.
42 | Words that were not seen in the training set but are in the test set
43 | have simply been skipped.
44 | """
45 | # Legacy support
46 | if 'nb_words' in kwargs:
47 | warnings.warn('The `nb_words` argument in `load_data` '
48 | 'has been renamed `num_words`.')
49 | num_words = kwargs.pop('nb_words')
50 | if kwargs:
51 | raise TypeError('Unrecognized keyword arguments: ' + str(kwargs))
52 |
53 | path = get_file(path,
54 | origin='https://s3.amazonaws.com/text-datasets/reuters.npz',
55 | file_hash='87aedbeb0cb229e378797a632c1997b6')
56 | with np.load(path) as f:
57 | xs, labels = f['x'], f['y']
58 |
59 | np.random.seed(seed)
60 | indices = np.arange(len(xs))
61 | np.random.shuffle(indices)
62 | xs = xs[indices]
63 | labels = labels[indices]
64 |
65 | if start_char is not None:
66 | xs = [[start_char] + [w + index_from for w in x] for x in xs]
67 | elif index_from:
68 | xs = [[w + index_from for w in x] for x in xs]
69 |
70 | if maxlen:
71 | xs, labels = _remove_long_seq(maxlen, xs, labels)
72 |
73 | if not num_words:
74 | num_words = max([max(x) for x in xs])
75 |
76 | # by convention, use 2 as OOV word
77 | # reserve 'index_from' (=3 by default) characters:
78 | # 0 (padding), 1 (start), 2 (OOV)
79 | if oov_char is not None:
80 | xs = [[w if skip_top <= w < num_words else oov_char for w in x] for x in xs]
81 | else:
82 | xs = [[w for w in x if skip_top <= w < num_words] for x in xs]
83 |
84 | idx = int(len(xs) * (1 - test_split))
85 | x_train, y_train = np.array(xs[:idx]), np.array(labels[:idx])
86 | x_test, y_test = np.array(xs[idx:]), np.array(labels[idx:])
87 |
88 | return (x_train, y_train), (x_test, y_test)
89 |
90 |
91 | def get_word_index(path='reuters_word_index.json'):
92 | """Retrieves the dictionary mapping word indices back to words.
93 |
94 | # Arguments
95 | path: where to cache the data (relative to `~/.keras/dataset`).
96 |
97 | # Returns
98 | The word index dictionary.
99 | """
100 | path = get_file(path,
101 | origin='https://s3.amazonaws.com/text-datasets/reuters_word_index.json',
102 | file_hash='4d44cc38712099c9e383dc6e5f11a921')
103 | f = open(path)
104 | data = json.load(f)
105 | f.close()
106 | return data
107 |
--------------------------------------------------------------------------------
/keras/engine/__init__.py:
--------------------------------------------------------------------------------
1 | # note: `Node` is an internal class,
2 | # it isn't meant to be used by Keras users.
3 | from .input_layer import Input
4 | from .input_layer import InputLayer
5 | from .base_layer import InputSpec
6 | from .base_layer import Layer
7 | from .network import get_source_inputs
8 | from .training import Model
9 |
--------------------------------------------------------------------------------
/keras/engine/topology.py:
--------------------------------------------------------------------------------
1 | """This module is deprecated, but kept around for backwards compatibility.
2 | """
3 | from .base_layer import Layer, Node, InputSpec
4 | from .input_layer import Input, InputLayer
5 | from .network import Network, get_source_inputs
6 |
--------------------------------------------------------------------------------
/keras/layers/__init__.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 |
3 | from ..utils.generic_utils import deserialize_keras_object
4 | from ..engine.base_layer import Layer
5 | from ..engine import Input
6 | from ..engine import InputLayer
7 | from ..engine.base_layer import InputSpec
8 | from .merge import *
9 | from .core import *
10 | from .convolutional import *
11 | from .pooling import *
12 | from .local import *
13 | from .recurrent import *
14 | from .cudnn_recurrent import *
15 | from .normalization import *
16 | from .embeddings import *
17 | from .noise import *
18 | from .advanced_activations import *
19 | from .wrappers import *
20 | from .convolutional_recurrent import *
21 | from ..legacy.layers import *
22 |
23 |
24 | def serialize(layer):
25 | """Serialize a layer.
26 |
27 | # Arguments
28 | layer: a Layer object.
29 |
30 | # Returns
31 | dictionary with config.
32 | """
33 | return {'class_name': layer.__class__.__name__,
34 | 'config': layer.get_config()}
35 |
36 |
37 | def deserialize(config, custom_objects=None):
38 | """Instantiate a layer from a config dictionary.
39 |
40 | # Arguments
41 | config: dict of the form {'class_name': str, 'config': dict}
42 | custom_objects: dict mapping class names (or function names)
43 | of custom (non-Keras) objects to class/functions
44 |
45 | # Returns
46 | Layer instance (may be Model, Sequential, Layer...)
47 | """
48 | from .. import models
49 | globs = globals() # All layers.
50 | globs['Model'] = models.Model
51 | globs['Sequential'] = models.Sequential
52 | return deserialize_keras_object(config,
53 | module_objects=globs,
54 | custom_objects=custom_objects,
55 | printable_module_name='layer')
56 |
--------------------------------------------------------------------------------
/keras/legacy/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/llSourcell/keras/a2d11d4724d3cf4a0b18a7fe8448723d92e1c716/keras/legacy/__init__.py
--------------------------------------------------------------------------------
/keras/losses.py:
--------------------------------------------------------------------------------
1 | """Built-in loss functions.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import six
8 | from . import backend as K
9 | from .utils.generic_utils import deserialize_keras_object
10 | from .utils.generic_utils import serialize_keras_object
11 |
12 |
13 | def mean_squared_error(y_true, y_pred):
14 | return K.mean(K.square(y_pred - y_true), axis=-1)
15 |
16 |
17 | def mean_absolute_error(y_true, y_pred):
18 | return K.mean(K.abs(y_pred - y_true), axis=-1)
19 |
20 |
21 | def mean_absolute_percentage_error(y_true, y_pred):
22 | diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true),
23 | K.epsilon(),
24 | None))
25 | return 100. * K.mean(diff, axis=-1)
26 |
27 |
28 | def mean_squared_logarithmic_error(y_true, y_pred):
29 | first_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
30 | second_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)
31 | return K.mean(K.square(first_log - second_log), axis=-1)
32 |
33 |
34 | def squared_hinge(y_true, y_pred):
35 | return K.mean(K.square(K.maximum(1. - y_true * y_pred, 0.)), axis=-1)
36 |
37 |
38 | def hinge(y_true, y_pred):
39 | return K.mean(K.maximum(1. - y_true * y_pred, 0.), axis=-1)
40 |
41 |
42 | def categorical_hinge(y_true, y_pred):
43 | pos = K.sum(y_true * y_pred, axis=-1)
44 | neg = K.max((1. - y_true) * y_pred, axis=-1)
45 | return K.maximum(0., neg - pos + 1.)
46 |
47 |
48 | def logcosh(y_true, y_pred):
49 | """Logarithm of the hyperbolic cosine of the prediction error.
50 |
51 | `log(cosh(x))` is approximately equal to `(x ** 2) / 2` for small `x` and
52 | to `abs(x) - log(2)` for large `x`. This means that 'logcosh' works mostly
53 | like the mean squared error, but will not be so strongly affected by the
54 | occasional wildly incorrect prediction.
55 |
56 | # Arguments
57 | y_true: tensor of true targets.
58 | y_pred: tensor of predicted targets.
59 |
60 | # Returns
61 | Tensor with one scalar loss entry per sample.
62 | """
63 | def _logcosh(x):
64 | return x + K.softplus(-2. * x) - K.log(2.)
65 | return K.mean(_logcosh(y_pred - y_true), axis=-1)
66 |
67 |
68 | def categorical_crossentropy(y_true, y_pred):
69 | return K.categorical_crossentropy(y_true, y_pred)
70 |
71 |
72 | def sparse_categorical_crossentropy(y_true, y_pred):
73 | return K.sparse_categorical_crossentropy(y_true, y_pred)
74 |
75 |
76 | def binary_crossentropy(y_true, y_pred):
77 | return K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
78 |
79 |
80 | def kullback_leibler_divergence(y_true, y_pred):
81 | y_true = K.clip(y_true, K.epsilon(), 1)
82 | y_pred = K.clip(y_pred, K.epsilon(), 1)
83 | return K.sum(y_true * K.log(y_true / y_pred), axis=-1)
84 |
85 |
86 | def poisson(y_true, y_pred):
87 | return K.mean(y_pred - y_true * K.log(y_pred + K.epsilon()), axis=-1)
88 |
89 |
90 | def cosine_proximity(y_true, y_pred):
91 | y_true = K.l2_normalize(y_true, axis=-1)
92 | y_pred = K.l2_normalize(y_pred, axis=-1)
93 | return -K.sum(y_true * y_pred, axis=-1)
94 |
95 |
96 | # Aliases.
97 |
98 | mse = MSE = mean_squared_error
99 | mae = MAE = mean_absolute_error
100 | mape = MAPE = mean_absolute_percentage_error
101 | msle = MSLE = mean_squared_logarithmic_error
102 | kld = KLD = kullback_leibler_divergence
103 | cosine = cosine_proximity
104 |
105 |
106 | def serialize(loss):
107 | return serialize_keras_object(loss)
108 |
109 |
110 | def deserialize(name, custom_objects=None):
111 | return deserialize_keras_object(name,
112 | module_objects=globals(),
113 | custom_objects=custom_objects,
114 | printable_module_name='loss function')
115 |
116 |
117 | def get(identifier):
118 | if identifier is None:
119 | return None
120 | if isinstance(identifier, six.string_types):
121 | identifier = str(identifier)
122 | return deserialize(identifier)
123 | if isinstance(identifier, dict):
124 | return deserialize(identifier)
125 | elif callable(identifier):
126 | return identifier
127 | else:
128 | raise ValueError('Could not interpret '
129 | 'loss function identifier:', identifier)
130 |
--------------------------------------------------------------------------------
/keras/metrics.py:
--------------------------------------------------------------------------------
1 | """Built-in metrics.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import six
8 | from . import backend as K
9 | from .losses import mean_squared_error
10 | from .losses import mean_absolute_error
11 | from .losses import mean_absolute_percentage_error
12 | from .losses import mean_squared_logarithmic_error
13 | from .losses import hinge
14 | from .losses import logcosh
15 | from .losses import squared_hinge
16 | from .losses import categorical_crossentropy
17 | from .losses import sparse_categorical_crossentropy
18 | from .losses import binary_crossentropy
19 | from .losses import kullback_leibler_divergence
20 | from .losses import poisson
21 | from .losses import cosine_proximity
22 | from .utils.generic_utils import deserialize_keras_object
23 | from .utils.generic_utils import serialize_keras_object
24 |
25 |
26 | def binary_accuracy(y_true, y_pred):
27 | return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1)
28 |
29 |
30 | def categorical_accuracy(y_true, y_pred):
31 | return K.cast(K.equal(K.argmax(y_true, axis=-1),
32 | K.argmax(y_pred, axis=-1)),
33 | K.floatx())
34 |
35 |
36 | def sparse_categorical_accuracy(y_true, y_pred):
37 | return K.cast(K.equal(K.max(y_true, axis=-1),
38 | K.cast(K.argmax(y_pred, axis=-1), K.floatx())),
39 | K.floatx())
40 |
41 |
42 | def top_k_categorical_accuracy(y_true, y_pred, k=5):
43 | return K.mean(K.in_top_k(y_pred, K.argmax(y_true, axis=-1), k), axis=-1)
44 |
45 |
46 | def sparse_top_k_categorical_accuracy(y_true, y_pred, k=5):
47 | return K.mean(K.in_top_k(y_pred, K.cast(K.max(y_true, axis=-1), 'int32'), k), axis=-1)
48 |
49 |
50 | # Aliases
51 |
52 | mse = MSE = mean_squared_error
53 | mae = MAE = mean_absolute_error
54 | mape = MAPE = mean_absolute_percentage_error
55 | msle = MSLE = mean_squared_logarithmic_error
56 | cosine = cosine_proximity
57 |
58 |
59 | def serialize(metric):
60 | return serialize_keras_object(metric)
61 |
62 |
63 | def deserialize(config, custom_objects=None):
64 | return deserialize_keras_object(config,
65 | module_objects=globals(),
66 | custom_objects=custom_objects,
67 | printable_module_name='metric function')
68 |
69 |
70 | def get(identifier):
71 | if isinstance(identifier, dict):
72 | config = {'class_name': str(identifier), 'config': {}}
73 | return deserialize(config)
74 | elif isinstance(identifier, six.string_types):
75 | return deserialize(str(identifier))
76 | elif callable(identifier):
77 | return identifier
78 | else:
79 | raise ValueError('Could not interpret '
80 | 'metric function identifier:', identifier)
81 |
--------------------------------------------------------------------------------
/keras/objectives.py:
--------------------------------------------------------------------------------
1 | """Legacy objectives module.
2 |
3 | Only kept for backwards API compatibility.
4 | """
5 | from __future__ import absolute_import
6 | from .losses import *
7 |
--------------------------------------------------------------------------------
/keras/preprocessing/__init__.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import division
3 | from __future__ import print_function
4 |
5 | from .. import backend
6 | from .. import utils
7 |
8 | import keras_preprocessing
9 |
10 | keras_preprocessing.set_keras_submodules(backend=backend, utils=utils)
11 |
12 | from . import image
13 | from . import sequence
14 | from . import text
15 |
--------------------------------------------------------------------------------
/keras/preprocessing/image.py:
--------------------------------------------------------------------------------
1 | """Utilities for real-time data augmentation on image data.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from keras_preprocessing import image
8 |
9 | random_rotation = image.random_rotation
10 | random_shift = image.random_shift
11 | random_shear = image.random_shear
12 | random_zoom = image.random_zoom
13 | apply_channel_shift = image.apply_channel_shift
14 | random_channel_shift = image.random_channel_shift
15 | apply_brightness_shift = image.apply_brightness_shift
16 | random_brightness = image.random_brightness
17 | apply_affine_transform = image.apply_affine_transform
18 | array_to_img = image.array_to_img
19 | img_to_array = image.img_to_array
20 | save_img = image.save_img
21 | load_img = image.load_img
22 | ImageDataGenerator = image.ImageDataGenerator
23 | Iterator = image.Iterator
24 | NumpyArrayIterator = image.NumpyArrayIterator
25 | DirectoryIterator = image.DirectoryIterator
26 |
--------------------------------------------------------------------------------
/keras/preprocessing/sequence.py:
--------------------------------------------------------------------------------
1 | """Utilities for preprocessing sequence data.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from keras_preprocessing import sequence
8 |
9 | pad_sequences = sequence.pad_sequences
10 | make_sampling_table = sequence.make_sampling_table
11 | skipgrams = sequence.skipgrams
12 | _remove_long_seq = sequence._remove_long_seq # TODO: make it public?
13 | TimeseriesGenerator = sequence.TimeseriesGenerator
14 |
--------------------------------------------------------------------------------
/keras/preprocessing/text.py:
--------------------------------------------------------------------------------
1 | """Utilities for text input preprocessing.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | from keras_preprocessing import text
8 |
9 | text_to_word_sequence = text.text_to_word_sequence
10 | one_hot = text.one_hot
11 | hashing_trick = text.hashing_trick
12 | Tokenizer = text.Tokenizer
13 |
--------------------------------------------------------------------------------
/keras/regularizers.py:
--------------------------------------------------------------------------------
1 | """Built-in regularizers.
2 | """
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import six
8 | from . import backend as K
9 | from .utils.generic_utils import serialize_keras_object
10 | from .utils.generic_utils import deserialize_keras_object
11 |
12 |
13 | class Regularizer(object):
14 | """Regularizer base class.
15 | """
16 |
17 | def __call__(self, x):
18 | return 0.
19 |
20 | @classmethod
21 | def from_config(cls, config):
22 | return cls(**config)
23 |
24 |
25 | class L1L2(Regularizer):
26 | """Regularizer for L1 and L2 regularization.
27 |
28 | # Arguments
29 | l1: Float; L1 regularization factor.
30 | l2: Float; L2 regularization factor.
31 | """
32 |
33 | def __init__(self, l1=0., l2=0.):
34 | self.l1 = K.cast_to_floatx(l1)
35 | self.l2 = K.cast_to_floatx(l2)
36 |
37 | def __call__(self, x):
38 | regularization = 0.
39 | if self.l1:
40 | regularization += K.sum(self.l1 * K.abs(x))
41 | if self.l2:
42 | regularization += K.sum(self.l2 * K.square(x))
43 | return regularization
44 |
45 | def get_config(self):
46 | return {'l1': float(self.l1),
47 | 'l2': float(self.l2)}
48 |
49 |
50 | # Aliases.
51 |
52 |
53 | def l1(l=0.01):
54 | return L1L2(l1=l)
55 |
56 |
57 | def l2(l=0.01):
58 | return L1L2(l2=l)
59 |
60 |
61 | def l1_l2(l1=0.01, l2=0.01):
62 | return L1L2(l1=l1, l2=l2)
63 |
64 |
65 | def serialize(regularizer):
66 | return serialize_keras_object(regularizer)
67 |
68 |
69 | def deserialize(config, custom_objects=None):
70 | return deserialize_keras_object(config,
71 | module_objects=globals(),
72 | custom_objects=custom_objects,
73 | printable_module_name='regularizer')
74 |
75 |
76 | def get(identifier):
77 | if identifier is None:
78 | return None
79 | if isinstance(identifier, dict):
80 | return deserialize(identifier)
81 | elif isinstance(identifier, six.string_types):
82 | config = {'class_name': str(identifier), 'config': {}}
83 | return deserialize(config)
84 | elif callable(identifier):
85 | return identifier
86 | else:
87 | raise ValueError('Could not interpret regularizer identifier: ' +
88 | str(identifier))
89 |
--------------------------------------------------------------------------------
/keras/utils/__init__.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from . import np_utils
3 | from . import generic_utils
4 | from . import data_utils
5 | from . import io_utils
6 | from . import conv_utils
7 |
8 | # Globally-importable utils.
9 | from .io_utils import HDF5Matrix
10 | from .data_utils import get_file
11 | from .data_utils import Sequence
12 | from .data_utils import GeneratorEnqueuer
13 | from .data_utils import OrderedEnqueuer
14 | from .generic_utils import CustomObjectScope
15 | from .generic_utils import custom_object_scope
16 | from .generic_utils import get_custom_objects
17 | from .generic_utils import serialize_keras_object
18 | from .generic_utils import deserialize_keras_object
19 | from .generic_utils import Progbar
20 | from .layer_utils import convert_all_kernels_in_model
21 | from .layer_utils import get_source_inputs
22 | from .layer_utils import print_summary
23 | from .vis_utils import plot_model
24 | from .np_utils import to_categorical
25 | from .np_utils import normalize
26 | from .multi_gpu_utils import multi_gpu_model
27 |
--------------------------------------------------------------------------------
/keras/utils/io_utils.py:
--------------------------------------------------------------------------------
1 | """Utilities related to disk I/O."""
2 | from __future__ import absolute_import
3 | from __future__ import division
4 | from __future__ import print_function
5 |
6 | import numpy as np
7 | from collections import defaultdict
8 |
9 | import six
10 | try:
11 | import h5py
12 | except ImportError:
13 | h5py = None
14 |
15 |
16 | class HDF5Matrix(object):
17 | """Representation of HDF5 dataset to be used instead of a Numpy array.
18 |
19 | # Example
20 |
21 | ```python
22 | x_data = HDF5Matrix('input/file.hdf5', 'data')
23 | model.predict(x_data)
24 | ```
25 |
26 | Providing `start` and `end` allows use of a slice of the dataset.
27 |
28 | Optionally, a normalizer function (or lambda) can be given. This will
29 | be called on every slice of data retrieved.
30 |
31 | # Arguments
32 | datapath: string, path to a HDF5 file
33 | dataset: string, name of the HDF5 dataset in the file specified
34 | in datapath
35 | start: int, start of desired slice of the specified dataset
36 | end: int, end of desired slice of the specified dataset
37 | normalizer: function to be called on data when retrieved
38 |
39 | # Returns
40 | An array-like HDF5 dataset.
41 | """
42 | refs = defaultdict(int)
43 |
44 | def __init__(self, datapath, dataset, start=0, end=None, normalizer=None):
45 | if h5py is None:
46 | raise ImportError('The use of HDF5Matrix requires '
47 | 'HDF5 and h5py installed.')
48 |
49 | if datapath not in list(self.refs.keys()):
50 | f = h5py.File(datapath)
51 | self.refs[datapath] = f
52 | else:
53 | f = self.refs[datapath]
54 | self.data = f[dataset]
55 | self.start = start
56 | if end is None:
57 | self.end = self.data.shape[0]
58 | else:
59 | self.end = end
60 | self.normalizer = normalizer
61 |
62 | def __len__(self):
63 | return self.end - self.start
64 |
65 | def __getitem__(self, key):
66 | if isinstance(key, slice):
67 | start, stop = key.start, key.stop
68 | if start is None:
69 | start = 0
70 | if stop is None:
71 | stop = self.shape[0]
72 | if stop + self.start <= self.end:
73 | idx = slice(start + self.start, stop + self.start)
74 | else:
75 | raise IndexError
76 | elif isinstance(key, (int, np.integer)):
77 | if key + self.start < self.end:
78 | idx = key + self.start
79 | else:
80 | raise IndexError
81 | elif isinstance(key, np.ndarray):
82 | if np.max(key) + self.start < self.end:
83 | idx = (self.start + key).tolist()
84 | else:
85 | raise IndexError
86 | else:
87 | # Assume list/iterable
88 | if max(key) + self.start < self.end:
89 | idx = [x + self.start for x in key]
90 | else:
91 | raise IndexError
92 | if self.normalizer is not None:
93 | return self.normalizer(self.data[idx])
94 | else:
95 | return self.data[idx]
96 |
97 | @property
98 | def shape(self):
99 | """Gets a numpy-style shape tuple giving the dataset dimensions.
100 |
101 | # Returns
102 | A numpy-style shape tuple.
103 | """
104 | return (self.end - self.start,) + self.data.shape[1:]
105 |
106 | @property
107 | def dtype(self):
108 | """Gets the datatype of the dataset.
109 |
110 | # Returns
111 | A numpy dtype string.
112 | """
113 | return self.data.dtype
114 |
115 | @property
116 | def ndim(self):
117 | """Gets the number of dimensions (rank) of the dataset.
118 |
119 | # Returns
120 | An integer denoting the number of dimensions (rank) of the dataset.
121 | """
122 | return self.data.ndim
123 |
124 | @property
125 | def size(self):
126 | """Gets the total dataset size (number of elements).
127 |
128 | # Returns
129 | An integer denoting the number of elements in the dataset.
130 | """
131 | return np.prod(self.shape)
132 |
133 |
134 | def ask_to_proceed_with_overwrite(filepath):
135 | """Produces a prompt asking about overwriting a file.
136 |
137 | # Arguments
138 | filepath: the path to the file to be overwritten.
139 |
140 | # Returns
141 | True if we can proceed with overwrite, False otherwise.
142 | """
143 | overwrite = six.moves.input('[WARNING] %s already exists - overwrite? '
144 | '[y/n]' % (filepath)).strip().lower()
145 | while overwrite not in ('y', 'n'):
146 | overwrite = six.moves.input('Enter "y" (overwrite) or "n" '
147 | '(cancel).').strip().lower()
148 | if overwrite == 'n':
149 | return False
150 | print('[TIP] Next time specify overwrite=True!')
151 | return True
152 |
--------------------------------------------------------------------------------
/keras/utils/np_utils.py:
--------------------------------------------------------------------------------
1 | """Numpy-related utilities."""
2 | from __future__ import absolute_import
3 | from __future__ import division
4 | from __future__ import print_function
5 |
6 | import numpy as np
7 |
8 |
9 | def to_categorical(y, num_classes=None):
10 | """Converts a class vector (integers) to binary class matrix.
11 |
12 | E.g. for use with categorical_crossentropy.
13 |
14 | # Arguments
15 | y: class vector to be converted into a matrix
16 | (integers from 0 to num_classes).
17 | num_classes: total number of classes.
18 |
19 | # Returns
20 | A binary matrix representation of the input. The classes axis
21 | is placed last.
22 | """
23 | y = np.array(y, dtype='int')
24 | input_shape = y.shape
25 | if input_shape and input_shape[-1] == 1 and len(input_shape) > 1:
26 | input_shape = tuple(input_shape[:-1])
27 | y = y.ravel()
28 | if not num_classes:
29 | num_classes = np.max(y) + 1
30 | n = y.shape[0]
31 | categorical = np.zeros((n, num_classes), dtype=np.float32)
32 | categorical[np.arange(n), y] = 1
33 | output_shape = input_shape + (num_classes,)
34 | categorical = np.reshape(categorical, output_shape)
35 | return categorical
36 |
37 |
38 | def normalize(x, axis=-1, order=2):
39 | """Normalizes a Numpy array.
40 |
41 | # Arguments
42 | x: Numpy array to normalize.
43 | axis: axis along which to normalize.
44 | order: Normalization order (e.g. 2 for L2 norm).
45 |
46 | # Returns
47 | A normalized copy of the array.
48 | """
49 | l2 = np.atleast_1d(np.linalg.norm(x, order, axis))
50 | l2[l2 == 0] = 1
51 | return x / np.expand_dims(l2, axis)
52 |
--------------------------------------------------------------------------------
/keras/wrappers/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/llSourcell/keras/a2d11d4724d3cf4a0b18a7fe8448723d92e1c716/keras/wrappers/__init__.py
--------------------------------------------------------------------------------
/pytest.ini:
--------------------------------------------------------------------------------
1 | # Configuration of py.test
2 | [pytest]
3 | addopts=-v
4 | -n 2
5 | --durations=20
6 |
7 | # Do not run tests in the build folder
8 | norecursedirs= build
9 |
10 | # PEP-8 The following are ignored:
11 | # E501 line too long (82 > 79 characters)
12 | # E402 module level import not at top of file - temporary measure to continue adding ros python packaged in sys.path
13 | # E731 do not assign a lambda expression, use a def
14 |
15 | pep8ignore=* E501 \
16 | * E402 \
17 | * E731 \
18 |
19 |
--------------------------------------------------------------------------------
/setup.cfg:
--------------------------------------------------------------------------------
1 | [metadata]
2 | description-file = README.md
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | from setuptools import setup
2 | from setuptools import find_packages
3 |
4 | long_description = '''
5 | Keras is a high-level neural networks API,
6 | written in Python and capable of running on top of
7 | TensorFlow, CNTK, or Theano.
8 |
9 | Use Keras if you need a deep learning library that:
10 |
11 | - Allows for easy and fast prototyping
12 | (through user friendliness, modularity, and extensibility).
13 | - Supports both convolutional networks and recurrent networks,
14 | as well as combinations of the two.
15 | - Runs seamlessly on CPU and GPU.
16 |
17 | Read the documentation at: https://keras.io/
18 |
19 | For a detailed overview of what makes Keras special, see:
20 | https://keras.io/why-use-keras/
21 |
22 | Keras is compatible with Python 2.7-3.6
23 | and is distributed under the MIT liense.
24 | '''
25 |
26 | setup(name='Keras',
27 | version='2.2.0',
28 | description='Deep Learning for humans',
29 | long_description=long_description,
30 | author='Francois Chollet',
31 | author_email='francois.chollet@gmail.com',
32 | url='https://github.com/keras-team/keras',
33 | download_url='https://github.com/keras-team/keras/tarball/2.2.0',
34 | license='MIT',
35 | install_requires=['numpy>=1.9.1',
36 | 'scipy>=0.14',
37 | 'six>=1.9.0',
38 | 'pyyaml',
39 | 'h5py',
40 | 'keras_applications==1.0.2',
41 | 'keras_preprocessing==1.0.1'],
42 | extras_require={
43 | 'visualize': ['pydot>=1.2.4'],
44 | 'tests': ['pytest',
45 | 'pytest-pep8',
46 | 'pytest-xdist',
47 | 'pytest-cov',
48 | 'pandas',
49 | 'requests'],
50 | },
51 | classifiers=[
52 | 'Development Status :: 5 - Production/Stable',
53 | 'Intended Audience :: Developers',
54 | 'Intended Audience :: Education',
55 | 'Intended Audience :: Science/Research',
56 | 'License :: OSI Approved :: MIT License',
57 | 'Programming Language :: Python :: 2',
58 | 'Programming Language :: Python :: 2.7',
59 | 'Programming Language :: Python :: 3',
60 | 'Programming Language :: Python :: 3.6',
61 | 'Topic :: Software Development :: Libraries',
62 | 'Topic :: Software Development :: Libraries :: Python Modules'
63 | ],
64 | packages=find_packages())
65 |
--------------------------------------------------------------------------------
/tests/integration_tests/applications_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | import random
3 | import os
4 | from multiprocessing import Process, Queue
5 | from keras.utils.test_utils import keras_test
6 | from keras.utils.test_utils import layer_test
7 | from keras.models import Sequential
8 | from keras import applications
9 | from keras import backend as K
10 |
11 |
12 | pytestmark = pytest.mark.skipif(
13 | os.environ.get('CORE_CHANGED', 'True') == 'False' and
14 | os.environ.get('APP_CHANGED', 'True') == 'False',
15 | reason='Runs only when the relevant files have been modified.')
16 |
17 |
18 | MODEL_LIST = [
19 | (applications.ResNet50, 2048),
20 | (applications.VGG16, 512),
21 | (applications.VGG19, 512),
22 | (applications.Xception, 2048),
23 | (applications.InceptionV3, 2048),
24 | (applications.InceptionResNetV2, 1536),
25 | (applications.MobileNet, 1024),
26 | (applications.MobileNetV2, 1280),
27 | (applications.DenseNet121, 1024),
28 | (applications.DenseNet169, 1664),
29 | (applications.DenseNet201, 1920)
30 | # TODO: enable nasnet tests if they support Theano and CNTK
31 | # (applications.NASNetMobile, 1056),
32 | # (applications.NASNetLarge, 4032)
33 | ]
34 |
35 |
36 | def _get_output_shape(model_fn):
37 | if K.backend() == 'cntk':
38 | # Create model in a subprocess so that
39 | # the memory consumed by InceptionResNetV2 will be
40 | # released back to the system after this test
41 | # (to deal with OOM error on CNTK backend).
42 | # TODO: remove the use of multiprocessing from these tests
43 | # once a memory clearing mechanism
44 | # is implemented in the CNTK backend.
45 | def target(queue):
46 | model = model_fn()
47 | queue.put(model.output_shape)
48 | queue = Queue()
49 | p = Process(target=target, args=(queue,))
50 | p.start()
51 | p.join()
52 | # The error in a subprocess won't propagate
53 | # to the main process, so we check if the model
54 | # is successfully created by checking if the output shape
55 | # has been put into the queue
56 | assert not queue.empty(), 'Model creation failed.'
57 | return queue.get_nowait()
58 | else:
59 | model = model_fn()
60 | return model.output_shape
61 |
62 |
63 | @keras_test
64 | def _test_application_basic(app, last_dim=1000):
65 | output_shape = _get_output_shape(lambda: app(weights=None))
66 | assert output_shape == (None, last_dim)
67 |
68 |
69 | @keras_test
70 | def _test_application_notop(app, last_dim):
71 | output_shape = _get_output_shape(
72 | lambda: app(weights=None, include_top=False))
73 | assert output_shape == (None, None, None, last_dim)
74 |
75 |
76 | def test_applications():
77 | for _ in range(3):
78 | app, last_dim = random.choice(MODEL_LIST)
79 | _test_application_basic(app)
80 | _test_application_notop(app, last_dim)
81 |
82 |
83 | if __name__ == '__main__':
84 | pytest.main([__file__])
85 |
--------------------------------------------------------------------------------
/tests/integration_tests/test_datasets.py:
--------------------------------------------------------------------------------
1 | from __future__ import print_function
2 | import pytest
3 | import time
4 | import random
5 | from keras.datasets import cifar10
6 | from keras.datasets import cifar100
7 | from keras.datasets import reuters
8 | from keras.datasets import imdb
9 | from keras.datasets import mnist
10 | from keras.datasets import boston_housing
11 | from keras.datasets import fashion_mnist
12 |
13 |
14 | def test_cifar():
15 | # only run data download tests 20% of the time
16 | # to speed up frequent testing
17 | random.seed(time.time())
18 | if random.random() > 0.8:
19 | (x_train, y_train), (x_test, y_test) = cifar10.load_data()
20 | assert len(x_train) == len(y_train) == 50000
21 | assert len(x_test) == len(y_test) == 10000
22 | (x_train, y_train), (x_test, y_test) = cifar100.load_data('fine')
23 | assert len(x_train) == len(y_train) == 50000
24 | assert len(x_test) == len(y_test) == 10000
25 | (x_train, y_train), (x_test, y_test) = cifar100.load_data('coarse')
26 | assert len(x_train) == len(y_train) == 50000
27 | assert len(x_test) == len(y_test) == 10000
28 |
29 |
30 | def test_reuters():
31 | # only run data download tests 20% of the time
32 | # to speed up frequent testing
33 | random.seed(time.time())
34 | if random.random() > 0.8:
35 | (x_train, y_train), (x_test, y_test) = reuters.load_data()
36 | assert len(x_train) == len(y_train)
37 | assert len(x_test) == len(y_test)
38 | assert len(x_train) + len(x_test) == 11228
39 | (x_train, y_train), (x_test, y_test) = reuters.load_data(maxlen=10)
40 | assert len(x_train) == len(y_train)
41 | assert len(x_test) == len(y_test)
42 | word_index = reuters.get_word_index()
43 | assert isinstance(word_index, dict)
44 |
45 |
46 | def test_mnist():
47 | # only run data download tests 20% of the time
48 | # to speed up frequent testing
49 | random.seed(time.time())
50 | if random.random() > 0.8:
51 | (x_train, y_train), (x_test, y_test) = mnist.load_data()
52 | assert len(x_train) == len(y_train) == 60000
53 | assert len(x_test) == len(y_test) == 10000
54 |
55 |
56 | def test_imdb():
57 | # only run data download tests 20% of the time
58 | # to speed up frequent testing
59 | random.seed(time.time())
60 | if random.random() > 0.8:
61 | (x_train, y_train), (x_test, y_test) = imdb.load_data()
62 | (x_train, y_train), (x_test, y_test) = imdb.load_data(maxlen=40)
63 | assert len(x_train) == len(y_train)
64 | assert len(x_test) == len(y_test)
65 | word_index = imdb.get_word_index()
66 | assert isinstance(word_index, dict)
67 |
68 |
69 | def test_boston_housing():
70 | # only run data download tests 20% of the time
71 | # to speed up frequent testing
72 | random.seed(time.time())
73 | if random.random() > 0.8:
74 | (x_train, y_train), (x_test, y_test) = boston_housing.load_data()
75 | assert len(x_train) == len(y_train)
76 | assert len(x_test) == len(y_test)
77 |
78 |
79 | def test_fashion_mnist():
80 | # only run data download tests 20% of the time
81 | # to speed up frequent testing
82 | random.seed(time.time())
83 | if random.random() > 0.8:
84 | (x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
85 | assert len(x_train) == len(y_train) == 60000
86 | assert len(x_test) == len(y_test) == 10000
87 |
88 |
89 | if __name__ == '__main__':
90 | pytest.main([__file__])
91 |
--------------------------------------------------------------------------------
/tests/integration_tests/test_image_data_tasks.py:
--------------------------------------------------------------------------------
1 | from __future__ import print_function
2 | import numpy as np
3 | import pytest
4 |
5 | from keras.utils.test_utils import get_test_data, keras_test
6 | from keras.models import Sequential
7 | from keras import layers
8 | from keras.utils.np_utils import to_categorical
9 |
10 |
11 | @keras_test
12 | def test_image_classification():
13 | np.random.seed(1337)
14 | input_shape = (16, 16, 3)
15 | (x_train, y_train), (x_test, y_test) = get_test_data(num_train=500,
16 | num_test=200,
17 | input_shape=input_shape,
18 | classification=True,
19 | num_classes=4)
20 | y_train = to_categorical(y_train)
21 | y_test = to_categorical(y_test)
22 |
23 | model = Sequential([
24 | layers.Conv2D(filters=8, kernel_size=3,
25 | activation='relu',
26 | input_shape=input_shape),
27 | layers.MaxPooling2D(pool_size=2),
28 | layers.Conv2D(filters=4, kernel_size=(3, 3),
29 | activation='relu', padding='same'),
30 | layers.GlobalAveragePooling2D(),
31 | layers.Dense(y_test.shape[-1], activation='softmax')
32 | ])
33 | model.compile(loss='categorical_crossentropy',
34 | optimizer='rmsprop',
35 | metrics=['accuracy'])
36 | model.summary()
37 | history = model.fit(x_train, y_train, epochs=10, batch_size=16,
38 | validation_data=(x_test, y_test),
39 | verbose=0)
40 | assert history.history['val_acc'][-1] > 0.75
41 | config = model.get_config()
42 | model = Sequential.from_config(config)
43 |
44 |
45 | if __name__ == '__main__':
46 | pytest.main([__file__])
47 |
--------------------------------------------------------------------------------
/tests/integration_tests/test_vector_data_tasks.py:
--------------------------------------------------------------------------------
1 | from __future__ import print_function
2 | import pytest
3 |
4 | from keras.utils.test_utils import get_test_data, keras_test
5 | from keras.models import Sequential
6 | from keras import layers
7 | import keras
8 | from keras.utils.np_utils import to_categorical
9 |
10 | num_classes = 2
11 |
12 |
13 | @keras_test
14 | def test_vector_classification():
15 | '''
16 | Classify random float vectors into 2 classes with logistic regression
17 | using 2 layer neural network with ReLU hidden units.
18 | '''
19 | (x_train, y_train), (x_test, y_test) = get_test_data(num_train=500,
20 | num_test=200,
21 | input_shape=(20,),
22 | classification=True,
23 | num_classes=num_classes)
24 | y_train = to_categorical(y_train)
25 | y_test = to_categorical(y_test)
26 |
27 | # Test with Sequential API
28 | model = Sequential([
29 | layers.Dense(16, input_shape=(x_train.shape[-1],), activation='relu'),
30 | layers.Dense(8),
31 | layers.Activation('relu'),
32 | layers.Dense(num_classes, activation='softmax')
33 | ])
34 | model.compile(loss='categorical_crossentropy',
35 | optimizer='rmsprop',
36 | metrics=['accuracy'])
37 | model.summary()
38 | history = model.fit(x_train, y_train, epochs=15, batch_size=16,
39 | validation_data=(x_test, y_test),
40 | verbose=0)
41 | assert(history.history['val_acc'][-1] > 0.8)
42 | config = model.get_config()
43 | model = Sequential.from_config(config)
44 |
45 |
46 | @keras_test
47 | def test_vector_classification_functional():
48 | (x_train, y_train), (x_test, y_test) = get_test_data(num_train=500,
49 | num_test=200,
50 | input_shape=(20,),
51 | classification=True,
52 | num_classes=num_classes)
53 | # Test with functional API
54 | inputs = layers.Input(shape=(x_train.shape[-1],))
55 | x = layers.Dense(16, activation=keras.activations.relu)(inputs)
56 | x = layers.Dense(8)(x)
57 | x = layers.Activation('relu')(x)
58 | outputs = layers.Dense(num_classes, activation='softmax')(x)
59 | model = keras.models.Model(inputs, outputs)
60 | model.compile(loss=keras.losses.sparse_categorical_crossentropy,
61 | optimizer=keras.optimizers.RMSprop(),
62 | metrics=['acc'])
63 | history = model.fit(x_train, y_train, epochs=15, batch_size=16,
64 | validation_data=(x_test, y_test),
65 | verbose=0)
66 | assert(history.history['val_acc'][-1] > 0.8)
67 |
68 |
69 | @keras_test
70 | def test_vector_regression():
71 | '''
72 | Perform float data prediction (regression) using 2 layer MLP
73 | with tanh and sigmoid activations.
74 | '''
75 | (x_train, y_train), (x_test, y_test) = get_test_data(num_train=500,
76 | num_test=200,
77 | input_shape=(20,),
78 | output_shape=(num_classes,),
79 | classification=False)
80 |
81 | model = Sequential([
82 | layers.Dense(16, input_shape=(x_train.shape[-1],), activation='tanh'),
83 | layers.Dense(num_classes)
84 | ])
85 |
86 | model.compile(loss='hinge', optimizer='adagrad')
87 | history = model.fit(x_train, y_train, epochs=20, batch_size=16,
88 | validation_data=(x_test, y_test), verbose=0)
89 | assert (history.history['val_loss'][-1] < 0.9)
90 |
91 |
92 | if __name__ == '__main__':
93 | pytest.main([__file__])
94 |
--------------------------------------------------------------------------------
/tests/keras/constraints_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | import numpy as np
3 | from numpy.testing import assert_allclose
4 |
5 | from keras import backend as K
6 | from keras import constraints
7 | from keras.utils.test_utils import keras_test
8 |
9 |
10 | def get_test_values():
11 | return [0.1, 0.5, 3, 8, 1e-7]
12 |
13 |
14 | def get_example_array():
15 | np.random.seed(3537)
16 | example_array = np.random.random((100, 100)) * 100. - 50.
17 | example_array[0, 0] = 0. # 0 could possibly cause trouble
18 | return example_array
19 |
20 |
21 | def test_serialization():
22 | all_activations = ['max_norm', 'non_neg',
23 | 'unit_norm', 'min_max_norm']
24 | for name in all_activations:
25 | fn = constraints.get(name)
26 | ref_fn = getattr(constraints, name)()
27 | assert fn.__class__ == ref_fn.__class__
28 | config = constraints.serialize(fn)
29 | fn = constraints.deserialize(config)
30 | assert fn.__class__ == ref_fn.__class__
31 |
32 |
33 | @keras_test
34 | def test_max_norm():
35 | array = get_example_array()
36 | for m in get_test_values():
37 | norm_instance = constraints.max_norm(m)
38 | normed = norm_instance(K.variable(array))
39 | assert(np.all(K.eval(normed) < m))
40 |
41 | # a more explicit example
42 | norm_instance = constraints.max_norm(2.0)
43 | x = np.array([[0, 0, 0], [1.0, 0, 0], [3, 0, 0], [3, 3, 3]]).T
44 | x_normed_target = np.array([[0, 0, 0], [1.0, 0, 0],
45 | [2.0, 0, 0],
46 | [2. / np.sqrt(3),
47 | 2. / np.sqrt(3),
48 | 2. / np.sqrt(3)]]).T
49 | x_normed_actual = K.eval(norm_instance(K.variable(x)))
50 | assert_allclose(x_normed_actual, x_normed_target, rtol=1e-05)
51 |
52 |
53 | @keras_test
54 | def test_non_neg():
55 | non_neg_instance = constraints.non_neg()
56 | normed = non_neg_instance(K.variable(get_example_array()))
57 | assert(np.all(np.min(K.eval(normed), axis=1) == 0.))
58 |
59 |
60 | @keras_test
61 | def test_unit_norm():
62 | unit_norm_instance = constraints.unit_norm()
63 | normalized = unit_norm_instance(K.variable(get_example_array()))
64 | norm_of_normalized = np.sqrt(np.sum(K.eval(normalized) ** 2, axis=0))
65 | # In the unit norm constraint, it should be equal to 1.
66 | difference = norm_of_normalized - 1.
67 | largest_difference = np.max(np.abs(difference))
68 | assert(np.abs(largest_difference) < 10e-5)
69 |
70 |
71 | @keras_test
72 | def test_min_max_norm():
73 | array = get_example_array()
74 | for m in get_test_values():
75 | norm_instance = constraints.min_max_norm(min_value=m, max_value=m * 2)
76 | normed = norm_instance(K.variable(array))
77 | value = K.eval(normed)
78 | l2 = np.sqrt(np.sum(np.square(value), axis=0))
79 | assert not l2[l2 < m]
80 | assert not l2[l2 > m * 2 + 1e-5]
81 |
82 |
83 | if __name__ == '__main__':
84 | pytest.main([__file__])
85 |
--------------------------------------------------------------------------------
/tests/keras/layers/advanced_activations_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | from keras.utils.test_utils import layer_test
3 | from keras.utils.test_utils import keras_test
4 | from keras import layers
5 |
6 |
7 | @keras_test
8 | def test_leaky_relu():
9 | for alpha in [0., .5, -1.]:
10 | layer_test(layers.LeakyReLU, kwargs={'alpha': alpha},
11 | input_shape=(2, 3, 4))
12 |
13 |
14 | @keras_test
15 | def test_prelu():
16 | layer_test(layers.PReLU, kwargs={},
17 | input_shape=(2, 3, 4))
18 |
19 |
20 | @keras_test
21 | def test_prelu_share():
22 | layer_test(layers.PReLU, kwargs={'shared_axes': 1},
23 | input_shape=(2, 3, 4))
24 |
25 |
26 | @keras_test
27 | def test_elu():
28 | for alpha in [0., .5, -1.]:
29 | layer_test(layers.ELU, kwargs={'alpha': alpha},
30 | input_shape=(2, 3, 4))
31 |
32 |
33 | @keras_test
34 | def test_thresholded_relu():
35 | layer_test(layers.ThresholdedReLU, kwargs={'theta': 0.5},
36 | input_shape=(2, 3, 4))
37 |
38 |
39 | @keras_test
40 | def test_softmax():
41 | for axis in [1, -1]:
42 | layer_test(layers.Softmax, kwargs={'axis': axis},
43 | input_shape=(2, 3, 4))
44 |
45 |
46 | @keras_test
47 | def test_relu():
48 | for max_value in [None, 1., 6.]:
49 | layer_test(layers.ReLU, kwargs={'max_value': max_value},
50 | input_shape=(2, 3, 4))
51 |
52 |
53 | if __name__ == '__main__':
54 | pytest.main([__file__])
55 |
--------------------------------------------------------------------------------
/tests/keras/layers/embeddings_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | from keras.utils.test_utils import layer_test, keras_test
3 | from keras.layers.embeddings import Embedding
4 | import keras.backend as K
5 |
6 |
7 | @keras_test
8 | def test_embedding():
9 | layer_test(Embedding,
10 | kwargs={'output_dim': 4, 'input_dim': 10, 'input_length': 2},
11 | input_shape=(3, 2),
12 | input_dtype='int32',
13 | expected_output_dtype=K.floatx())
14 | layer_test(Embedding,
15 | kwargs={'output_dim': 4, 'input_dim': 10, 'mask_zero': True},
16 | input_shape=(3, 2),
17 | input_dtype='int32',
18 | expected_output_dtype=K.floatx())
19 | layer_test(Embedding,
20 | kwargs={'output_dim': 4, 'input_dim': 10, 'mask_zero': True},
21 | input_shape=(3, 2, 5),
22 | input_dtype='int32',
23 | expected_output_dtype=K.floatx())
24 | layer_test(Embedding,
25 | kwargs={'output_dim': 4, 'input_dim': 10, 'mask_zero': True, 'input_length': (None, 5)},
26 | input_shape=(3, 2, 5),
27 | input_dtype='int32',
28 | expected_output_dtype=K.floatx())
29 |
30 |
31 | if __name__ == '__main__':
32 | pytest.main([__file__])
33 |
--------------------------------------------------------------------------------
/tests/keras/layers/local_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 |
3 | from keras.utils.test_utils import layer_test
4 | from keras.utils.test_utils import keras_test
5 | from keras.layers import local
6 |
7 |
8 | @keras_test
9 | def test_locallyconnected_1d():
10 | num_samples = 2
11 | num_steps = 8
12 | input_dim = 5
13 | filter_length = 3
14 | filters = 4
15 | padding = 'valid'
16 | strides = 1
17 |
18 | layer_test(local.LocallyConnected1D,
19 | kwargs={'filters': filters,
20 | 'kernel_size': filter_length,
21 | 'padding': padding,
22 | 'kernel_regularizer': 'l2',
23 | 'bias_regularizer': 'l2',
24 | 'activity_regularizer': 'l2',
25 | 'strides': strides},
26 | input_shape=(num_samples, num_steps, input_dim))
27 |
28 |
29 | @keras_test
30 | def test_locallyconnected_2d():
31 | num_samples = 5
32 | filters = 3
33 | stack_size = 4
34 | num_row = 6
35 | num_col = 8
36 | padding = 'valid'
37 |
38 | for strides in [(1, 1), (2, 2)]:
39 | layer_test(local.LocallyConnected2D,
40 | kwargs={'filters': filters,
41 | 'kernel_size': 3,
42 | 'padding': padding,
43 | 'kernel_regularizer': 'l2',
44 | 'bias_regularizer': 'l2',
45 | 'activity_regularizer': 'l2',
46 | 'strides': strides,
47 | 'data_format': 'channels_last'},
48 | input_shape=(num_samples, num_row, num_col, stack_size))
49 |
50 | layer_test(local.LocallyConnected2D,
51 | kwargs={'filters': filters,
52 | 'kernel_size': (3, 3),
53 | 'padding': padding,
54 | 'kernel_regularizer': 'l2',
55 | 'bias_regularizer': 'l2',
56 | 'activity_regularizer': 'l2',
57 | 'strides': strides,
58 | 'data_format': 'channels_first'},
59 | input_shape=(num_samples, stack_size, num_row, num_col))
60 |
61 |
62 | if __name__ == '__main__':
63 | pytest.main([__file__])
64 |
--------------------------------------------------------------------------------
/tests/keras/layers/noise_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | from keras.utils.test_utils import layer_test
3 | from keras.utils.test_utils import keras_test
4 | from keras.layers import noise
5 | from keras import backend as K
6 |
7 |
8 | @keras_test
9 | @pytest.mark.skipif((K.backend() == 'cntk'),
10 | reason="cntk does not support it yet")
11 | def test_GaussianNoise():
12 | layer_test(noise.GaussianNoise,
13 | kwargs={'stddev': 1.},
14 | input_shape=(3, 2, 3))
15 |
16 |
17 | @keras_test
18 | @pytest.mark.skipif((K.backend() == 'cntk'),
19 | reason="cntk does not support it yet")
20 | def test_GaussianDropout():
21 | layer_test(noise.GaussianDropout,
22 | kwargs={'rate': 0.5},
23 | input_shape=(3, 2, 3))
24 |
25 |
26 | @keras_test
27 | @pytest.mark.skipif((K.backend() == 'cntk'),
28 | reason="cntk does not support it yet")
29 | def test_AlphaDropout():
30 | layer_test(noise.AlphaDropout,
31 | kwargs={'rate': 0.1},
32 | input_shape=(3, 2, 3))
33 |
34 |
35 | if __name__ == '__main__':
36 | pytest.main([__file__])
37 |
--------------------------------------------------------------------------------
/tests/keras/legacy/layers_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 |
3 | from keras.utils.test_utils import keras_test
4 | from keras.utils.test_utils import layer_test
5 | from keras.legacy import layers as legacy_layers
6 | from keras import regularizers
7 | from keras import constraints
8 |
9 |
10 | @keras_test
11 | def test_highway():
12 | layer_test(legacy_layers.Highway,
13 | kwargs={},
14 | input_shape=(3, 2))
15 |
16 | layer_test(legacy_layers.Highway,
17 | kwargs={'W_regularizer': regularizers.l2(0.01),
18 | 'b_regularizer': regularizers.l1(0.01),
19 | 'activity_regularizer': regularizers.l2(0.01),
20 | 'W_constraint': constraints.MaxNorm(1),
21 | 'b_constraint': constraints.MaxNorm(1)},
22 | input_shape=(3, 2))
23 |
24 |
25 | @keras_test
26 | def test_maxout_dense():
27 | layer_test(legacy_layers.MaxoutDense,
28 | kwargs={'output_dim': 3},
29 | input_shape=(3, 2))
30 |
31 | layer_test(legacy_layers.MaxoutDense,
32 | kwargs={'output_dim': 3,
33 | 'W_regularizer': regularizers.l2(0.01),
34 | 'b_regularizer': regularizers.l1(0.01),
35 | 'activity_regularizer': regularizers.l2(0.01),
36 | 'W_constraint': constraints.MaxNorm(1),
37 | 'b_constraint': constraints.MaxNorm(1)},
38 | input_shape=(3, 2))
39 |
40 |
41 | if __name__ == '__main__':
42 | pytest.main([__file__])
43 |
--------------------------------------------------------------------------------
/tests/keras/preprocessing/text_test.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | import numpy as np
4 | import pytest
5 |
6 | from keras.preprocessing.text import Tokenizer, one_hot, hashing_trick, text_to_word_sequence
7 |
8 |
9 | def test_one_hot():
10 | text = 'The cat sat on the mat.'
11 | encoded = one_hot(text, 5)
12 | assert len(encoded) == 6
13 | assert np.max(encoded) <= 4
14 | assert np.min(encoded) >= 0
15 |
16 |
17 | def test_hashing_trick_hash():
18 | text = 'The cat sat on the mat.'
19 | encoded = hashing_trick(text, 5)
20 | assert len(encoded) == 6
21 | assert np.max(encoded) <= 4
22 | assert np.min(encoded) >= 1
23 |
24 |
25 | def test_hashing_trick_md5():
26 | text = 'The cat sat on the mat.'
27 | encoded = hashing_trick(text, 5, hash_function='md5')
28 | assert len(encoded) == 6
29 | assert np.max(encoded) <= 4
30 | assert np.min(encoded) >= 1
31 |
32 |
33 | def test_tokenizer():
34 | texts = ['The cat sat on the mat.',
35 | 'The dog sat on the log.',
36 | 'Dogs and cats living together.']
37 | tokenizer = Tokenizer(num_words=10)
38 | tokenizer.fit_on_texts(texts)
39 |
40 | sequences = []
41 | for seq in tokenizer.texts_to_sequences_generator(texts):
42 | sequences.append(seq)
43 | assert np.max(np.max(sequences)) < 10
44 | assert np.min(np.min(sequences)) == 1
45 |
46 | tokenizer.fit_on_sequences(sequences)
47 |
48 | for mode in ['binary', 'count', 'tfidf', 'freq']:
49 | matrix = tokenizer.texts_to_matrix(texts, mode)
50 |
51 |
52 | def test_sequential_fit():
53 | texts = ['The cat sat on the mat.',
54 | 'The dog sat on the log.',
55 | 'Dogs and cats living together.']
56 | word_sequences = [
57 | ['The', 'cat', 'is', 'sitting'],
58 | ['The', 'dog', 'is', 'standing']
59 | ]
60 |
61 | tokenizer = Tokenizer()
62 | tokenizer.fit_on_texts(texts)
63 | tokenizer.fit_on_texts(word_sequences)
64 |
65 | assert tokenizer.document_count == 5
66 |
67 | tokenizer.texts_to_matrix(texts)
68 | tokenizer.texts_to_matrix(word_sequences)
69 |
70 |
71 | def test_text_to_word_sequence():
72 | text = 'hello! ? world!'
73 | assert text_to_word_sequence(text) == ['hello', 'world']
74 |
75 |
76 | def test_text_to_word_sequence_multichar_split():
77 | text = 'hello!stop?world!'
78 | assert text_to_word_sequence(text, split='stop') == ['hello', 'world']
79 |
80 |
81 | def test_text_to_word_sequence_unicode():
82 | text = u'ali! veli? kırk dokuz elli'
83 | assert text_to_word_sequence(text) == [u'ali', u'veli', u'kırk', u'dokuz', u'elli']
84 |
85 |
86 | def test_text_to_word_sequence_unicode_multichar_split():
87 | text = u'ali!stopveli?stopkırkstopdokuzstopelli'
88 | assert text_to_word_sequence(text, split='stop') == [u'ali', u'veli', u'kırk', u'dokuz', u'elli']
89 |
90 |
91 | def test_tokenizer_unicode():
92 | texts = [u'ali veli kırk dokuz elli', u'ali veli kırk dokuz elli veli kırk dokuz']
93 | tokenizer = Tokenizer(num_words=5)
94 | tokenizer.fit_on_texts(texts)
95 |
96 | assert len(tokenizer.word_counts) == 5
97 |
98 |
99 | def test_tokenizer_oov_flag():
100 | """
101 | Test of Out of Vocabulary (OOV) flag in Tokenizer
102 | """
103 | x_train = ['This text has only known words']
104 | x_test = ['This text has some unknown words'] # 2 OOVs: some, unknown
105 |
106 | # Default, without OOV flag
107 | tokenizer = Tokenizer()
108 | tokenizer.fit_on_texts(x_train)
109 | x_test_seq = tokenizer.texts_to_sequences(x_test)
110 | assert len(x_test_seq[0]) == 4 # discards 2 OOVs
111 |
112 | # With OOV feature
113 | tokenizer = Tokenizer(oov_token='')
114 | tokenizer.fit_on_texts(x_train)
115 | x_test_seq = tokenizer.texts_to_sequences(x_test)
116 | assert len(x_test_seq[0]) == 6 # OOVs marked in place
117 |
118 |
119 | if __name__ == '__main__':
120 | pytest.main([__file__])
121 |
--------------------------------------------------------------------------------
/tests/keras/regularizers_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 |
3 | from keras.models import Sequential, Model
4 | from keras.layers import Dense, Input, Average
5 | from keras.utils import np_utils
6 | from keras.utils import test_utils
7 | from keras import regularizers
8 | from keras import backend as K
9 |
10 | data_dim = 5
11 | num_classes = 2
12 | batch_size = 10
13 |
14 |
15 | def get_data():
16 | (x_train, y_train), _ = test_utils.get_test_data(
17 | num_train=batch_size,
18 | num_test=batch_size,
19 | input_shape=(data_dim,),
20 | classification=True,
21 | num_classes=num_classes)
22 | y_train = np_utils.to_categorical(y_train, num_classes)
23 |
24 | return x_train, y_train
25 |
26 |
27 | def create_model(kernel_regularizer=None, activity_regularizer=None):
28 | model = Sequential()
29 | model.add(Dense(num_classes,
30 | kernel_regularizer=kernel_regularizer,
31 | activity_regularizer=activity_regularizer,
32 | input_shape=(data_dim,)))
33 | return model
34 |
35 |
36 | def create_multi_input_model_from(layer1, layer2):
37 | input_1 = Input(shape=(data_dim,))
38 | input_2 = Input(shape=(data_dim,))
39 | out1 = layer1(input_1)
40 | out2 = layer2(input_2)
41 | out = Average()([out1, out2])
42 | model = Model([input_1, input_2], out)
43 | model.add_loss(K.mean(out2))
44 | model.add_loss(1)
45 | model.add_loss(1)
46 | return model
47 |
48 |
49 | def test_kernel_regularization():
50 | x_train, y_train = get_data()
51 | for reg in [regularizers.l1(),
52 | regularizers.l2(),
53 | regularizers.l1_l2()]:
54 | model = create_model(kernel_regularizer=reg)
55 | model.compile(loss='categorical_crossentropy', optimizer='sgd')
56 | assert len(model.losses) == 1
57 | model.train_on_batch(x_train, y_train)
58 |
59 |
60 | def test_activity_regularization():
61 | x_train, y_train = get_data()
62 | for reg in [regularizers.l1(), regularizers.l2()]:
63 | model = create_model(activity_regularizer=reg)
64 | model.compile(loss='categorical_crossentropy', optimizer='sgd')
65 | assert len(model.losses) == 1
66 | model.train_on_batch(x_train, y_train)
67 |
68 |
69 | def test_regularization_shared_layer():
70 | dense_layer = Dense(num_classes,
71 | kernel_regularizer=regularizers.l1(),
72 | activity_regularizer=regularizers.l1())
73 |
74 | model = create_multi_input_model_from(dense_layer, dense_layer)
75 | model.compile(loss='categorical_crossentropy', optimizer='sgd')
76 | assert len(model.losses) == 6
77 |
78 |
79 | def test_regularization_shared_model():
80 | dense_layer = Dense(num_classes,
81 | kernel_regularizer=regularizers.l1(),
82 | activity_regularizer=regularizers.l1())
83 |
84 | input_tensor = Input(shape=(data_dim,))
85 | dummy_model = Model(input_tensor, dense_layer(input_tensor))
86 |
87 | model = create_multi_input_model_from(dummy_model, dummy_model)
88 | model.compile(loss='categorical_crossentropy', optimizer='sgd')
89 | assert len(model.losses) == 6
90 |
91 |
92 | def test_regularization_shared_layer_in_different_models():
93 | shared_dense = Dense(num_classes,
94 | kernel_regularizer=regularizers.l1(),
95 | activity_regularizer=regularizers.l1())
96 | models = []
97 | for _ in range(2):
98 | input_tensor = Input(shape=(data_dim,))
99 | unshared_dense = Dense(num_classes, kernel_regularizer=regularizers.l1())
100 | out = unshared_dense(shared_dense(input_tensor))
101 | models.append(Model(input_tensor, out))
102 |
103 | model = create_multi_input_model_from(*models)
104 | model.compile(loss='categorical_crossentropy', optimizer='sgd')
105 | assert len(model.losses) == 8
106 |
107 |
108 | if __name__ == '__main__':
109 | pytest.main([__file__])
110 |
--------------------------------------------------------------------------------
/tests/keras/utils/conv_utils_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | import numpy as np
3 | from keras.utils import conv_utils
4 |
5 |
6 | def test_normalize_tuple():
7 | assert conv_utils.normalize_tuple(5, 2, 'kernel_size') == (5, 5)
8 | assert conv_utils.normalize_tuple([7, 9], 2, 'kernel_size') == (7, 9)
9 |
10 | with pytest.raises(ValueError):
11 | conv_utils.normalize_tuple(None, 2, 'kernel_size')
12 | with pytest.raises(ValueError):
13 | conv_utils.normalize_tuple([2, 3, 4], 2, 'kernel_size')
14 | with pytest.raises(ValueError):
15 | conv_utils.normalize_tuple(['str', 'impossible'], 2, 'kernel_size')
16 |
17 |
18 | def test_invalid_data_format():
19 | with pytest.raises(ValueError):
20 | conv_utils.normalize_data_format('channels_middle')
21 |
22 |
23 | def test_invalid_padding():
24 | with pytest.raises(ValueError):
25 | conv_utils.normalize_padding('diagonal')
26 |
27 |
28 | def test_invalid_convert_kernel():
29 | with pytest.raises(ValueError):
30 | conv_utils.convert_kernel(np.zeros((10, 20)))
31 |
32 |
33 | def test_conv_output_length():
34 | assert conv_utils.conv_output_length(None, 7, 'same', 1) is None
35 | assert conv_utils.conv_output_length(224, 7, 'same', 1) == 224
36 | assert conv_utils.conv_output_length(224, 7, 'same', 2) == 112
37 | assert conv_utils.conv_output_length(32, 5, 'valid', 1) == 28
38 | assert conv_utils.conv_output_length(32, 5, 'valid', 2) == 14
39 | assert conv_utils.conv_output_length(32, 5, 'causal', 1) == 32
40 | assert conv_utils.conv_output_length(32, 5, 'causal', 2) == 16
41 | assert conv_utils.conv_output_length(32, 5, 'full', 1) == 36
42 | assert conv_utils.conv_output_length(32, 5, 'full', 2) == 18
43 |
44 | with pytest.raises(AssertionError):
45 | conv_utils.conv_output_length(32, 5, 'diagonal', 2)
46 |
47 |
48 | def test_conv_input_length():
49 | assert conv_utils.conv_input_length(None, 7, 'same', 1) is None
50 | assert conv_utils.conv_input_length(112, 7, 'same', 1) == 112
51 | assert conv_utils.conv_input_length(112, 7, 'same', 2) == 223
52 | assert conv_utils.conv_input_length(28, 5, 'valid', 1) == 32
53 | assert conv_utils.conv_input_length(14, 5, 'valid', 2) == 31
54 | assert conv_utils.conv_input_length(36, 5, 'full', 1) == 32
55 | assert conv_utils.conv_input_length(18, 5, 'full', 2) == 31
56 |
57 | with pytest.raises(AssertionError):
58 | conv_utils.conv_output_length(18, 5, 'diagonal', 2)
59 |
60 |
61 | def test_deconv_length():
62 | assert conv_utils.deconv_length(None, 1, 7, 'same') is None
63 | assert conv_utils.deconv_length(224, 1, 7, 'same') == 224
64 | assert conv_utils.deconv_length(224, 2, 7, 'same') == 448
65 | assert conv_utils.deconv_length(32, 1, 5, 'valid') == 36
66 | assert conv_utils.deconv_length(32, 2, 5, 'valid') == 67
67 | assert conv_utils.deconv_length(32, 1, 5, 'full') == 28
68 | assert conv_utils.deconv_length(32, 2, 5, 'full') == 59
69 |
70 |
71 | if __name__ == '__main__':
72 | pytest.main([__file__])
73 |
--------------------------------------------------------------------------------
/tests/keras/utils/io_utils_test.py:
--------------------------------------------------------------------------------
1 | '''Tests for functions in io_utils.py.
2 | '''
3 | import os
4 | import sys
5 | import pytest
6 | from keras.models import Sequential
7 | from keras.layers import Dense
8 | from keras.utils.io_utils import HDF5Matrix
9 | from keras.utils.io_utils import ask_to_proceed_with_overwrite
10 | import numpy as np
11 | import six
12 | import warnings
13 | import h5py
14 | try:
15 | from unittest.mock import patch
16 | except:
17 | from mock import patch
18 |
19 |
20 | @pytest.fixture
21 | def in_tmpdir(tmpdir):
22 | """Runs a function in a temporary directory.
23 |
24 | Checks that the directory is empty afterwards.
25 | """
26 | with tmpdir.as_cwd():
27 | yield None
28 | assert not tmpdir.listdir()
29 |
30 |
31 | def create_dataset(h5_path='test.h5'):
32 | X = np.random.randn(200, 10).astype('float32')
33 | y = np.random.randint(0, 2, size=(200, 1))
34 | with h5py.File(h5_path, 'w') as f:
35 | # Creating dataset to store features
36 | X_dset = f.create_dataset('my_data', (200, 10), dtype='f')
37 | X_dset[:] = X
38 | # Creating dataset to store labels
39 | y_dset = f.create_dataset('my_labels', (200, 1), dtype='i')
40 | y_dset[:] = y
41 |
42 |
43 | def test_io_utils(in_tmpdir):
44 | '''Tests the HDF5Matrix code using the sample from @jfsantos at
45 | https://gist.github.com/jfsantos/e2ef822c744357a4ed16ec0c885100a3
46 | '''
47 | h5_path = 'test.h5'
48 | create_dataset(h5_path)
49 |
50 | # Instantiating HDF5Matrix for the training set, which is a slice of the first 150 elements
51 | X_train = HDF5Matrix(h5_path, 'my_data', start=0, end=150)
52 | y_train = HDF5Matrix(h5_path, 'my_labels', start=0, end=150)
53 |
54 | # Likewise for the test set
55 | X_test = HDF5Matrix(h5_path, 'my_data', start=150, end=200)
56 | y_test = HDF5Matrix(h5_path, 'my_labels', start=150, end=200)
57 |
58 | # HDF5Matrix behave more or less like Numpy matrices with regards to indexing
59 | assert y_train.shape == (150, 1), 'HDF5Matrix shape should match input array'
60 | # But they do not support negative indices, so don't try print(X_train[-1])
61 |
62 | assert y_train.dtype == np.dtype('i'), 'HDF5Matrix dtype should match input array'
63 | assert y_train.ndim == 2, 'HDF5Matrix ndim should match input array'
64 | assert y_train.size == 150, 'HDF5Matrix ndim should match input array'
65 |
66 | model = Sequential()
67 | model.add(Dense(64, input_shape=(10,), activation='relu'))
68 | model.add(Dense(1, activation='sigmoid'))
69 |
70 | model.compile(loss='binary_crossentropy', optimizer='sgd')
71 |
72 | # Note: you have to use shuffle='batch' or False with HDF5Matrix
73 | model.fit(X_train, y_train, batch_size=32, shuffle='batch', verbose=False)
74 | # test that evalutation and prediction don't crash and return reasonable results
75 | out_pred = model.predict(X_test, batch_size=32, verbose=False)
76 | out_eval = model.evaluate(X_test, y_test, batch_size=32, verbose=False)
77 |
78 | assert out_pred.shape == (50, 1), 'Prediction shape does not match'
79 | assert out_eval.shape == (), 'Shape of evaluation does not match'
80 | assert out_eval > 0, 'Evaluation value does not meet criteria: {}'.format(out_eval)
81 |
82 | # test slicing for shortened array
83 | assert len(X_train[0:]) == len(X_train), 'Incorrect shape for sliced data'
84 |
85 | # test __getitem__
86 | with pytest.raises(IndexError):
87 | X_train[1000]
88 | with pytest.raises(IndexError):
89 | X_train[1000:1001]
90 | with pytest.raises(IndexError):
91 | X_train[[1000, 1001]]
92 | with pytest.raises(IndexError):
93 | X_train[six.moves.range(1000, 1001)]
94 | with pytest.raises(IndexError):
95 | X_train[np.array([1000])]
96 | with pytest.raises(TypeError):
97 | X_train[None]
98 | assert (X_train[0] == X_train[:1][0]).all()
99 | assert (X_train[[0, 1]] == X_train[:2]).all()
100 | assert (X_train[np.array([0, 1])] == X_train[:2]).all()
101 |
102 | # test normalizer
103 | normalizer = lambda x: x + 1
104 | normalized_X_train = HDF5Matrix(h5_path, 'my_data', start=0, end=150, normalizer=normalizer)
105 | assert np.isclose(normalized_X_train[0][0], X_train[0][0] + 1)
106 |
107 | os.remove(h5_path)
108 |
109 |
110 | def test_ask_to_proceed_with_overwrite():
111 | with patch('six.moves.input') as mock:
112 | mock.return_value = 'y'
113 | assert ask_to_proceed_with_overwrite('/tmp/not_exists')
114 |
115 | mock.return_value = 'n'
116 | assert not ask_to_proceed_with_overwrite('/tmp/not_exists')
117 |
118 |
119 | if __name__ == '__main__':
120 | pytest.main([__file__])
121 |
--------------------------------------------------------------------------------
/tests/keras/utils/layer_utils_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | import numpy as np
3 | from numpy.testing import assert_allclose
4 | from keras import backend as K
5 | from keras.layers import Conv2D
6 | from keras.layers import Dense
7 | from keras.layers import Flatten
8 | from keras.models import Sequential
9 | from keras.utils import layer_utils
10 | from keras.utils.test_utils import keras_test
11 |
12 |
13 | @keras_test
14 | def test_convert_weights():
15 | def get_model(shape, data_format):
16 | model = Sequential()
17 | model.add(Conv2D(filters=2,
18 | kernel_size=(4, 3),
19 | input_shape=shape,
20 | data_format=data_format))
21 | model.add(Flatten())
22 | model.add(Dense(5))
23 | return model
24 |
25 | for data_format in ['channels_first', 'channels_last']:
26 | if data_format == 'channels_first':
27 | shape = (3, 5, 5)
28 | target_shape = (5, 5, 3)
29 | prev_shape = (2, 3, 2)
30 | flip = lambda x: np.flip(np.flip(x, axis=2), axis=3)
31 | transpose = lambda x: np.transpose(x, (0, 2, 3, 1))
32 | target_data_format = 'channels_last'
33 | elif data_format == 'channels_last':
34 | shape = (5, 5, 3)
35 | target_shape = (3, 5, 5)
36 | prev_shape = (2, 2, 3)
37 | flip = lambda x: np.flip(np.flip(x, axis=1), axis=2)
38 | transpose = lambda x: np.transpose(x, (0, 3, 1, 2))
39 | target_data_format = 'channels_first'
40 |
41 | model1 = get_model(shape, data_format)
42 | model2 = get_model(target_shape, target_data_format)
43 | conv = K.function([model1.input], [model1.layers[0].output])
44 |
45 | x = np.random.random((1,) + shape)
46 |
47 | # Test equivalence of convert_all_kernels_in_model
48 | convout1 = conv([x])[0]
49 | layer_utils.convert_all_kernels_in_model(model1)
50 | convout2 = flip(conv([flip(x)])[0])
51 |
52 | assert_allclose(convout1, convout2, atol=1e-5)
53 |
54 | # Test equivalence of convert_dense_weights_data_format
55 | out1 = model1.predict(x)
56 | layer_utils.convert_dense_weights_data_format(model1.layers[2], prev_shape, target_data_format)
57 | for (src, dst) in zip(model1.layers, model2.layers):
58 | dst.set_weights(src.get_weights())
59 | out2 = model2.predict(transpose(x))
60 |
61 | assert_allclose(out1, out2, atol=1e-5)
62 |
63 |
64 | if __name__ == '__main__':
65 | pytest.main([__file__])
66 |
--------------------------------------------------------------------------------
/tests/keras/utils/np_utils_test.py:
--------------------------------------------------------------------------------
1 | """Tests for functions in np_utils.py.
2 | """
3 | import numpy as np
4 | import pytest
5 | from keras.utils import to_categorical
6 |
7 |
8 | def test_to_categorical():
9 | num_classes = 5
10 | shapes = [(1,), (3,), (4, 3), (5, 4, 3), (3, 1), (3, 2, 1)]
11 | expected_shapes = [(1, num_classes),
12 | (3, num_classes),
13 | (4, 3, num_classes),
14 | (5, 4, 3, num_classes),
15 | (3, num_classes),
16 | (3, 2, num_classes)]
17 | labels = [np.random.randint(0, num_classes, shape) for shape in shapes]
18 | one_hots = [to_categorical(label, num_classes) for label in labels]
19 | for label, one_hot, expected_shape in zip(labels,
20 | one_hots,
21 | expected_shapes):
22 | # Check shape
23 | assert one_hot.shape == expected_shape
24 | # Make sure there are only 0s and 1s
25 | assert np.array_equal(one_hot, one_hot.astype(bool))
26 | # Make sure there is exactly one 1 in a row
27 | assert np.all(one_hot.sum(axis=-1) == 1)
28 | # Get original labels back from one hots
29 | assert np.all(np.argmax(one_hot, -1).reshape(label.shape) == label)
30 |
31 |
32 | if __name__ == '__main__':
33 | pytest.main([__file__])
34 |
--------------------------------------------------------------------------------
/tests/keras/utils/vis_utils_test.py:
--------------------------------------------------------------------------------
1 | import pytest
2 | import os
3 | import sys
4 | import numpy as np
5 | from keras.layers import Conv2D
6 | from keras.layers import Dense
7 | from keras.layers import Flatten
8 | from keras.layers import LSTM
9 | from keras.layers import TimeDistributed
10 | from keras.models import Sequential
11 | from keras.utils import vis_utils
12 |
13 |
14 | def test_plot_model():
15 | model = Sequential()
16 | model.add(Conv2D(filters=2, kernel_size=(2, 3), input_shape=(3, 5, 5), name='conv'))
17 | model.add(Flatten(name='flat'))
18 | model.add(Dense(5, name='dense1'))
19 | vis_utils.plot_model(model, to_file='model1.png', show_layer_names=False)
20 | os.remove('model1.png')
21 |
22 | model = Sequential()
23 | model.add(LSTM(16, return_sequences=True, input_shape=(2, 3), name='lstm'))
24 | model.add(TimeDistributed(Dense(5, name='dense2')))
25 | vis_utils.plot_model(model, to_file='model2.png', show_shapes=True)
26 | os.remove('model2.png')
27 |
28 |
29 | if __name__ == '__main__':
30 | pytest.main([__file__])
31 |
--------------------------------------------------------------------------------
/tests/test_dynamic_trainability.py:
--------------------------------------------------------------------------------
1 | from __future__ import absolute_import
2 | from __future__ import print_function
3 | import pytest
4 |
5 | from keras.utils.test_utils import keras_test
6 | from keras.models import Model, Sequential
7 | from keras.layers import Dense, Input
8 |
9 |
10 | @keras_test
11 | def test_layer_trainability_switch():
12 | # with constructor argument, in Sequential
13 | model = Sequential()
14 | model.add(Dense(2, trainable=False, input_dim=1))
15 | assert model.trainable_weights == []
16 |
17 | # by setting the `trainable` argument, in Sequential
18 | model = Sequential()
19 | layer = Dense(2, input_dim=1)
20 | model.add(layer)
21 | assert model.trainable_weights == layer.trainable_weights
22 | layer.trainable = False
23 | assert model.trainable_weights == []
24 |
25 | # with constructor argument, in Model
26 | x = Input(shape=(1,))
27 | y = Dense(2, trainable=False)(x)
28 | model = Model(x, y)
29 | assert model.trainable_weights == []
30 |
31 | # by setting the `trainable` argument, in Model
32 | x = Input(shape=(1,))
33 | layer = Dense(2)
34 | y = layer(x)
35 | model = Model(x, y)
36 | assert model.trainable_weights == layer.trainable_weights
37 | layer.trainable = False
38 | assert model.trainable_weights == []
39 |
40 |
41 | @keras_test
42 | def test_model_trainability_switch():
43 | # a non-trainable model has no trainable weights
44 | x = Input(shape=(1,))
45 | y = Dense(2)(x)
46 | model = Model(x, y)
47 | model.trainable = False
48 | assert model.trainable_weights == []
49 |
50 | # same for Sequential
51 | model = Sequential()
52 | model.add(Dense(2, input_dim=1))
53 | model.trainable = False
54 | assert model.trainable_weights == []
55 |
56 |
57 | @keras_test
58 | def test_nested_model_trainability():
59 | # a Sequential inside a Model
60 | inner_model = Sequential()
61 | inner_model.add(Dense(2, input_dim=1))
62 |
63 | x = Input(shape=(1,))
64 | y = inner_model(x)
65 | outer_model = Model(x, y)
66 | assert outer_model.trainable_weights == inner_model.trainable_weights
67 | inner_model.trainable = False
68 | assert outer_model.trainable_weights == []
69 | inner_model.trainable = True
70 | inner_model.layers[-1].trainable = False
71 | assert outer_model.trainable_weights == []
72 |
73 | # a Sequential inside a Sequential
74 | inner_model = Sequential()
75 | inner_model.add(Dense(2, input_dim=1))
76 | outer_model = Sequential()
77 | outer_model.add(inner_model)
78 | assert outer_model.trainable_weights == inner_model.trainable_weights
79 | inner_model.trainable = False
80 | assert outer_model.trainable_weights == []
81 | inner_model.trainable = True
82 | inner_model.layers[-1].trainable = False
83 | assert outer_model.trainable_weights == []
84 |
85 | # a Model inside a Model
86 | x = Input(shape=(1,))
87 | y = Dense(2)(x)
88 | inner_model = Model(x, y)
89 | x = Input(shape=(1,))
90 | y = inner_model(x)
91 | outer_model = Model(x, y)
92 | assert outer_model.trainable_weights == inner_model.trainable_weights
93 | inner_model.trainable = False
94 | assert outer_model.trainable_weights == []
95 | inner_model.trainable = True
96 | inner_model.layers[-1].trainable = False
97 | assert outer_model.trainable_weights == []
98 |
99 | # a Model inside a Sequential
100 | x = Input(shape=(1,))
101 | y = Dense(2)(x)
102 | inner_model = Model(x, y)
103 | outer_model = Sequential()
104 | outer_model.add(inner_model)
105 | assert outer_model.trainable_weights == inner_model.trainable_weights
106 | inner_model.trainable = False
107 | assert outer_model.trainable_weights == []
108 | inner_model.trainable = True
109 | inner_model.layers[-1].trainable = False
110 | assert outer_model.trainable_weights == []
111 |
112 |
113 | if __name__ == '__main__':
114 | pytest.main([__file__])
115 |
--------------------------------------------------------------------------------
/tests/test_loss_masking.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import pytest
3 |
4 | from keras.models import Sequential
5 | from keras.engine.training_utils import weighted_masked_objective
6 | from keras.layers import TimeDistributed, Masking, Dense
7 | from keras.utils.test_utils import keras_test
8 | from keras import losses
9 | from keras import backend as K
10 |
11 |
12 | @keras_test
13 | def test_masking():
14 | np.random.seed(1337)
15 | x = np.array([[[1], [1]],
16 | [[0], [0]]])
17 | model = Sequential()
18 | model.add(Masking(mask_value=0, input_shape=(2, 1)))
19 | model.add(TimeDistributed(Dense(1, kernel_initializer='one')))
20 | model.compile(loss='mse', optimizer='sgd')
21 | y = np.array([[[1], [1]],
22 | [[1], [1]]])
23 | loss = model.train_on_batch(x, y)
24 | assert loss == 0
25 |
26 |
27 | @keras_test
28 | def test_loss_masking():
29 | weighted_loss = weighted_masked_objective(losses.get('mae'))
30 | shape = (3, 4, 2)
31 | x = np.arange(24).reshape(shape)
32 | y = 2 * x
33 |
34 | # Normally the trailing 1 is added by standardize_weights
35 | weights = np.ones((3,))
36 | mask = np.ones((3, 4))
37 | mask[1, 0] = 0
38 |
39 | out = K.eval(weighted_loss(K.variable(x),
40 | K.variable(y),
41 | K.variable(weights),
42 | K.variable(mask)))
43 |
44 |
45 | if __name__ == '__main__':
46 | pytest.main([__file__])
47 |
--------------------------------------------------------------------------------