我可以在keras自定义损失函数中包含sdeint随机积分吗?

问题描述

我正在尝试让神经网络拟合随机微分方程(SDE)的两个参数,该方程的终端分布具有已知矩(均值,标准差)。特别是,我希望神经网络预测SDE上的参数,然后让自定义损失函数将SDE(对于给定数量的路径)整合到预测参数下,并计算与已知力矩的偏差。> python sde集成库

sdeint似乎使用了numpy,该函数在keras损失函数中不起作用。我收到错误:

AttributeError:用户代码中:

/usr/local/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py:806 train_function  *
    return step_function(self,iterator)
<ipython-input-1-2252ad1bedac>:35 loss_fn  *
    Y_T = [sd.itoint(f,g,Y0,tspan)[-1][0] for i in range(30)]
/usr/local/lib/python3.7/site-packages/sdeint/integrate.py:123 itoint  *
    (d,m,f,G,y0,tspan,__,__) = _check_args(f,None,None)
/usr/local/lib/python3.7/site-packages/sdeint/integrate.py:86 _check_args  *
    if Gtest.ndim != 2 or Gtest.shape[0] != d:

AttributeError: 'Tensor' object has no attribute 'ndim'

有没有办法在损失函数中包括随机积分?我在下面提供了一个可重现的最小示例,以说明该错误。

import tensorflow as tf
import numpy as np
from sklearn.model_selection import train_test_split
import sdeint as sd

# Create Random Sample Data
def create_data(n):
 x1 = np.array([i/100+np.random.uniform(-1,3) for i in range(n)]).reshape(n,1)
 x2 = np.array([i/100+np.random.uniform(-3,5)+2 for i in range(n)]).reshape(n,1)
 x3 = np.array([i/100+np.random.uniform(-6,5)-3 for i in range(n)]).reshape(n,1)

 y1= [x1[i]-x2[i]+x3[i]+np.random.uniform(-2,2) for i in range(n)]
 y2= [x1[i]+x2[i]-x3[i]+5+np.random.uniform(-1,3) for i in range(n)]
 X = np.hstack((x1,x2,x3))
 Y = np.hstack((y1,y2))
 return X,Y

X,Y = create_data(n=450)
in_dim = X.shape[1]
out_dim = Y.shape[1]

xtrain,xtest,ytrain,ytest=train_test_split(X,Y,test_size=0.15)

# Define Custom Loss Function
def loss_fn(y_pred,obj):
    # Extract SDE Parameters
    Z = y_pred[0]
    Y0 = y_pred[1]

    def f(y,t):
        return -(y+Z+1)
    def g(y,t):
        return Z
    
    # Integrate     
    tspan = np.linspace(0.0,0.2,201)
    Y_T = [sd.itoint(f,tspan)[-1][0] for i in range(30)]  
    Loss = (tf.mean(Y_T)-obj[0])**2+(tf.std(Y_T)-obj[1])**2
    
    return Loss

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(100,input_dim=in_dim,activation="relu"))
model.add(tf.keras.layers.Dense(32,activation="relu"))
model.add(tf.keras.layers.Dense(out_dim))
model.compile(loss=loss_fn,optimizer="adam")
 
model.fit(xtrain,epochs=100,batch_size=12,verbose=0)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...