Пользовательская функция потерь, включая вывод слоя - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть набор данных, который содержит 1 значение y_true для случая.Я хочу построить DNN, который выводит 3 коэффициента, которые позже будут использоваться следующим образом для создания y_pred

y_pred = 4*coeff_1 + 5*coeff_2 + 6 *coeff_3

Я использую keras, и когда я попытался определить пользовательскую функцию, подобную этой

from keras.callbacks import ModelCheckpoint
from keras.layers import advanced_activations
from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error 

import keras.backend as K

def custom_objective(layer):
    return K.sum(layer.output)

NN_model = Sequential()

# The Input Layer :
NN_model.add(Dense(X_train.shape[1], kernel_initializer='normal',input_dim = X_train.shape[1], activation='relu'))

# The Hidden Layers :
NN_model.add(Dense(20, kernel_initializer='normal',activation='elu'))
NN_model.add(Dense(20, kernel_initializer='normal',activation='elu'))

output_layer = Dense(1, kernel_initializer='normal',activation='linear')

# The Output Layer :
NN_model.add(output_layer)

# Compile the network :
NN_model.compile(loss=custom_objective(output_layer), optimizer='Adamax', metrics=['mean_absolute_error'])
NN_model.summary()

NN_model.fit(X_train, y_train, epochs=10,verbose = 1)

print('NN train = ', mean_absolute_error(y_train , NN_model.predict(X_train)))    

predictions = NN_model.predict(X_test)

MAE = mean_absolute_error(y_test , predictions)

print('NN MAE = ', MAE)

Я получаю все

TypeError: Использование tf.Tensor в качестве Python bool не допускается.Используйте if t is not None: вместо if t:, чтобы проверить, определен ли тензор, и используйте операции TensorFlow, такие как tf.cond, для выполнения подграфов, обусловленных значением тензора.

Так что мой вопрос

Как я могу определить DNN, который будет принимать 1 y_true на данные, вывести 3 значения, которые будут линейно объединены, чтобы собрать y_pred, который будет использоваться для получения функции потерь и обучениясеть

Спасибо за ваше время

1 Ответ

2 голосов
/ 29 апреля 2019

Как насчет чего-то в этом роде?

from keras.models import Model
from keras.layers import Dense, Input, Add, Lambda


def model(inp_size):
    inp = Input(shape=(inp_size, 1))

    x1 = Dense(20, activation='elu')(inp)
    x1 = Dense(20, activation='elu')(x1)
    x1 = Dense(1, activation = 'linear')(x1)

    x2 = Dense(20, activation='elu')(inp)
    x2 = Dense(20, activation='elu')(x2)
    x2 = Dense(1, activation = 'linear')(x2)

    x3 = Dense(20, activation='elu')(inp)
    x3 = Dense(20, activation='elu')(x3)
    x3 = Dense(1, activation = 'linear')(x3)

    x1 = Lambda(lambda x: x * 4.0)(x1)
    x2 = Lambda(lambda x: x * 5.0)(x2)
    x3 = Lambda(lambda x: x * 6.0)(x3)
    out = Add()([x1, x2, x3])

    return Model(inputs = inp, outputs = out)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...