Керас пользовательская функция потери с потерей расстояния Махаланобиса, как - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь реализовать пользовательскую функцию потери в Керасе, используя потерю расстояния Махаланобиса. Однако я всегда сталкиваюсь с этой досадной ошибкой.

Расстояние Махаланобиса (или «обобщенное квадратное расстояние между точками» для его квадратного значения [3]) также может быть определено как мера различия между двумя случайными векторами x и y одного и того же распределения с ковариационной матрицей S.

d (x, y) = квадрат [Транспонировать (xy) * Инвертировать (S) * (xy)]

(https://en.wikipedia.org/wiki/Mahalanobis_distance)

n_classes = 4
n_samples=800
X, y = make_classification(n_samples=n_samples, n_features=20, n_informative=4, n_redundant=0, n_classes=n_classes, n_clusters_per_class=2)
y = to_categorical(y)
Xtrainb, testXb, ytrainb, ytestb = train_test_split(X, y, test_size = 0.3, random_state=42)

x_trainb = np.reshape(Xtrainb, (Xtrainb.shape[0], Xtrainb.shape[1], 1))
Xtestb = np.reshape(testXb, (testXb.shape[0], testXb.shape[1], 1))

densesize = 4
input_datab = Input(shape=(Xtrainb.shape[1],1)) 
epochs = 10
batch_size = 32
dropout= 0.1
lr= 0.001

########
def mahalanobis(y_true, y_pred):
    x_minus_mn_with_transpose = K.transpose(y_true - y_pred)
    Covariance = covr1(y_true, y_pred)
    inv_covmat = tf.linalg.inv(Covariance)
    x_minus_mn = y_true - y_pred
    left_term = K.dot(x_minus_mn, inv_covmat)
    D_square = K.dot(left_term, x_minus_mn_with_transpose)
    return D_square 

def covr1(y_true, y_pred):
    #x_mean = K.mean(y_true)
    #y_mean = K.mean(y_pred)
    Cov_numerator = K.sum(((y_true - y_pred)*(y_true - y_pred)))
    Cov_denomerator = len(Xtrainb)-1
    Covariance = (Cov_numerator / Cov_denomerator)
    return Covariance


conv1= Conv1D(filters=80, kernel_size=2, padding='same',   input_dim=Xtrainb.shape[1])(input_datab)
maxpool = MaxPooling1D(pool_size=3, stride=3 )(conv1)
conv2= Conv1D(filters=50, kernel_size=2, padding='same',   input_dim=Xtrainb.shape[1])(maxpool)
maxpool = MaxPooling1D(pool_size=3, stride=3)(conv2)
flatten = Flatten()(maxpool)
dense = Dense(84, activation='relu')(flatten)
dense = Dense(1024, activation='relu')(flatten)
dense = Dense(densesize, activation='softmax')(dense)
model = Model(inputs=[input_datab],outputs=[dense])
model.compile(loss= mahalanobis,  optimizer='adam', metrics=['acc'])
hist = model.fit(x_trainb, ytrainb, validation_data=(Xtestb, ytestb), epochs=epochs, batch_size=batch_size)




ValueError: Shapeдолжен иметь ранг как минимум 2, но ранг 0 для 'loss_88 / dens_270_loss / MatrixInverse' (op: 'MatrixInverse') с входными фигурами: [].

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