Keras, изменяющие форму ввода для функционального API - Попытка преобразовать значение (Нет) с неподдерживаемым типом ( ) Тензор - PullRequest
0 голосов
/ 05 февраля 2020

Я обучил свою функциональную модель в кератах с изображениями размером 120x120, и теперь я хотел бы использовать эту предсказанную модель для другой формы входного изображения. Обычный ответ - использовать None во входной форме, однако в моем случае это выдает: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor Моя тренировочная модель:

input_i = Input(shape = (120, 120, 1)) 
model = Model(input_i, all_together(input_i))

После обучения я пытаюсь построить новую модель и загрузить веса от обученного:

input_img = Input(shape = (None, None, 1)) 
model = Model(input_img, all_together(input_img))  <--- error
....
loading weights and so on

У вас есть рекомендации, как избежать этого поведения?

Numpy: 1.16.4

Керас: 2.3.1

Тензор потока: 2.0.0

1 Ответ

0 голосов
/ 05 февраля 2020

В вашей модели есть что-то, что не поддерживает переменное измерение. Например, слой

A Flatten. Вам нужно использовать только те вещи, которые поддерживают переменные размеры. A GlobalMaxPooling2D или GlobalAveragePooling2D могут быть заменами для выравнивания.


Вы можете создать свой собственный Prelu:

class MyPrelu(Layer):
    def __init__(self, **kwargs):
        super(MyPrelu, self).__init__(**kwargs)
        self.alpha_initializer = initializers.get('zeros')
        self.alpha_regularizer = regularizers.get(None)
        self.alpha_constraint = constraints.get(None)

    def build(self, input_shape):
        param_shape = tuple(1 for i in range(len(input_shape)-1)) + input_shape[-1:]
        self.alpha = self.add_weight(shape=param_shape,
                                     name='alpha',
                                     initializer=self.alpha_initializer,
                                     regularizer=self.alpha_regularizer,
                                     constraint=self.alpha_constraint)
        self.built = True

    def call(self, inputs, mask=None):
        pos = K.relu(inputs)
        neg = -self.alpha * K.relu(-inputs)
        return pos + neg

    def compute_output_shape(self, input_shape):
        return input_shape

    #if you want to have those initializers and other parameters, check the source code and add this:
    def get_config(.....):
        ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...