Я пишу нейронную сеть RBF, чтобы она предсказывала решение простого ODE. Когда решение ODE является линейным (скажем, $$ \ frac {dy} {dx} = 1) $$, тогда модель точно предсказывает $$ y = x + c $$. Однако, когда я определяю потерю модели как $$ \ frac {d ^ 2y} {dx ^ 2} = 1 $$, тогда потеря не становится меньше 1.
Я пытался изменить скорость обучения, но это не имело никакого эффекта.
Это работает:
x = np.arange(0.25,0.75,0.01)
labels = np.ones(50)
def gradient( y, x , give_name):
return Lambda( lambda z: K.gradients( z[0], z[1] ), output_shape = [1], name = give_name)( [ y, x ] )
x1= Input(shape=(1,))
rbflayer = RBFLayer(10, betas=1, input_shape=(1,))(x1)
y = Dense(1, activation='sigmoid', kernel_initializer='ones' )(rbflayer)
g1 = gradient( y, x1 , "dudx1")
model = Model(inputs=x1,outputs=[y,g1,g11,loss])
losses = {
"dudx1": "mean_squared_error",
}
model.compile(loss=losses, optimizer='adam')
model.fit(x,labels,epochs=1000,verbose=1)
plt.plot(x,model.predict(x)[0])
Это не:
def gradient( y, x , give_name):
return Lambda( lambda z: K.gradients( z[0], z[1] ), output_shape = [1], name = give_name)( [ y, x ] )
x1= Input(shape=(1,))
rbflayer = RBFLayer(10, betas=1, input_shape=(1,))(x1)
y = Dense(1, activation='sigmoid', kernel_initializer='ones' )(rbflayer)
g1 = gradient( y, x1 , "dudx1")
g11 = gradient( g1,x1,"dudxx1")
model = Model(inputs=x1,outputs=[y,g1,g11,loss])
losses = {
"dudxx1": "mean_squared_error",
}
model.compile(loss=losses, optimizer='adam')
Я приветствую любые конструктивные отзывы, если вы видите, почему второй пример не сходится!