Одна метка для всего входного значения. ValueError: Пожалуйста, укажите в качестве цели модели либо один массив, либо список массивов. - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь построить архитектуру CNN на Tensorflow 2.0, которая принимает несколько файлов временных сигналов, извлекает некоторые функции, добавляет все функции и выводит одно значение (предполагаемый оставшийся срок полезного использования).

Одним из примеров формы ввода для классификационной головки является (14976, 128, 5, 5), которая сразу становится (1, 128, 5, 5) с помощью пользовательской функции добавления и будет иметь форму ( 1,1) в самом конце. В этом случае метка будет 3610 (это напрямую связано с размером партии).

Я могу заставить его "работать", используя RUL = np.full(preproc_imgs.shape[0], RUL), но я чувствую, что он не выводит то, что предполагалось ...

Мой вопрос: есть ли способ что я могу передать одно значение в качестве метки для модели для обучения?

Это моя модель (глава классификации):

class MyAddLayer(keras.layers.Layer):

    def call(self, inputs):
        '''
            elems = np.array([1, 2, 3, 4, 5, 6])
            sum = scan(lambda a, x: a + x, elems)
            # sum == [1, 3, 6, 10, 15, 21]
        '''
        print('inputs[-1]', inputs[-1])
        sum = tf.scan(lambda a, x: a + x, inputs)
        print('sum', sum[-1])
        return tf.expand_dims(sum[-1], 0)


class EstimatedRUL(tf.keras.Model):

    def __init__(self, name='EstimatedRUL'):
        super(EstimatedRUL, self).__init__(name=name)

        self.add = MyAddLayer()

        self.conv_5 = keras.layers.Conv2D(5, (3, 3), padding='same', kernel_initializer='glorot_normal',
                                          bias_initializer='glorot_normal')

        ####### Estimated RUL #######
        self.flat = keras.layers.Flatten()

        self.dense = keras.layers.Dense(128, kernel_initializer='glorot_normal', bias_initializer='glorot_normal')
        self.leaky = keras.layers.LeakyReLU()

        self.rul = keras.layers.Dense(1, activation='sigmoid', kernel_initializer='glorot_normal',
                                      bias_initializer='glorot_normal')
        ####### Estimated RUL #######

    def call(self, inputs):
        print('shape of the input: ', inputs.shape)
        a = self.add(inputs)
        print('shape of added input: ', a.shape)
        c5 = self.conv_5(a)
        flat = self.flat(c5)
        dense = self.dense(flat)
        leaky = self.leaky(dense)
        rul = self.rul(leaky)
        print('about to return the rul with shape: ', rul.shape)
        return rul

Это тело:

inputs = keras.Input(shape=(160, 160, 3))
base_model = keras.applications.mobilenet.MobileNet(input_shape=(160, 160, 3), include_top=False,
                                                                     weights='imagenet', classes=2)(inputs)
base_model.trainable = False

После построения моделей

model_1 = keras.Model(inputs=inputs, outputs=base_model, name='first')
model_1.compile(optimizer=adam, loss=los, metrics=['mean_absolute_percentage_error', RMSE])
print(model_1.summary())

model_2 = EstimatedRUL.EstimatedRUL()
model_2.compile(optimizer=adam, loss=los, metrics=['mean_absolute_percentage_error', RMSE])

С этими параметрами

los = 'mean_absolute_error'

lr = 0.0001

####### Custom metrics #######
def RMSE(y_true, y_pred):
    return tf.sqrt(tf.reduce_mean(tf.square(tf.subtract(y_true, y_pred))))

####### Custom optimizer #######
adam = keras.optimizers.Adam(learning_rate=lr)

Промежуточные результаты получены через preproc_imgs = model_1.predict(train_images) и поданы в модель_2 для получения оценочных значений. оставшийся срок полезного использования

Полное сообщение об ошибке (в данном случае): ValueError: Please provide as model targets either a single array or a list of arrays. You passed y=3610

...