Оптимизация параметра в odeint с выводом нейронной сети в TensorFlow

1

Я хотел бы оптимизировать коэффициенты 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)

Конечно, мне нужно создать сеанс и запустить оптимизатор. Подробности для краткости опущены. Мне интересно, есть ли способ добиться того, для чего я стреляю.

Теги:
tensorflow

1 ответ

0
Лучший ответ

Это можно сделать точно так, как вы описываете:

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]])
  • 1
    Спасибо! Это именно то, что мне было нужно. Быстрый комментарий: «эпоха» должна быть заменена на «диапазон».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню