TFP 线性回归 yhat=model(x_tst) - 不适用于其他数据

TFP Linear Regression yhat=model(x_tst) - doesn't work for other data

我看不出我正在做的事情和工作 Google TFP 示例之间的区别,我正在遵循其结构。我在做什么 wrong/should 我在做什么?

[设置:Win 10 Home 64 位 20H2,Python3.7,TF2.4.1,TFP 0.12.2,运行 在 Jupyter 实验室]

我一直在按照全要素生产率Probabilistic Layers Regression的例子一步步建立模型。案例 1 代码运行良好,但我的并行模型没有,我看不出可能导致这种情况的差异

yhat = model(x_tst)

失败并显示消息 Input 0 of layer sequential_14 is incompatible with the layer: : expected min_ndim=2, found ndim=1. Full shape received: (2019,)(这是 x_tst 的正确一维大小)

作为比较:Google的load_dataset函数用于TFP示例returnsy, x, x_tst,它们都是np.ndarray大小为150,而我使用 pandas.read_csv 从 csv 文件中读取数据,将其拆分为 train_ 和 test_datasets,然后从训练数据集中取 1 列数据作为自变量 'g' 和因变量 'redz' .

我知道 x、y 等需要 np.ndarray,但是没有直接创建 ndarray,所以我有...

x = np.array(train_dataset['g'])
y = np.array(train_dataset['redz'])
x_tst = np.array(test_dataset['g'])

其中 x、y、x_tst 都是一维的 - 就像 TFP 示例一样。

模型本身运行

model = tf.keras.Sequential([
  tf.keras.layers.Dense(1),
  tfp.layers.DistributionLambda(lambda t: tfd.Normal(loc=t, scale=1)),
])

# Do inference.
model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.01), loss=negloglik)
model.fit(x, y, epochs=1, verbose=False);

(并且在绘制时给出了 google 数据的预期输出 - 我没有做到这一点):

但是,根据示例,当我尝试通过 yhat = model(x_tst) 来“获利”时,我得到了上面给出的尺寸错误。

怎么了?

(如果我尝试 mode.predict 我想我在 TFP 中命中了一个已知的 bug/gap;然后断言失败)

更新 - 显式重塑解决了问题

Frightera 的提示导致进一步调查:x_tst 具有形状 (2019,)

通过 x_tst = x_tst.rehape(2019,1) 重塑解决了这个问题。 TF 的要求是否不一致,或者是否有充分的理由要求明确的最终维度 1?谁知道。至少现在可以做出预测了。

在这个问题 Difference between numpy.array shape (R, 1) and (R,) 中,OP 询问了 (R,) 和 (R,1) 之间的区别,但给出的答案没有解决这个具体问题。

同样在这个问题中Difference between these array shapes in numpy

我相信答案就在 numpy glossary 中,它说 (n,) that

A parenthesized number followed by a comma denotes a tuple with one element. The trailing comma distinguishes a one-element tuple from a parenthesized n.

这自然呼应了 Python 关于元组的陈述 here

因此,形状为 (R,) 的数组是一个元组,将数组描述为某个范围 R 的一维数组,其中附加逗号以区分元组 (R,) 和非元组 (R) .

但是,对于一维数组,没有行或列排序的意义; (R,1) 是 R 行乘 1 列,但是 (1, R) 将是 1 行 R 列,尽管它对一维迭代器无关紧要,但它确实如此,或者迭代器无法正确识别 ( , ) 并认为它是二维的。 (即我不知道该部分的技术细节,但这些似乎是解释该行为的唯一选项。)

此问题与 Tensorflow 中张量定义中出现的大小不确定性无关。在 Tensorflow 的上下文中,张量(数组)可能具有不确定的形状,因此在处理过程中可能会沿某个轴添加更多数据,例如分批处理,在这种情况下,初始 Tensor 形状包含一个前导 None 以指示预期发生数组扩展的位置。 (参见例如张量的形状 here