Ошибка атрибута: объект ‘CustomAugment’ не имеет атрибута ‘__имя__’ при сохранении модели TensorFlow

#python #tensorflow #keras

Вопрос:

Я играл с увеличением данных для классификации изображений TensorFlow. Я использовал учебник, чтобы создать пользовательский класс увеличения, код ниже, а затем загрузил его в модель с помощью Keras Lamda. Обучение работает нормально, однако, когда я пытаюсь сохранить модель сразу после обучения, она выходит из строя с ошибкой, указанной в названии.

Я очень новичок в python, но, насколько я понимаю, класс должен иметь скрытое __ имя __ variabile. Что это дает?

Пользовательский класс дополнения

 class CustomAugment(object):
    def __call__(self, image):        
        # Random flips and grayscale with some stochasticity
        img = self._random_apply(tf.image.flip_left_right, image, p=0.6)
        img = self._random_apply(self._color_drop, img, p=0.9)
        return img

    def _color_drop(self, x):
        image = tf.image.rgb_to_grayscale(x)
        image = tf.tile(x, [1, 1, 1, 3])
        return x
    
    def _random_apply(self, func, x, p):
        return tf.cond(
          tf.less(tf.random.uniform([], minval=0, maxval=1, dtype=tf.float32),
                  tf.cast(p, tf.float32)),
          lambda: func(x),
          lambda: x)


data_augmentation = keras.Sequential(
  [
    tf.keras.layers.Lambda(CustomAugment()),
    layers.experimental.preprocessing.RandomRotation(0.1),
  ]
)
 

Использование его в модели

 model = Sequential([
  tf.keras.Input(shape=(160, 160, 3)),
  data_augmentation,
  layers.Conv2D(16, 3, padding='same', activation='relu', input_shape=(160, 160, 3)),
  layers.Conv2D(16, 3, padding='same', activation='relu'),
#rest of model here
 

Разбивается здесь

 model.save('el_patho_maximo')
 

Ответ №1:

Это проблема с отступами. В _random_apply , все строки, кроме первой, имеют неправильный отступ. Либо поместите его в одну строку, либо оставьте автоматически оставленное место.

Комментарии:

1. Спасибо за ответ., Исправлен отступ, но по-прежнему появляется ошибка.

Ответ №2:

Найдено решение проблемы

Мне пришлось просто добавить __ name __ (без пробелов) = CustomAugment в классе CustomAugment прямо перед __ init __

Комментарии:

1. Я не понимаю вашего решения. Не могли бы вы, пожалуйста, опубликовать, как вы это решили?

2. @JKnecht В классе CustomAugment из вопроса мне просто нужно было добавить еще одну строку, в которой говорилось _name_='CustomAugment' : я добавил строку сразу после class CustomAugment(object):