#!/usr/bin/env python # -*- coding: utf-8 -*- import os import unittest os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' import numpy as np import tensorflow as tf import tensorlayer as tl from tensorlayer.layers import * from tensorlayer.models import * from tests.utils import CustomTestCase def basic_static_model(): ni = Input((None, 24, 24, 3)) nn = Conv2d(16, (5, 5), (1, 1), padding='SAME', act=tf.nn.relu, name="conv1")(ni) nn = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool1')(nn) nn = Conv2d(16, (5, 5), (1, 1), padding='SAME', act=tf.nn.relu, name="conv2")(nn) nn = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool2')(nn) nn = Flatten(name='flatten')(nn) nn = Dense(100, act=None, name="dense1")(nn) nn = Dense(10, act=None, name="dense2")(nn) M = Model(inputs=ni, outputs=nn) return M class basic_dynamic_model(Model): def __init__(self): super(basic_dynamic_model, self).__init__() self.conv1 = Conv2d(16, (5, 5), (1, 1), padding='SAME', act=tf.nn.relu, in_channels=3, name="conv1") self.pool1 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool1') self.conv2 = Conv2d(16, (5, 5), (1, 1), padding='SAME', act=tf.nn.relu, in_channels=16, name="conv2") self.pool2 = MaxPool2d((3, 3), (2, 2), padding='SAME', name='pool2') self.flatten = Flatten(name='flatten') self.dense1 = Dense(100, act=None, in_channels=576, name="dense1") self.dense2 = Dense(10, act=None, in_channels=100, name="dense2") def forward(self, x): x = self.conv1(x) x = self.pool1(x) x = self.conv2(x) x = self.pool2(x) x = self.flatten(x) x = self.dense1(x) x = self.dense2(x) return x class Model_Core_Test(CustomTestCase): @classmethod def setUpClass(cls): pass @classmethod def tearDownClass(cls): pass def test_dynamic_basic(self): print('-' * 20, 'test_dynamic_basic', '-' * 20) model_basic = basic_dynamic_model() # test empty model before calling self.assertEqual(model_basic.is_train, None) self.assertEqual(model_basic._all_weights, None) self.assertEqual(model_basic._inputs, None) self.assertEqual(model_basic._outputs, None) self.assertEqual(model_basic._model_layer, None) self.assertEqual(model_basic._all_layers, None) self.assertEqual(model_basic._nodes_fixed, False) # test layer and weights access all_layers = model_basic.all_layers self.assertEqual(len(model_basic.all_layers), 7) self.assertEqual(model_basic._all_weights, None) self.assertIsNotNone(model_basic.all_weights) print([w.name for w in model_basic.all_weights]) # test model mode model_basic.train() self.assertEqual(model_basic.is_train, True) model_basic.eval() self.assertEqual(model_basic.is_train, False) model_basic.test() self.assertEqual(model_basic.is_train, False) model_basic.infer() self.assertEqual(model_basic.is_train, False) # test as_layer try: model_basic.as_layer() except Exception as e: print(e) self.assertIsNone(model_basic._model_layer) # test print try: print(model_basic) except Exception as e: print(e) # test forwarding inputs = np.random.normal(size=[2, 24, 24, 3]).astype(np.float32) outputs1 = model_basic(inputs) self.assertEqual(model_basic._nodes_fixed, True) self.assertEqual(model_basic.is_train, False) try: outputs2 = model_basic(inputs, is_train=True) except Exception as e: print(e) outputs2 = model_basic(inputs, is_train=False) self.assertEqual(model_basic.is_train, False) self.assertLess(np.max(np.abs(outputs1.numpy() - outputs2.numpy())), 1e-7) # test layer node self.assertEqual(len(model_basic.all_layers[-1]._nodes), 0) self.assertEqual(model_basic.all_layers[-2]._nodes_fixed, True) # test release_memory try: model_basic.release_memory() except Exception as e: print(e) def test_static_basic(self): print('-' * 20, 'test_static_basic', '-' * 20) model_basic = basic_static_model() # test empty model before calling self.assertEqual(model_basic.is_train, None) self.assertEqual(model_basic._all_weights, None) self.assertIsNotNone(model_basic._inputs) self.assertIsNotNone(model_basic._outputs) self.assertEqual(model_basic._model_layer, None) self.assertIsNotNone(model_basic._all_layers) self.assertIsNotNone(model_basic._nodes_fixed) # test layer and weights access all_layers = model_basic.all_layers self.assertEqual(len(model_basic.all_layers), 8) self.assertEqual(model_basic._all_weights, None) self.assertIsNotNone(model_basic.all_weights) print([w.name for w in model_basic.all_weights]) # test model mode model_basic.train() self.assertEqual(model_basic.is_train, True) model_basic.eval() self.assertEqual(model_basic.is_train, False) model_basic.test() self.assertEqual(model_basic.is_train, False) model_basic.infer() self.assertEqual(model_basic.is_train, False) # test as_layer self.assertIsInstance(model_basic.as_layer(), tl.layers.Layer) self.assertIsNotNone(model_basic._model_layer) # test print try: print(model_basic) except Exception as e: print(e) # test forwarding inputs = np.random.normal(size=[2, 24, 24, 3]).astype(np.float32) outputs1 = model_basic(inputs) self.assertEqual(model_basic._nodes_fixed, True) self.assertEqual(model_basic.is_train, False) try: outputs2 = model_basic(inputs, is_train=True) except Exception as e: print(e) outputs2 = model_basic(inputs, is_train=False) self.assertEqual(model_basic.is_train, False) self.assertLess(np.max(np.abs(outputs1.numpy() - outputs2.numpy())), 1e-7) # test layer node self.assertEqual(len(model_basic.all_layers[-1]._nodes), 1) self.assertEqual(model_basic.all_layers[-2]._nodes_fixed, True) # test release_memory try: model_basic.release_memory() except Exception as e: print(e) def test_deprecated_function(self): print('-' * 20, 'test_deprecated_function', '-' * 20) model = basic_dynamic_model() try: model.print_all_layers() except Exception as e: print(e) try: model.count_params() except Exception as e: print(e) try: model.print_params() except Exception as e: print(e) try: model.all_params() except Exception as e: print(e) try: model.all_drop() except Exception as e: print(e) def test_exceptions(self): print('-' * 20, 'test exceptions', '-' * 20) np_arr = np.random.normal(size=[4, 784]).astype(np.float32) tf_tensor = tf.random.normal(shape=[4, 784]) ni = Input(shape=[4, 784]) try: model = Model(inputs=[], outputs=[]) except Exception as e: self.assertIsInstance(e, ValueError) print(e) try: model = Model(inputs=np_arr, outputs=np_arr + 1) except Exception as e: self.assertIsInstance(e, TypeError) print(e) try: model = Model(inputs=[np_arr], outputs=[np_arr + 1]) except Exception as e: self.assertIsInstance(e, TypeError) print(e) try: model = Model(inputs=[tf_tensor], outputs=[tf_tensor + 1]) except Exception as e: self.assertIsInstance(e, TypeError) print(e) try: model = Model(inputs=tf_tensor, outputs=[tf_tensor + 1]) except Exception as e: self.assertIsInstance(e, TypeError) print(e) try: model = Model(inputs=ni, outputs=[tf_tensor + 1]) except Exception as e: self.assertIsInstance(e, TypeError) print(e) try: class ill_model(Model): def __init__(self): super(ill_model, self).__init__() self.dense2 = Dense(10, act=None) def forward(self, x): x = self.dense2(x) return x model = ill_model() weights = model.all_weights except Exception as e: self.assertIsInstance(e, AttributeError) print(e) try: ni = Input([4, 784]) nn = Dense(10)(ni) model = Model(inputs=ni, outputs=nn) outputs = model(np_arr) except Exception as e: self.assertIsInstance(e, ValueError) print(e) try: ni = Input([4, 784]) model = Model(inputs=ni, outputs=ni) model.save_weights('./empty_model.h5') except Exception as e: print(e) try: ni = Input([4, 784]) nn = Dense(10)(ni) model = Model(inputs=ni, outputs=nn) model._outputs = None outputs = model(np_arr, is_train=True) except Exception as e: self.assertIsInstance(e, ValueError) print(e) def test_list_inputs_outputs(self): print('-' * 20, 'test_list_inputs_outputs', '-' * 20) ni_1 = Input(shape=[4, 16]) ni_2 = Input(shape=[4, 32]) a_1 = Dense(80)(ni_1) b_1 = Dense(160)(ni_2) concat = Concat()([a_1, b_1]) a_2 = Dense(10)(concat) b_2 = Dense(20)(concat) model = Model(inputs=[ni_1, ni_2], outputs=[a_2, b_2]) model.train() np_arr1 = np.random.normal(size=[4, 16]).astype(np.float32) np_arr2 = np.random.normal(size=[4, 32]).astype(np.float32) try: outputs = model(np_arr1) except Exception as e: self.assertIsInstance(e, ValueError) print(e) try: outputs = model([np_arr1]) except Exception as e: self.assertIsInstance(e, ValueError) print(e) out_a, out_b = model([np_arr1, np_arr2]) self.assertEqual(out_a.shape, [4, 10]) self.assertEqual(out_b.shape, [4, 20]) def test_special_case(self): print('-' * 20, 'test_special_case', '-' * 20) class my_model(Model): def __init__(self): super(my_model, self).__init__() self.dense = Dense(64, in_channels=3) self.vgg = tl.models.vgg16() def forward(self, x): return x model = my_model() weights = model.all_weights self.assertGreater(len(weights), 2) print(len(weights)) def test_get_layer(self): print('-' * 20, 'test_get_layer', '-' * 20) model_basic = basic_dynamic_model() self.assertIsInstance(model_basic.get_layer('conv2'), tl.layers.Conv2d) try: model_basic.get_layer('abc') except Exception as e: print(e) try: model_basic.get_layer(index=99) except Exception as e: print(e) model_basic = basic_static_model() self.assertIsInstance(model_basic.get_layer('conv2'), tl.layers.Conv2d) self.assertIsInstance(model_basic.get_layer(index=2), tl.layers.MaxPool2d) print([w.name for w in model_basic.get_layer(index=-1).all_weights]) try: model_basic.get_layer('abc') except Exception as e: print(e) try: model_basic.get_layer(index=99) except Exception as e: print(e) def test_model_weights_copy(self): print('-' * 20, 'test_model_weights_copy', '-' * 20) model_basic = basic_static_model() model_weights = model_basic.trainable_weights ori_len = len(model_weights) model_weights.append(np.arange(5)) new_len = len(model_weights) self.assertEqual(new_len - 1, ori_len) def test_inchannels_exception(self): print('-' * 20, 'test_inchannels_exception', '-' * 20) class my_model(Model): def __init__(self): super(my_model, self).__init__() self.dense = Dense(64) self.vgg = tl.models.vgg16() def forward(self, x): return x try: M = my_model() except Exception as e: self.assertIsInstance(e, AttributeError) print(e) if __name__ == '__main__': unittest.main()