【问题标题】:TFP Linear Regression yhat=model(x_tst) - doesn't work for other dataTFP 线性回归 yhat=model(x_tst) - 不适用于其他数据
【发布时间】:2021-08-12 04:58:36
【问题描述】:

我看不出我正在做的事情与我正在遵循的 Google TFP 示例之间的区别。我做错了什么/我应该做不同的事情吗?

[设置:Win 10 Home 64 位 20H2,Python 3.7,TF2.4.1,TFP 0.12.2,在 Jupyter Lab 中运行]

我一直在按照 TFP 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 的正确 1D 大小)

为了比较:Google 的 TFP 示例的 load_dataset 函数返回 y, x, x_tst,它们都是大小为 150 的 np.ndarray,而我使用 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);

(绘制时给出了谷歌数据的预期输出 - 我还没有做到这一点):

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

怎么了?

(如果我尝试 mode.predict,我认为我在 TFP 中遇到了一个已知的错误/差距;那么它会导致断言失败)

更新 - 显式重塑解决问题

来自 Frightera 的提示引发了进一步的调查:x_tst has shape (2019,)

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

【问题讨论】:

  • 你能添加你的数据集的形状吗?
  • @Frightera all 1D,就像 TFP 示例一样(我也将信息添加到帖子中)
  • TFP 示例类似于 (150,1)。尝试重塑您的数据?
  • @Frightera - 查看更新。谢谢。

标签: tensorflow2.0 tensorflow-probability


【解决方案1】:

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

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

我相信答案就在numpy glossary 中,其中提到了 (n,)

括号中的数字后跟逗号表示一个元组 元素。尾随逗号将单元素元组与 带括号的n。

这自然呼应了关于元组here的Python语句

因此,形状 (R,) 的数组是一个元组,将数组描述为一定程度 R 的 1D,其中附加逗号以区分元组 (R,) 和非元组 (R)。

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

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

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 2017-05-06
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2014-05-05
    相关资源
    最近更新 更多