Skip to content

Commit

Permalink
Use legacy Keras 2.0 for test data generation (ARM-software#120)
Browse files Browse the repository at this point in the history
Keras 3.0 is used by default since Tensorflow 2.16.1, and since this
contains some breaking changes the scripts need to stay at 2.0
  • Loading branch information
AdrianLundell authored Mar 20, 2024
1 parent f0957f8 commit 2e5dcdc
Show file tree
Hide file tree
Showing 9 changed files with 42 additions and 37 deletions.
2 changes: 1 addition & 1 deletion Tests/UnitTest/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Python packages mbed-cli and and mbed-ls are command line tools so it should not
For generating new test data, the following packages are needed.

```
pip install numpy packaging tensorflow
pip install numpy packaging tensorflow tf-keras~=2.16
```


Expand Down
15 changes: 8 additions & 7 deletions Tests/UnitTest/add_mul_settings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates <[email protected]>
# SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates <[email protected]>
#
# SPDX-License-Identifier: Apache-2.0
#
Expand All @@ -18,6 +18,7 @@

import tensorflow as tf
import numpy as np
import tf_keras as keras


class AddMulSettings(TestSettings):
Expand Down Expand Up @@ -90,16 +91,16 @@ def generate_data(self, input_data1=None, input_data2=None) -> None:
inttype_tf = tf.int8

# Create a one-layer functional Keras model as add/mul cannot use a sequntial Keras model.
input1 = tf.keras.layers.Input(shape=input_shape[1:])
input2 = tf.keras.layers.Input(shape=input_shape[1:])
input1 = keras.layers.Input(shape=input_shape[1:])
input2 = keras.layers.Input(shape=input_shape[1:])
if self.test_type == 'add':
layer = tf.keras.layers.Add()([input1, input2])
layer = keras.layers.Add()([input1, input2])
elif self.test_type == 'mul':
layer = tf.keras.layers.Multiply()([input1, input2])
layer = keras.layers.Multiply()([input1, input2])
else:
raise RuntimeError("Wrong test type")
out = tf.keras.layers.Lambda(function=lambda x: x)(layer)
model = tf.keras.models.Model(inputs=[input1, input2], outputs=out)
out = keras.layers.Lambda(function=lambda x: x)(layer)
model = keras.models.Model(inputs=[input1, input2], outputs=out)

interpreter = self.convert_and_interpret(model, inttype_tf)

Expand Down
15 changes: 9 additions & 6 deletions Tests/UnitTest/conv_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import tensorflow as tf
import numpy as np
import math

import tf_keras as keras

class ConvSettings(TestSettings):

Expand Down Expand Up @@ -317,11 +317,11 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
regenerate=self.regenerate_new_weights)

# Create a one layer Keras model.
model = tf.keras.models.Sequential()
model = keras.models.Sequential()
input_shape = (self.batches, self.y_input, self.x_input, self.input_ch)
model.add(tf.keras.layers.InputLayer(input_shape=input_shape[1:], batch_size=self.batches))
model.add(keras.layers.InputLayer(input_shape=input_shape[1:], batch_size=self.batches))
if self.test_type == 'conv':
conv_layer = tf.keras.layers.Conv2D(self.output_ch,
conv_layer = keras.layers.Conv2D(self.output_ch,
kernel_size=(self.filter_y, self.filter_x),
strides=(self.stride_y, self.stride_x),
padding=self.padding,
Expand All @@ -331,7 +331,7 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
model.add(conv_layer)
conv_layer.set_weights([weights, biases])
elif self.test_type == 'depthwise_conv':
depthwise_layer = tf.keras.layers.DepthwiseConv2D(kernel_size=(self.filter_y, self.filter_x),
depthwise_layer = keras.layers.DepthwiseConv2D(kernel_size=(self.filter_y, self.filter_x),
strides=(self.stride_y, self.stride_x),
padding=self.padding,
depth_multiplier=self.channel_multiplier,
Expand All @@ -340,7 +340,7 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
model.add(depthwise_layer)
depthwise_layer.set_weights([weights, biases])
elif self.test_type == 'transpose_conv':
transposed_conv_layer = tf.keras.layers.Conv2DTranspose(self.output_ch,
transposed_conv_layer = keras.layers.Conv2DTranspose(self.output_ch,
kernel_size=(self.filter_y, self.filter_x),
strides=(self.stride_y, self.stride_x),
padding=self.padding,
Expand All @@ -357,6 +357,9 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
if self.test_type == 'transpose_conv' and self.generate_bias:
filter_index = 3
bias_index = 2
elif self.is_int16xint8 and self.generate_bias:
filter_index = 1
bias_index = 2
else:
filter_index = 2
bias_index = 1
Expand Down
8 changes: 4 additions & 4 deletions Tests/UnitTest/fully_connected_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import tensorflow as tf
import numpy as np

import tf_keras as keras

class FullyConnectedSettings(TestSettings):

Expand Down Expand Up @@ -226,11 +226,11 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
weights_size = weights.numpy().size

# Generate model in tensorflow with one fully_connected layer
model = tf.keras.models.Sequential()
model = keras.models.Sequential()
model.add(
tf.keras.layers.InputLayer(input_shape=(self.y_input * self.x_input * self.input_ch, ),
keras.layers.InputLayer(input_shape=(self.y_input * self.x_input * self.input_ch, ),
batch_size=self.batches))
fully_connected_layer = tf.keras.layers.Dense(self.output_ch, activation=None, use_bias=self.generate_bias)
fully_connected_layer = keras.layers.Dense(self.output_ch, activation=None, use_bias=self.generate_bias)
model.add(fully_connected_layer)
if self.generate_bias:
fully_connected_layer.set_weights([weights, biases])
Expand Down
1 change: 1 addition & 0 deletions Tests/UnitTest/generate_test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
# limitations under the License.
#
import os
os.environ["TF_USE_LEGACY_KERAS"]="1"
import sys
import argparse

Expand Down
10 changes: 5 additions & 5 deletions Tests/UnitTest/lstm_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

import tensorflow as tf
import numpy as np

import tf_keras as keras

class LSTMSettings(TestSettings):

Expand Down Expand Up @@ -142,19 +142,19 @@ def generate_data(self, input_data=None, weights=None, hidden_weights=None, bias
maxrange=1.0)

# Create a Keras based LSTM model.
input_layer = tf.keras.layers.Input(shape=(self.time_steps, self.number_inputs),
input_layer = keras.layers.Input(shape=(self.time_steps, self.number_inputs),
batch_size=self.batches,
name='input')
if self.time_major:
input_layer_transposed = tf.transpose(input_layer, perm=[1, 0, 2])
lstm_layer = tf.keras.layers.LSTM(units=self.number_units,
lstm_layer = keras.layers.LSTM(units=self.number_units,
time_major=self.time_major,
return_sequences=True)(input_layer_transposed)
else:
lstm_layer = tf.keras.layers.LSTM(units=self.number_units,
lstm_layer = keras.layers.LSTM(units=self.number_units,
time_major=self.time_major,
return_sequences=True)(input_layer)
model = tf.keras.Model(input_layer, lstm_layer, name="LSTM")
model = keras.Model(input_layer, lstm_layer, name="LSTM")

if self.time_major:
time_major_offset = 1
Expand Down
12 changes: 6 additions & 6 deletions Tests/UnitTest/pooling_settings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates <[email protected]>
# SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates <[email protected]>
#
# SPDX-License-Identifier: Apache-2.0
#
Expand All @@ -18,7 +18,7 @@

import numpy as np
import tensorflow as tf

import tf_keras as keras

class PoolingSettings(TestSettings):

Expand Down Expand Up @@ -85,18 +85,18 @@ def generate_data(self, input_data=None) -> None:
input_data = tf.cast(input_data, tf.float32)

# Create a one-layer Keras model
model = tf.keras.models.Sequential()
model = keras.models.Sequential()
input_shape = (self.batches, self.y_input, self.x_input, self.input_ch)
model.add(tf.keras.layers.InputLayer(input_shape=input_shape[1:], batch_size=self.batches))
model.add(keras.layers.InputLayer(input_shape=input_shape[1:], batch_size=self.batches))
if self.test_type == 'avgpool':
model.add(
tf.keras.layers.AveragePooling2D(pool_size=(self.filter_y, self.filter_x),
keras.layers.AveragePooling2D(pool_size=(self.filter_y, self.filter_x),
strides=(self.stride_y, self.stride_x),
padding=self.padding,
input_shape=input_shape[1:]))
elif self.test_type == 'maxpool':
model.add(
tf.keras.layers.MaxPooling2D(pool_size=(self.filter_y, self.filter_x),
keras.layers.MaxPooling2D(pool_size=(self.filter_y, self.filter_x),
strides=(self.stride_y, self.stride_x),
padding=self.padding,
input_shape=input_shape[1:]))
Expand Down
8 changes: 4 additions & 4 deletions Tests/UnitTest/softmax_settings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates <[email protected]>
# SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates <[email protected]>
#
# SPDX-License-Identifier: Apache-2.0
#
Expand All @@ -17,7 +17,7 @@
import math
from test_settings import TestSettings
import tensorflow as tf

import tf_keras as keras

class SoftmaxSettings(TestSettings):
softmax_input_integer_bits = 5
Expand Down Expand Up @@ -147,9 +147,9 @@ def generate_data(self, input_data=None, weights=None, biases=None) -> None:
output_data = interpreter.get_tensor(output_layer["index"])
else:
# Create a one-layer Keras model.
model = tf.keras.models.Sequential()
model = keras.models.Sequential()
input_shape = (self.y_input, self.x_input)
model.add(tf.keras.layers.Softmax(input_shape=input_shape))
model.add(keras.layers.Softmax(input_shape=input_shape))

interpreter = self.convert_and_interpret(model, inttype, tf.expand_dims(input_data, axis=0))
output_details = interpreter.get_output_details()
Expand Down
8 changes: 4 additions & 4 deletions Tests/UnitTest/test_settings.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: Copyright 2010-2023 Arm Limited and/or its affiliates <[email protected]>
# SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates <[email protected]>
#
# SPDX-License-Identifier: Apache-2.0
#
Expand Down Expand Up @@ -26,7 +26,7 @@

import numpy as np
import tensorflow as tf

import tf_keras as keras

class TestSettings(ABC):

Expand Down Expand Up @@ -453,8 +453,8 @@ def convert_and_interpret(self, model, inttype, input_data=None, dataset_shape=N
return self.interpret_model(input_data, inttype)

def convert_model(self, model, inttype, dataset_shape=None):
model.compile(loss=tf.keras.losses.categorical_crossentropy,
optimizer=tf.keras.optimizers.Adam(),
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adam(),
metrics=['accuracy'])
n_inputs = len(model.inputs)

Expand Down

0 comments on commit 2e5dcdc

Please sign in to comment.