Skip to content
This repository has been archived by the owner on Mar 3, 2024. It is now read-only.

Commit

Permalink
Support tf.keras (#57)
Browse files Browse the repository at this point in the history
* #55 Merge outputs as feature

* Update README.md

* Support tf.keras

* Fix masked layer

* Fix masked layer
  • Loading branch information
CyberZHG authored May 11, 2019
1 parent 2a4a981 commit 5b44d71
Show file tree
Hide file tree
Showing 24 changed files with 104 additions and 36 deletions.
16 changes: 13 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ dist: xenial
language: python
python:
- 2.7
- 3.7
- 3.6
env:
- KERAS_BACKEND=tensorflow
- KERAS_BACKEND=tensorflow TF_KERAS=1
- KERAS_BACKEND=theano THEANO_FLAGS=optimizer=fast_compile
# - KERAS_BACKEND=cntk PYTHONWARNINGS=ignore
install:
- if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
Expand All @@ -24,9 +26,17 @@ install:
- pip install -r requirements.txt
- pip install -r requirements-dev.txt
- if [[ $KERAS_BACKEND == "theano" ]]; then pip install theano && conda install mkl mkl-service; fi
- if [[ "$KERAS_BACKEND" == "cntk" ]]; then
set -e &&
pip install cntk &&
mkdir -p ~/mpi &&
pushd ~/mpi &&
wget http://cntk.ai/PythonWheel/ForKeras/depends/openmpi_1.10-3.zip &&
unzip ./openmpi_1.10-3.zip &&
sudo dpkg -i openmpi_1.10-3.deb &&
popd;
fi
- pip install coveralls
before_script:
- ./lint.sh
script:
- ./test.sh
after_success:
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,3 +122,7 @@ inputs, output_layer = get_model(
Only available when `training` is `False`.
)
```

### Use `tensorflow.python.keras`

Add `TF_KERAS=1` to environment variables to use `tensorflow.python.keras`.
4 changes: 4 additions & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,7 @@ inputs, output_layer = get_model(
output_layer_num=4, # 最后几层的输出将合并在一起作为最终的输出,只有当`training`是`False`有效
)
```

### 使用`tensorflow.python.keras`

在环境变量里加入`TF_KERAS=1`可以启用`tensorflow.python.keras`
46 changes: 46 additions & 0 deletions keras_bert/backend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import os

__all__ = [
'keras', 'utils', 'activations', 'applications', 'backend', 'datasets', 'engine',
'layers', 'preprocessing', 'wrappers', 'callbacks', 'constraints', 'initializers',
'metrics', 'models', 'losses', 'optimizers', 'regularizers',
]

if 'TF_KERAS' in os.environ and os.environ['TF_KERAS'] != '0':
from tensorflow.python import keras
from tensorflow.python.keras import utils
from tensorflow.python.keras import activations
from tensorflow.python.keras import applications
from tensorflow.python.keras import backend
from tensorflow.python.keras import datasets
from tensorflow.python.keras import engine
from tensorflow.python.keras import layers
from tensorflow.python.keras import preprocessing
from tensorflow.python.keras import wrappers
from tensorflow.python.keras import callbacks
from tensorflow.python.keras import constraints
from tensorflow.python.keras import initializers
from tensorflow.python.keras import metrics
from tensorflow.python.keras import models
from tensorflow.python.keras import losses
from tensorflow.python.keras import optimizers
from tensorflow.python.keras import regularizers
else:
import keras
from keras import utils
from keras import activations
from keras import applications
from keras import backend
from keras import datasets
from keras import engine
from keras import layers
from keras import preprocessing
from keras import wrappers
from keras import callbacks
from keras import constraints
from keras import initializers
from keras import metrics
from keras import models
from keras import losses
from keras import optimizers
from keras import regularizers
8 changes: 5 additions & 3 deletions keras_bert/bert.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import math
import keras
import keras.backend as K

import numpy as np
from keras_pos_embd import PositionEmbedding
from keras_layer_normalization import LayerNormalization
from keras_transformer import get_encoders
from keras_transformer import get_custom_objects as get_encoder_custom_objects
from .backend import keras
from .backend import backend as K
from .layers import get_inputs, get_embedding, TokenEmbedding, EmbeddingSimilarity, Masked, Extract
from .optimizers import AdamWarmup

Expand All @@ -25,7 +26,8 @@

def gelu(x):
if K.backend() == 'tensorflow':
return 0.5 * x * (1.0 + K.tf.erf(x / K.tf.sqrt(2.0)))
import tensorflow as tf
return 0.5 * x * (1.0 + tf.erf(x / tf.sqrt(2.0)))
return 0.5 * x * (1.0 + K.tanh(math.sqrt(2.0 / math.pi) * (x + 0.044715 * K.pow(x, 3))))


Expand Down
4 changes: 2 additions & 2 deletions keras_bert/layers/conv.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import keras
import keras.backend as K
from keras_bert.backend import keras
from keras_bert.backend import backend as K


class MaskedConv1D(keras.layers.Conv1D):
Expand Down
6 changes: 3 additions & 3 deletions keras_bert/layers/embedding.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import keras
import keras.backend as K
from keras_bert.backend import keras
from keras_bert.backend import backend as K
from keras_pos_embd import PositionEmbedding
from keras_layer_normalization import LayerNormalization

Expand Down Expand Up @@ -102,7 +102,7 @@ def get_config(self):

def build(self, input_shape):
self.bias = self.add_weight(
shape=(input_shape[1][0],),
shape=(int(input_shape[1][0]),),
initializer=self.initializer,
regularizer=self.regularizer,
constraint=self.constraint,
Expand Down
2 changes: 1 addition & 1 deletion keras_bert/layers/extract.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import keras
from keras_bert.backend import keras


class Extract(keras.layers.Layer):
Expand Down
2 changes: 1 addition & 1 deletion keras_bert/layers/inputs.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import keras
from keras_bert.backend import keras


def get_inputs(seq_len):
Expand Down
11 changes: 7 additions & 4 deletions keras_bert/layers/masked.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import keras
import keras.backend as K
from keras_bert.backend import keras
from keras_bert.backend import backend as K


class Masked(keras.layers.Layer):
Expand Down Expand Up @@ -36,9 +36,12 @@ def compute_output_shape(self, input_shape):

def compute_mask(self, inputs, mask=None):
token_mask = K.not_equal(inputs[1], 0)
return K.all(K.stack([token_mask, mask[0]], axis=0), axis=0)
masked = K.all(K.stack([token_mask, mask[0]], axis=0), axis=0)
if self.return_masked:
return [masked, None]
return masked

def call(self, inputs, mask=None, **kwargs):
if self.return_masked:
return [inputs[0], K.cast(self.compute_mask(inputs, mask), K.floatx())]
return [inputs[0], K.cast(self.compute_mask(inputs, mask)[0], K.floatx())]
return inputs[0]
4 changes: 2 additions & 2 deletions keras_bert/layers/pooling.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import keras
import keras.backend as K
from keras_bert.backend import keras
from keras_bert.backend import backend as K


class MaskedGlobalMaxPool1D(keras.layers.Layer):
Expand Down
2 changes: 1 addition & 1 deletion keras_bert/loader.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import json
import keras
import numpy as np
import tensorflow as tf
from .backend import keras
from .bert import get_model


Expand Down
4 changes: 2 additions & 2 deletions keras_bert/optimizers/warmup.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import keras
import keras.backend as K
from keras_bert.backend import keras
from keras_bert.backend import backend as K


class AdamWarmup(keras.optimizers.Optimizer):
Expand Down
2 changes: 0 additions & 2 deletions lint.sh

This file was deleted.

4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
numpy
Keras
keras-pos-embd==0.9.0
keras-transformer==0.21.0
keras-pos-embd==0.10.0
keras-transformer==0.22.0
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

setup(
name='keras-bert',
version='0.42.0',
version='0.43.0',
packages=find_packages(),
url='https://github.com/CyberZHG/keras-bert',
license='MIT',
Expand Down
3 changes: 2 additions & 1 deletion test.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
#!/usr/bin/env bash
nosetests --with-coverage --cover-erase --cover-html --cover-html-dir=htmlcov --cover-package="keras_bert" tests
pycodestyle --max-line-length=120 keras_bert tests && \
nosetests --with-coverage --cover-erase --cover-html --cover-html-dir=htmlcov --cover-package=keras_bert tests
2 changes: 1 addition & 1 deletion tests/layers/test_conv.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from unittest import TestCase
import keras
import numpy as np
from keras_bert.backend import keras
from keras_bert.layers import MaskedConv1D, MaskedGlobalMaxPool1D


Expand Down
2 changes: 1 addition & 1 deletion tests/layers/test_embedding.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import unittest
import keras
from keras_bert.backend import keras
from keras_bert.layers import get_inputs, get_embedding


Expand Down
2 changes: 1 addition & 1 deletion tests/layers/test_extract.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import unittest
import keras
import numpy as np
from keras_bert.backend import keras
from keras_bert.layers import Extract


Expand Down
4 changes: 2 additions & 2 deletions tests/layers/test_masked.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import unittest
import keras
import numpy as np
from keras_transformer import gelu, get_encoders
from keras_bert.backend import keras
from keras_bert.layers import get_inputs, get_embedding, Masked


Expand Down Expand Up @@ -58,14 +58,14 @@ def test_mask_result(self):
return_masked=True,
name='Masked',
)([dense_layer, mask_layer])
print([masked_layer, mask_result])
model = keras.models.Model(
inputs=[input_layer, mask_layer],
outputs=[masked_layer, mask_result],
)
model.compile(
optimizer='adam',
loss='mse',
metrics=['mse'],
)
model.summary(line_length=150)
predicts = model.predict([
Expand Down
2 changes: 1 addition & 1 deletion tests/layers/test_pooling.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from unittest import TestCase
import keras
import numpy as np
from keras_bert.backend import keras
from keras_bert.layers import MaskedGlobalMaxPool1D


Expand Down
2 changes: 1 addition & 1 deletion tests/optimizers/test_warmup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from unittest import TestCase
import keras
import numpy as np
from keras_bert.backend import keras
from keras_bert.optimizers import AdamWarmup


Expand Down
2 changes: 1 addition & 1 deletion tests/test_bert.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import unittest
import os
import tempfile
import keras
import numpy as np
from keras_bert.backend import keras
from keras_bert import gelu, get_model, get_custom_objects, get_base_dict, gen_batch_inputs


Expand Down

0 comments on commit 5b44d71

Please sign in to comment.