Keras / Tf Custom Loss Функция на уровне тензорных записей - PullRequest
0 голосов
/ 27 февраля 2020

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

class AE():
    def __init__(self,inputSize=78,numNeurons = 50, latentSize=5,expSize = 10,batchSize = 1, activation="relu"):
        K.clear_session()

        self.inputSize = inputSize
        self.latentSize = latentSize
        self.activation = activation
        self.numNeurons = numNeurons
        self.expSize = expSize
        self.batchSize = batchSize

        self.encoder = self.createEncoder()
        self.decoder = self.createDecoder()
        self.filterModel = self.createFilterModel()
        self.AE = self.createAE()

    def sample_loss(self,y_pred ):

        loss = 0.0

        for j in tf.range(0,self.inputSize ,2):

            pt = y_pred[j:j+2]
            loss += K.sum(self.filterModel.predict(pt))

        return loss

    def createEncoder(self):
        # create the encoder
        xIn = Input(shape=(self.inputSize,), name="data_in")
        y_train = Input(shape=(self.latentSize,), name='y_train')

        x = Dense(self.numNeurons,activation=self.activation)(xIn)
        xlatent = Dense(self.latentSize,activation=self.activation)(x)

        # create the encoder
        encoder = Model(xIn,xlatent)
        return encoder

    def createDecoder(self):
        # create the decoder
        latentIn = Input(shape=(self.latentSize,))
        x = Dense(self.numNeurons,activation=self.activation)(latentIn)
        out = Dense(self.inputSize,activation="linear")(x)

        # create a decoder
        decoder = Model(latentIn,out)

        return decoder

    def createAE(self):
        xIn = Input(shape=(self.inputSize,), name="ae_data_in")

        # create the total model
        latentOutput = self.encoder(xIn)
        dataOutput = self.decoder(latentOutput)

        model = Model(inputs=xIn,outputs=dataOutput)
        model.add_loss( self.sample_loss( dataOutput) )

        model.summary()

        return model

    def createFilterModel(self):
        xIn = Input(shape=(2,), name="filter_data_in")

        x = Dense(4, activation='sigmoid')(xIn)
        x = Dense(1, activation='sigmoid')(x)

        model = Model(xIn,x)
        model.compile(optimizer='adam', loss='binary_crossentropy')

        return model


modelAE = AE()
modelAE.AE.compile(optimizer='adam',loss="mse", metrics=['accuracy'])

Итак, у меня есть словарь моделей, filterModels. Это на самом деле прогностические модели в Керасе. Для каждой модели в этом словаре я хочу передать ей соответствующую часть y_pred и затем добавить ее вывод к потере.

Как я могу это сделать?

Вот ошибка текущего код дает мне: '' 'ValueError: при подаче тензоров symboli c в модель мы ожидаем, что тензоры будут иметь размер пакета stati c. Получил тензор с формой: (Нет, 78) '' '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...