Tensorflow:为什么直接训练模型和参数会有差异

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

下面是我写的一个简单的程序。它的工作是学习简单线性函数Ax+B的参数

当“手动”训练时,它会在几千年后收敛,但当我尝试使用密集(1)层+模型进行同样的训练时,它会收敛到损失500000,并且训练的参数与正确的参数相差甚远(-2,34)

我以为稠密(1)层就像Ax+B,但它不是吗

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))