初学者的 Tensorflow 问题:无法正确获得简单线性方程的维度

Beginner's Tensorflow question: Can't get the dimensions for a simple linear equation right

我开始涉足 Tensorflow,想教模型一个简单的线性方程。因此,为了生成训练数据,我正在编写一个小脚本来生成两个数组,一个是两个随机整数 (x1, x2) 的 100 个元组,另一个是每个值为 y = 2x1 + 5x2:

import tensorflow as tf
import numpy as np

list_len = 100

x_data_list = []
y_data_list = []

for i in range(list_len):
    x1 = np.random.randint(100)
    x2 = np.random.randint(100)
    x_data_list.append((x1, x2))
    y_data_list.append(2 * x1 + 5 * x2)

x_data = np.asarray(x_data_list)
y_data = np.asarray(y_data_list)

然后我想建立一个简单的模型来学习这两个数组之间的关系:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=2, name="Input_layer", input_shape=(2,), activation="relu"),
    tf.keras.layers.Dense(units=16, name="Hidden_layer", activation="relu"),
    tf.keras.layers.Dense(units=1, name="Output_layer", activation="relu")
    ])

model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(x_data, y_data, epochs=100)

代码可以运行,但它非常无用 - 它以高得离谱的损失开始,并且损失在这 100 个时期内从未下降。

经过一些故障排除尝试后,我的理论是问题出在输入层中 input_shape 参数的维数上,我弄错了,模型不知道它应该是什么将 x_data 中的两个输入整数映射到 y_data 中的一个输出整数。但是我尝试更改该参数只会给我一个错误,即模型期望输入数据的另一个维度。 (2,) 是我将 x_data 的一个实例传递给 np.shape().

时得到的结果

有人知道我做错了什么吗?

并不是说这解决了 fit 问题,但可以简化生成数据的过程:

In [69]: x_data.shape
Out[69]: (100, 2)
In [70]: y_data.shape
Out[70]: (100,)
In [71]: x1=np.random.randint(100,size=(100,2))
In [72]: x1.shape
Out[72]: (100, 2)
In [73]: y1 = np.dot(x1,[2,5])
In [74]: y1.shape
Out[74]: (100,)

我没有 tensorflow,所以不会尝试您的模型。但是用 numpy's 自己的 leastsqr fit:

In [78]: np.linalg.lstsq(x1,y1,rcond=-1)
Out[78]: 
(array([2., 5.]),
 array([7.96628473e-25]),
 2,
 array([783.14344837, 278.42295034]))
In [79]: np.linalg.lstsq(x_data,y_data,rcond=-1)
Out[79]: 
(array([2., 5.]),
 array([2.41433345e-25]),
 2,
 array([743.02650756, 296.1715872 ]))

我不确定 rcond=-1 的作用,但没有它我收到了警告。

谢谢 hpaulj,确实更流畅了。

总结一下:我在自己的代码上工作了更长的时间,同时让它开始工作。问题是,我认为,当我将数据生成为列表,然后将其转换为 np.array 时,转换似乎输出了一个列表数组,而不是一直是数组的东西所有维度。与此同时,我将其更改为以 np.array 开头的数据生成,并且有效。