Python 张量流中的最小多元函数
假设我有以下几个变量函数的简单例子Python 张量流中的最小多元函数,python,tensorflow,Python,Tensorflow,假设我有以下几个变量函数的简单例子 @tf.function def f(A, Y, X): AX = tf.matmul(A, X) norm = tf.norm(Y - AX) return norm N = 2 A = tf.Variable(np.array([[1, 2], [3, 4]])) Y = tf.Variable(np.identity(N)) X = tf.Variable(np.zeros((N, N))) 如何找到使用Tensorflow最小化f的X?
@tf.function
def f(A, Y, X):
AX = tf.matmul(A, X)
norm = tf.norm(Y - AX)
return norm
N = 2
A = tf.Variable(np.array([[1, 2], [3, 4]]))
Y = tf.Variable(np.identity(N))
X = tf.Variable(np.zeros((N, N)))
如何找到使用Tensorflow最小化f
的X
?
我对一个通用的解决方案感兴趣,该解决方案与上述声明的函数一起工作,并且当有多个变量需要优化时。假设Tensorflow 2,您可以使用Keras优化器:
@tf.function
def f(A, Y, X):
AX = tf.matmul(A, X)
norm = tf.norm(Y - AX)
return norm
N = 2
A = tf.Variable(np.array([[1., 2.], [3., 4.]]))
Y = tf.Variable(np.identity(N))
X = tf.Variable(np.zeros((N, N)))
optimizer = tf.keras.optimizers.SGD()
for iteration in range(0, 100):
with tf.GradientTape() as tape:
loss = f(X, Y, X)
print(loss)
grads = tape.gradient(loss, [A, Y, X])
optimizer.apply_gradients(zip(grads, [A, Y, X]))
print(A, Y, X)
这对任何可微函数都有效。对于不可微函数,您可以查看其他优化技术(如遗传算法或群优化。NEAT有这些技术的实现)。假设Tensorflow 2,您可以使用Keras优化器:
@tf.function
def f(A, Y, X):
AX = tf.matmul(A, X)
norm = tf.norm(Y - AX)
return norm
N = 2
A = tf.Variable(np.array([[1., 2.], [3., 4.]]))
Y = tf.Variable(np.identity(N))
X = tf.Variable(np.zeros((N, N)))
optimizer = tf.keras.optimizers.SGD()
for iteration in range(0, 100):
with tf.GradientTape() as tape:
loss = f(X, Y, X)
print(loss)
grads = tape.gradient(loss, [A, Y, X])
optimizer.apply_gradients(zip(grads, [A, Y, X]))
print(A, Y, X)
这对任何可微函数都有效。对于不可微函数,您可以查看其他优化技术(如遗传算法或群优化。NEAT有这些技术的实现)。基本上是正确的,尽管需要注意:1)为了简单起见,您可以直接使用优化器的方法2)如果您只想优化X
,您应该确保这是您正在更新的唯一变量
import tensorflow as tf
@tf.function
def f(A, Y, X):
AX = tf.matmul(A, X)
norm = tf.norm(Y - AX)
return norm
# Input data
N = 2
A = tf.Variable([[1., 2.], [3., 4.]], tf.float32)
Y = tf.Variable(tf.eye(N, dtype=tf.float32))
X = tf.Variable(tf.zeros((N, N), tf.float32))
# Initial function value
print(f(A, Y, X).numpy())
# 1.4142135
# Setup a stochastic gradient descent optimizer
opt = tf.keras.optimizers.SGD(learning_rate=0.01)
# Define loss function and variables to optimize
loss_fn = lambda: f(A, Y, X)
var_list = [X]
# Optimize for a fixed number of steps
for _ in range(1000):
opt.minimize(loss_fn, var_list)
# Optimized function value
print(f(A, Y, X).numpy())
# 0.14933111
# Optimized variable
print(X.numpy())
# [[-2.0012102 0.98504114]
# [ 1.4754106 -0.5111093 ]]
基本上是正确的,但请注意:1)为了简单起见,您可以直接使用优化器的方法2)如果您只想优化X
,则应确保这是您正在更新的唯一变量
import tensorflow as tf
@tf.function
def f(A, Y, X):
AX = tf.matmul(A, X)
norm = tf.norm(Y - AX)
return norm
# Input data
N = 2
A = tf.Variable([[1., 2.], [3., 4.]], tf.float32)
Y = tf.Variable(tf.eye(N, dtype=tf.float32))
X = tf.Variable(tf.zeros((N, N), tf.float32))
# Initial function value
print(f(A, Y, X).numpy())
# 1.4142135
# Setup a stochastic gradient descent optimizer
opt = tf.keras.optimizers.SGD(learning_rate=0.01)
# Define loss function and variables to optimize
loss_fn = lambda: f(A, Y, X)
var_list = [X]
# Optimize for a fixed number of steps
for _ in range(1000):
opt.minimize(loss_fn, var_list)
# Optimized function value
print(f(A, Y, X).numpy())
# 0.14933111
# Optimized variable
print(X.numpy())
# [[-2.0012102 0.98504114]
# [ 1.4754106 -0.5111093 ]]
使用。。。?但是您在一个应用程序中使用NumPy函数(
np.
)(我想您使用的是tf2.x?),所以这是行不通的。(我还认为tf.variables
的意思是tf.Variable
?)@jdehesa我从f
中删除了numpy并更正了“variables”。使用。。。?但是您在一个应用程序中使用NumPy函数(np.
)(我想您使用的是tf2.x?),所以这是行不通的。(我还假设你所说的tf.variables
是指tf.Variable
?)@jdehesa我从f
中删除了numpy并更正了“variables”。如果A和Y是变量,这个答案是有效的,但问题是要找到X.A和Y应该是恒定的。如果A和Y是变量,这个答案是有效的,但问题是要找到X,A和Y应该是常数