Я хотел бы оптимизировать коэффициенты ODE с использованием тензорного потока.
def odeModel(state, t):
x, y, z = tf.unstack(state)
dx = y
# Here I want to define dy and dz as follows:
# [dy, dz] = tf.nn.relu(tf.matmul([y, z], W) + b)
return tf.stack([dx, dy, dz])
В принципе, я хочу определить [dy, dz] как карту из [y, z], которая зависит от переменных TensorFlow соответствующего размера "W" и "b". Затем я хотел бы найти "W" и "b", которые минимизируют функцию потерь, которая зависит от траектории, начиная с "state0". Это возможно?
Я хочу записать остальную часть кода в следующих строках.
t = np.linspace(0, 5, 100)
state0 = #Appropriate starting point, e.g., tf.constant([0, 1, 3], dtype=tf.float64)
states = tf.contrib.integrate.odeint(odeModel, state0, t)
loss = tf.reduce_mean(tf.pow(states[:, 2], 2))
optimizer = tf.train.AdagradOptimizer(0.05).minimize(loss)
Конечно, мне нужно создать сеанс и запустить оптимизатор. Подробности для краткости опущены. Мне интересно, есть ли способ добиться того, для чего я стреляю.
Это можно сделать точно так, как вы описываете:
import tensorflow as tf
import numpy as np
RS = np.random.RandomState(42)
# Defining model parameters as TF variables
W1 = tf.Variable(RS.randn(2, 1))
b1 = tf.Variable(RS.randn(1,))
W2 = tf.Variable(RS.randn(2, 1))
b2 = tf.Variable(RS.randn(1,))
def odeModel(state, t):
x, y, z = tf.unstack(state)
dx = y
# Model definition
dy = tf.nn.relu(tf.matmul(tf.expand_dims([y, z], -1), W1, transpose_a=True) + b1)
dz = tf.nn.relu(tf.matmul(tf.expand_dims([y, z], -1), W2, transpose_a=True) + b2)
return tf.stack([dx, tf.squeeze(dy), tf.squeeze(dz)])
t = np.linspace(0, 5, 100)
state0 = tf.constant([0, 1, 3], dtype=tf.float64)
states, info = tf.contrib.integrate.odeint(odeModel, state0, t, full_output=True)
loss = tf.reduce_mean(tf.pow(states[:, 2], 2))
optimizer = tf.train.AdagradOptimizer(0.05).minimize(loss)
# ----
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# Value before optimizing
sess.run(W1)
# array [[ 0.49671415],
# [-0.1382643 ]]
# Optimize for 10 steps.
for i in range(10): sess.run(optimizer)
# Value after optimization
sess.run(W1)
# array([[ 0.38043613],
# [-0.26166077]])