Tensorflow:为什么直接训练模型和参数会有差异
下面是我写的一个简单的程序。它的工作是学习简单线性函数Ax+B的参数 当“手动”训练时,它会在几千年后收敛,但当我尝试使用密集(1)层+模型进行同样的训练时,它会收敛到损失500000,并且训练的参数与正确的参数相差甚远(-2,34) 我以为稠密(1)层就像Ax+B,但它不是吗Tensorflow:为什么直接训练模型和参数会有差异,tensorflow,keras,Tensorflow,Keras,下面是我写的一个简单的程序。它的工作是学习简单线性函数Ax+B的参数 当“手动”训练时,它会在几千年后收敛,但当我尝试使用密集(1)层+模型进行同样的训练时,它会收敛到损失500000,并且训练的参数与正确的参数相差甚远(-2,34) 我以为稠密(1)层就像Ax+B,但它不是吗 from tensorflow.keras import layers, models from tensorflow.keras import optimizers from tensorflow.keras impo
from tensorflow.keras import layers, models
from tensorflow.keras import optimizers
from tensorflow.keras import initializers
import tensorflow as tf
import random
import numpy as np
x_train = np.linspace(1, 100, 100)
y_train = -2*x_train+34
def manual_train():
optimizer = optimizers.Adam(lr=1e-2)
vars = [tf.Variable(random.random(), trainable=True) for i in range(2)]
for epoch in range(1000000):
with tf.GradientTape() as tape:
y_pred = vars[0]*x_train + vars[1]
loss = tf.reduce_sum(tf.abs(y_train - y_pred))
model_gradients = tape.gradient(loss, vars)
optimizer.apply_gradients(zip(model_gradients, vars))
print(epoch, 'parameters', vars[0].numpy(), vars[1].numpy(), 'loss', loss.numpy())
def nn_train():
input_layer = layers.Input(shape=(1,))
output_layer = layers.Dense(1, kernel_initializer=initializers.RandomUniform(0,1), bias_initializer=initializers.RandomUniform(0,1))(input_layer)
model = models.Model(inputs=input_layer, outputs=output_layer)
optimizer = optimizers.Adam(lr=1e-2)
#model.compile(optimizer=optimizer, loss=None)
for epoch in range(1000000):
with tf.GradientTape() as tape:
y_pred = model(x_train.reshape((-1,1)))
loss = tf.reduce_sum(tf.abs(y_train - y_pred))
model_gradients = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(model_gradients, model.trainable_variables))
print(epoch, 'parameters', model.trainable_variables[0].numpy(), model.trainable_variables[1].numpy(), 'loss', loss.numpy())
# uncomment one:
manual_train()
#nn_train()
在keras示例中,您有一个形状问题 由于该问题,操作
y_train-y_pred
与您认为的不完全一样。
因为在这一点上,y_train的形状是(100)
和y_pred
的形状是(100,1)
,当你做减法运算时,TensorFlow会做一个“smart”,最终结果是一个大小为(100100)
将你的基本事实重塑为与你的输出相同的形状(或者反过来),以获得正确的损失值:
loss = tf.reduce_sum(tf.abs(y_train.reshape((-1,1)) - y_pred))
就这样-谢谢!为了子孙后代,请修正括号中的错误-重塑(-1,1))