首页 > 解决方案 > 当我使用自定义损失函数运行程序时 Python 崩溃

问题描述

每当我运行此代码时,Python 就会停止工作。为了确保这不是我系统的问题,我尝试在 Google Colab 中运行它,但它也崩溃了。当执行到达model.fit行时发生崩溃

data = load_iris()
X = data['data']
y = data['target']
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.33, random_state =23)

def energy(x):
    val,vec = tf.linalg.eigh(x)
    en = tf.reduce_sum(tf.math.square(val))
    return en

def energy_loss(y_actual,y_predicted):
    mtm_actual = tf.linalg.matmul(y_actual,tf.transpose(y_actual))
    ptp_actual = tf.linalg.matmul(y_predicted,tf.transpose(y_predicted))
    actual_energy = energy(y_actual)
    predicted_energy = energy(y_predicted)
    return tf.math.abs(actual_energy - predicted_energy)

model = Sequential()
model.add(Dense(32,input_dim=4))
model.add(Dense(64,activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(64,activation='relu'))
model.add(Dense(3,activation='relu'))
opt = Adam(lr = 1)
model.compile(optimizer = opt, loss=energy_loss,metrics=['accuracy'])

model.fit(X_train,X_train,epochs=25,verbose = 1,batch_size = 5)

运行此代码时,我使用的是 tensorflow 1.15.0。任何想法是什么导致了这个问题?

标签: pythontensorflowkeras

解决方案


错误出现在计算特征值和特征向量的能量函数中。

tf.linalg.eigh

计算张量中最里面的 N×N 矩阵的特征值和特征向量,使得 tensor[...,:,:] * v[..., :,i] = e[..., i] * v [...,:,i],对于 i=0...N-1。

这是来自官方文档。您对能量函数的输入不满足这些条件。

可以通过将正确的参数传递给energy函数来解决此问题

def energy_loss(y_actual,y_predicted):
    mtm_actual = tf.linalg.matmul(y_actual,tf.transpose(y_actual))
    ptp_actual = tf.linalg.matmul(y_predicted,tf.transpose(y_predicted))
    actual_energy = energy(mtm_actual)
    predicted_energy = energy(ptp_actual)
    return tf.math.abs(actual_energy - predicted_energy)

推荐阅读