Python 使用完整数据集进行梯度下降时,TensorFlow权重增加

Python 使用完整数据集进行梯度下降时,TensorFlow权重增加,python,numpy,tensorflow,Python,Numpy,Tensorflow,我写了一篇文章,深入解释了神经网络是如何从头开始工作的 为了说明这篇博文,我在中编写了神经网络,并使用编写了一个版本。我在Github上上传了代码来说明这个问题,但这不是一个干净的版本 该网络的目标是根据汽车的三个特征(公里、燃料类型、年龄)预测汽车的价格。这是我从头开始创建的一个玩具示例 我从中检索数据,我的数据集由大约9k辆汽车组成(仅宝马一级)。我对数据进行了标准化,使价格介于[0,1]之间,燃料类型采用二进制编码,使用平均值和标准偏差对里程数和里程数进行标准化 神经网络结构非常简单,我只

我写了一篇文章,深入解释了神经网络是如何从头开始工作的

为了说明这篇博文,我在中编写了神经网络,并使用编写了一个版本。我在Github上上传了代码来说明这个问题,但这不是一个干净的版本

该网络的目标是根据汽车的三个特征(公里、燃料类型、年龄)预测汽车的价格。这是我从头开始创建的一个玩具示例

我从中检索数据,我的数据集由大约9k辆汽车组成(仅宝马一级)。我对数据进行了标准化,使价格介于[0,1]之间,燃料类型采用二进制编码,使用平均值和标准偏差对里程数和里程数进行标准化

神经网络结构非常简单,我只使用了三个汽车属性,但是我的非tensorflow网络的结果非常好。验证测试集给出:

### Testing summary ###
Iteration: 2000, Loss 0.001066
RMSE: 0.0567967802161
MAE: 0.00757498877216
R2: 0.198448957215
我在梯度下降优化过程中使用了整个数据集。我的问题出现在TensorFlow版本中,如果我在梯度下降过程中仅使用20个输入,损失将正确减少:

I tensorflow/core/kernels/logging_ops.cc:79] loss[0.6057564]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.45724705]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.35986084]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.29016402]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.23823617]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.1986042]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.16779649]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.14347225]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.12400422]
I tensorflow/core/kernels/logging_ops.cc:79] loss[0.10823684]
但是,如果我使用整个数据集,即9k个示例,我的丢失显示出一种不稳定的行为

I tensorflow/core/kernels/logging_ops.cc:79] loss[226.40295]
I tensorflow/core/kernels/logging_ops.cc:79] loss[6130.1694]
I tensorflow/core/kernels/logging_ops.cc:79] loss[8629.668]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9219.1445]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9217.1855]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9211.8428]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9209.2715]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9212.22]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9204.3613]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9182.3125]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9171.9746]
I tensorflow/core/kernels/logging_ops.cc:79] loss[9200.2207]
我不明白为什么

目前,我的tensorflow版本如下:

import csv
import numpy as np
import tensorflow as tf

reader = csv.reader(open("normalized_car_features.csv", "rb"), delimiter=",")
x = list(reader)
features = np.array(x[1:]).astype("float")
np.random.shuffle(features)

data_x = features[:, :3]
data_y = features[:, 3:]

m = float(features.shape[0])
threshold = int(m * 0.8)

x_data, x_test = data_x[:threshold, :], data_x[threshold:, :]
y_data, y_test = data_y[:threshold, :], data_y[threshold:, :]

x = tf.placeholder("float")
y = tf.placeholder("float")

w1 = np.matrix([
    [0.01, 0.05, 0.07],
    [0.2, 0.041, 0.11],
    [0.04, 0.56, 0.13]
])

w2 = np.matrix([
    [0.04, 0.78],
    [0.4, 0.45],
    [0.65, 0.23]
])

w3 = np.matrix([
    [0.04],
    [0.41]
])

w1 = tf.Variable(w1, dtype=tf.float32)
w2 = tf.Variable(w2, dtype=tf.float32)
w3 = tf.Variable(w3, dtype=tf.float32)

b1 = tf.Variable(np.matrix([0.1, 0.1, 0.1]), dtype=tf.float32)
b2 = tf.Variable(np.matrix([0.1, 0.1]), dtype=tf.float32)
b3 = tf.Variable(np.matrix([0.1]), dtype=tf.float32)

layer_1 = tf.nn.tanh(tf.add(tf.matmul(x, w1), b1))
layer_2 = tf.nn.tanh(tf.add(tf.matmul(layer_1, w2), b2))
layer_3 = tf.nn.tanh(tf.add(tf.matmul(layer_2, w3),  b3))

loss = tf.reduce_sum(tf.square(layer_3 - y))
loss = tf.Print(loss, [loss], "loss")

train_op = tf.train.GradientDescentOptimizer(1/m * 0.01).minimize(loss)

init = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(init)
    for i in range(10000):
        session.run(train_op, feed_dict={x: x_data, y: y_data})
预测值为
[-1,-1,…-1,-1]


更新:使用
tf.train.GradientDescentOptimizer(1/m*0.01)
它按预期工作。

问题不在于优化器,而在于您的损失。它应该返回平均损失,而不是总和。例如,如果您正在进行L2回归,它应该如下所示:

l_value = tf.pow(tf.abs(ground_truth - predict), 2) # distance for each individual position of the output matrix of shape = (n_examples, example_data_size)
regression_loss = tf.reduce_sum(l_value, axis=1) # distance per example, shape = (n_examples, 1)
total_regression_loss = tf.reduce_mean(regression_loss) # mean distance of all examples, shape = (1)

PS:
tf.abs
用于方便,因此您可以用另一个(如L1)替换L2损失,而无需担心符号变化,这将在复杂平面中产生结果。

梯度似乎不是平均值。除了所有的问题:为什么你从预设的重量开始?你希望得到什么?最初我使用的是正态分布的随机样本。我设置这些权重是为了确认forward道具产生的结果与我的numpy实现相同,它确实产生了相同的结果。另外,在我的博客文章中描述权重的整个概念以及它们在前进和后退过程中的演变时,我使用了这些值。读者更容易理解。我的坏(脸掌)。尽管如此,在我的例子中,由于这是一个回归问题,
regression\u loss=tf.reduce\u sum(l\u value,axis=1)
是没有用的。如果您最终想要为批处理中的单个示例评估损失,那么为这两个变量(reduce\u sum和reduce\u mean)设置变量是很有用的。但如果你不在乎它,那就真的没必要了。:-)当然,我想说的是,基本事实是一个矩阵,
l\u值
已经给了我
tf。reduce\u sum(l\u值,axis=1)
:)打得好