python - 当我使用自定义损失函数运行程序时 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。任何想法是什么导致了这个问题?
解决方案
错误出现在计算特征值和特征向量的能量函数中。
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)
推荐阅读
- php - 使用前端控制器时在同一控制器上显示 Ajax 调用值
- html - 缩放 Svg 而不拉伸其中的一部分
- php - Laravel 无法在 eloquent 创建事件上设置 id
- windows - 扩展 Windows 安全模型
- tvos13 - 使用用 Xcode 11 编译的 tvOS 13 UITabBarController - tabBarObservedScrollView 滚动内容
- scala - 将两个列表与一个不同的元素组合在一起
- php - Laravel如何自动获取数组ID
- angular - Angular 如何使用 combineLatest 组合来自网站 url 栏的路由和查询
- npm - 如何在创建新的 Angular 8 项目时修复此 json 错误
- java - Drools 在 camelCase 中查找 Java 类,引发 NoClassDefFoundError