Skip to content

Commit 727cc8f

Browse files
authored
Add droput and its derivative in Keras converter (#126)
* Add droput and its derivative in Keras model. * code polishing.
1 parent d3cc8e9 commit 727cc8f

File tree

5 files changed

+42
-4
lines changed

5 files changed

+42
-4
lines changed

onnxmltools/convert/keras/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
# license information.
55
# --------------------------------------------------------------------------
66

7-
from .convert import convert
7+
from .convert import convert
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -------------------------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# Licensed under the MIT License. See License.txt in the project root for
4+
# license information.
5+
# --------------------------------------------------------------------------
6+
7+
from keras.layers import Dropout, SpatialDropout1D, SpatialDropout2D, SpatialDropout3D
8+
9+
from ...common._apply_operation import apply_identity
10+
from ...common._registration import register_converter
11+
12+
13+
def convert_keras_drop(scope, operator, container):
14+
apply_identity(scope, operator.inputs[0].full_name, operator.outputs[0].full_name, container)
15+
16+
register_converter(Dropout, convert_keras_drop)
17+
register_converter(SpatialDropout1D, convert_keras_drop)
18+
register_converter(SpatialDropout2D, convert_keras_drop)
19+
register_converter(SpatialDropout3D, convert_keras_drop)

onnxmltools/convert/keras/operator_converters/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from . import Crop
1515
from . import Dense
1616
from . import Dot
17+
from . import Dropout
1718
from . import Embed
1819
from . import Flatten
1920
from . import GRU
@@ -26,4 +27,3 @@
2627
from . import SimpleRNN
2728
from . import Upsample
2829
from . import ZeroPad
29-

onnxmltools/convert/keras/shape_calculators/Lazy.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,9 @@ def calculate_lazy_output_shapes(operator):
8484

8585
# RepeatVector
8686
register_shape_calculator(keras.layers.RepeatVector, calculate_lazy_output_shapes)
87+
88+
# Dropout
89+
register_shape_calculator(keras.layers.Dropout, calculate_lazy_output_shapes)
90+
register_shape_calculator(keras.layers.SpatialDropout1D, calculate_lazy_output_shapes)
91+
register_shape_calculator(keras.layers.SpatialDropout2D, calculate_lazy_output_shapes)
92+
register_shape_calculator(keras.layers.SpatialDropout3D, calculate_lazy_output_shapes)

tests/end2end/test_single_operator_with_cntk_backend.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from keras.models import Sequential, Model
1515
from keras.layers import Input, Dense, Conv2D, MaxPooling2D, AveragePooling2D, Conv2DTranspose, \
1616
Dot, Embedding, BatchNormalization, GRU, Activation, PReLU, LeakyReLU, ThresholdedReLU, Maximum, \
17-
Add, Average, Multiply, Concatenate, UpSampling2D, Flatten, RepeatVector, Reshape
17+
Add, Average, Multiply, Concatenate, UpSampling2D, Flatten, RepeatVector, Reshape, Dropout
1818
from keras.initializers import RandomUniform
1919

2020
np.random.seed(0)
@@ -163,7 +163,7 @@ def test_dense(self):
163163

164164
input = Input(shape=(C,))
165165
result = Dense(D)(input)
166-
keras_model = Model(input=input, output=result)
166+
keras_model = Model(inputs=input, outputs=result)
167167
keras_model.compile(optimizer='adagrad', loss='mse')
168168

169169
coreml_model = coremltools.converters.keras.convert(keras_model)
@@ -174,6 +174,19 @@ def test_dense(self):
174174

175175
self.assertTrue(np.allclose(y_reference, y_produced))
176176

177+
def test_dense_with_dropout(self):
178+
N, C, D = 2, 3, 2
179+
x = _create_tensor(N, C)
180+
181+
input = Input(shape=(C,))
182+
hidden = Dense(D, activation='relu')(input)
183+
result = Dropout(0.2)(hidden)
184+
185+
keras_model = Model(inputs=input, outputs=result)
186+
keras_model.compile(optimizer='sgd', loss='mse')
187+
188+
self._test_one_to_one_operator_core_keras(keras_model, x)
189+
177190
def test_conv_4d(self):
178191
N, C, H, W = 1, 2, 4, 3
179192
x = _create_tensor(N, C, H, W)

0 commit comments

Comments
 (0)