我在一个ODE系统中使用Keras神经网络。这是我的模型:
model = Sequential()
model.add(Dense(10, input_dim=3, activation='relu'))
model.add(Dense(1))
这是一个描述微分方程的函数。在常微分方程的计算中使用了Keras模型
def dxdt_new(t, x, *args):
N, beta, gamma, delta = args
deltaInfected = beta * x[0] * x[1] / N
quarantine = model.predict(np.expand_dims(x[:3], axis=0)) / N
recoveredQ = delta * x[3]
recoveredNoQ = gamma * x[1]
S = -deltaInfected
I = deltaInfected - recoveredNoQ - quarantine
R = recoveredNoQ + recoveredQ
Q = quarantine - recoveredQ
return [S, I, R, Q]
我需要使用一个自定义的损失函数进行训练。在我的损失函数中,我不能使用神经网络预测的值,因为我没有关于它的真实数据。我试图使用受预测值影响的值。所以我不使用y_true
和y_pred
def my_loss(y_true, y_pred):
infected = K.constant(INFECTED)
recovered = K.constant(RECOVERED)
dead = K.constant(DEAD)
pred = K.constant(predicted)
loss = K.sum((K.log(infected) - K.log(pred[1][:] + pred[3][:]))**2)
loss += K.sum((K.log(recovered + dead) - K.log(pred[2][:]))**2)
return loss
但当我尝试训练我的神经网络时,我得到以下错误:
ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
所以这个损失函数似乎不能正常工作。如何组织代码以使其正常工作?有没有其他方法来构造损失函数
要使定制的loss函数与Backpropagation algorithm一起工作,需要根据
y_true
和y_pred
定义它。如果没有这些数据,或者损失函数不可微,则必须使用另一种算法来优化神经网络中的权重。这方面的一些例子可以是Genetic Algorithm或Particle Swarm Optimization相关问题 更多 >
编程相关推荐