def test_merge_4d(self): layers_to_be_tested = [Add, Maximum, Multiply, Average, Concatenate] N, C, H, W = 2, 2, 1, 3 x1 = create_tensor(N, C, H, W) x2 = create_tensor(N, C, H, W) for layer in layers_to_be_tested: input1 = Input(shape=(H, W, C)) input2 = Input(shape=(H, W, C)) output = layer()([input1, input2]) model = Model(inputs=[input1, input2], outputs=output) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(model, [x1, x2])
def test_recursive_model(self): N, C, D = 2, 3, 3 x = create_tensor(N, C) sub_input1 = Input(shape=(C, )) sub_mapped1 = Dense(D)(sub_input1) sub_model1 = Model(inputs=sub_input1, outputs=sub_mapped1) sub_input2 = Input(shape=(C, )) sub_mapped2 = Dense(D)(sub_input2) sub_model2 = Model(inputs=sub_input2, outputs=sub_mapped2) input1 = Input(shape=(D, )) input2 = Input(shape=(D, )) mapped1_2 = sub_model1(input1) mapped2_2 = sub_model2(input2) sub_sum = Add()([mapped1_2, mapped2_2]) keras_model = Model(inputs=[input1, input2], output=sub_sum) try: coreml_model = coremltools.converters.keras.convert(keras_model) except (AttributeError, ImportError) as e: warnings.warn( "Unable to test due to an error in coremltools '{0}'".format( e)) return onnx_model = onnxmltools.convert_coreml(coreml_model) x = [x, 2 * x] y_reference = keras_model.predict(x) y_produced = evaluate_deep_model(onnx_model, x).reshape(N, D)
def test_sequential_model_with_multiple_operators(self): N, C, H, W = 2, 3, 5, 5 x = create_tensor(N, C, H, W) model = Sequential() model.add( Conv2D(2, kernel_size=(1, 2), strides=(1, 1), padding='valid', input_shape=(H, W, C), data_format='channels_last')) model.add(Activation('relu')) model.add( Conv2D(2, kernel_size=(1, 2), strides=(1, 1), padding='valid', input_shape=(H, W, C), data_format='channels_last')) model.add(Activation('relu')) model.add( MaxPooling2D((2, 2), strides=(2, 2), data_format='channels_last')) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(model, x)
def test_recursive_and_shared_model(self): N, C, D = 2, 3, 3 x = create_tensor(N, C) sub_input1 = Input(shape=(C, )) sub_mapped1 = Dense(D)(sub_input1) sub_output1 = Activation('sigmoid')(sub_mapped1) sub_model1 = Model(inputs=sub_input1, outputs=sub_output1) sub_input2 = Input(shape=(C, )) sub_mapped2 = sub_model1(sub_input2) sub_output2 = Activation('tanh')(sub_mapped2) sub_model2 = Model(inputs=sub_input2, outputs=sub_output2) input1 = Input(shape=(D, )) input2 = Input(shape=(D, )) mapped1_1 = Activation('tanh')(input1) mapped2_1 = Activation('sigmoid')(input2) mapped1_2 = sub_model1(mapped1_1) mapped1_3 = sub_model1(mapped1_2) mapped2_2 = sub_model2(mapped2_1) sub_sum = Add()([mapped1_3, mapped2_2]) model = Model(inputs=[input1, input2], outputs=sub_sum) # coremltools can't convert this kind of model. self._test_one_to_one_operator_keras(model, [x, 2 * x])
def test_merge_2d(self): # Skip Concatenate for now because CoreML Concatenate needs 4-D input layers_to_be_tested = [Add, Maximum, Multiply, Average, Dot] N, C = 2, 3 x1 = create_tensor(N, C) x2 = create_tensor(N, C) for layer in layers_to_be_tested: input1 = Input(shape=(C, )) input2 = Input(shape=(C, )) if layer == Dot: result = layer(axes=-1)([input1, input2]) else: result = layer()([input1, input2]) model = Model(inputs=[input1, input2], outputs=result) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core(model, [x1, x2])
def test_reshape(self): N, C, H, W = 2, 3, 1, 2 x = create_tensor(N, C, H, W) keras_model = Sequential() keras_model.add(Reshape((1, C * H * W, 1), input_shape=(H, W, C))) keras_model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(keras_model, x)
def test_convolution_transpose_2d(self): N, C, H, W = 2, 2, 1, 1 x = create_tensor(N, C, H, W) input = Input(shape=(H, W, C)) result = Conv2DTranspose(2, (2, 1), data_format='channels_last')(input) model = Model(inputs=input, outputs=result) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(model, x)
def test_upsample(self): N, C, H, W = 2, 3, 1, 2 x = create_tensor(N, C, H, W) input = Input(shape=(H, W, C)) result = UpSampling2D(input) model = Model(inputs=input, outputs=result) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(model, x)
def test_pooling_4d(self): layers_to_be_tested = [MaxPooling2D, AveragePooling2D] N, C, H, W = 1, 2, 4, 3 x = create_tensor(N, C, H, W) for layer in layers_to_be_tested: input = Input(shape=(H, W, C)) result = layer(2, data_format='channels_last')(input) model = Model(inputs=input, outputs=result) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(model, x)
def test_dense_with_dropout(self): N, C, D = 2, 3, 2 x = create_tensor(N, C) input = Input(shape=(C, )) hidden = Dense(D, activation='relu')(input) result = Dropout(0.2)(hidden) keras_model = Model(inputs=input, outputs=result) keras_model.compile(optimizer='sgd', loss='mse') self._test_one_to_one_operator_core_keras(keras_model, x)
def test_batch_normalization(self): N, C, H, W = 2, 2, 3, 4 x = create_tensor(N, C, H, W) model = Sequential() input = Input(shape=(H, W, C)) result = BatchNormalization( beta_initializer='random_uniform', gamma_initializer='random_uniform', moving_mean_initializer='random_uniform', moving_variance_initializer=RandomUniform(minval=0.1, maxval=0.5), )(input) model = Model(inputs=input, outputs=result) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(model, x)
def test_conv_4d(self): N, C, H, W = 1, 2, 4, 3 x = create_tensor(N, C, H, W) input = Input(shape=(H, W, C)) result = Conv2D(2, kernel_size=(1, 2), strides=(1, 1), padding='valid', input_shape=(H, W, C), data_format='channels_last')(input) model = Model(inputs=input, outputs=result) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core_channels_last(model, x)
def test_activation_2d(self): activation_to_be_tested = [ 'tanh', 'relu', 'sigmoid', 'softsign', 'elu', 'softplus', LeakyReLU ] N, C = 2, 3 x = create_tensor(N, C) for activation in activation_to_be_tested: input = Input(shape=(C, )) if isinstance(activation, str): result = Activation(activation)(input) else: result = activation()(input) model = Model(inputs=input, outputs=result) model.compile(optimizer='adagrad', loss='mse') self._test_one_to_one_operator_core(model, x)
def test_flatten(self): N, C, H, W, D = 2, 3, 1, 2, 2 x = create_tensor(N, C, H, W) keras_model = Sequential() keras_model.add(Flatten(input_shape=(H, W, C))) keras_model.add(Dense(D)) keras_model.compile(optimizer='adagrad', loss='mse') try: coreml_model = coremltools.converters.keras.convert(keras_model) except ImportError: warnings.warn("Issue in coremltools.") return onnx_model = onnxmltools.convert_coreml(coreml_model) y_reference = keras_model.predict(np.transpose(x, [0, 2, 3, 1])) y_produced = evaluate_deep_model(onnx_model, x).reshape(N, D) self.assertTrue(np.allclose(y_reference, y_produced))
def test_dense(self): N, C, D = 2, 3, 2 x = create_tensor(N, C) input = Input(shape=(C, )) result = Dense(D)(input) keras_model = Model(inputs=input, outputs=result) keras_model.compile(optimizer='adagrad', loss='mse') try: coreml_model = coremltools.converters.keras.convert(keras_model) except (AttributeError, ImportError) as e: warnings.warn( "Unable to test due to an error in coremltools '{0}'.".format( e)) return onnx_model = onnxmltools.convert_coreml(coreml_model) y_reference = keras_model.predict(x) y_produced = evaluate_deep_model(onnx_model, x).reshape(N, D) self.assertTrue(np.allclose(y_reference, y_produced))