我看不出我正在做的事情和我正在遵循的谷歌TFP示例的结构有什么不同。我做错了什么/我应该做不同的事情吗?
[设置:Win 10 Home 64位20H2,Python 3.7,TF2.4.1,TFP 0.12.2,在Jupyter Lab中运行]
我一直在以TFP概率层回归为例逐步构建模型。案例1代码运行正常,但我的并行模型运行不正常,我看不到可能导致这种情况的差异
yhat = model(x_tst)
若要在消息中失败,则层顺序_14的输入0与层::expected min_ndim=2不兼容,发现ndim=1。收到完整形状:(2019,)
(这是x_tst的正确1D尺寸)
作为比较:谷歌的TFP示例加载数据集函数返回y,x,x_tst
,它们都是大小为150的np.ndarray,而我使用pandas.read_csv从csv文件中读取数据,将其拆分为train_和test_数据集,然后从训练数据集中获取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中遇到了一个已知的bug/gap;那么它将无法断言)
更新-显式重塑解决问题
来自恐怖时代的暗示导致了进一步的调查:x_tst有形状(2019年)
通过x_tst=x_tst.rehape(2019,1)
重新整形解决了该问题。TF的要求是否不一致,或者是否有充分的理由要求明确的最终尺寸1?谁知道呢。至少现在可以做出预测了。
在这个问题中,numpy.array形状(R,1)和(R,)之间的区别,OP询问(R,)和(R,1)之间的区别,但给出的答案没有解决这个具体问题。
同样,在这个问题中,numpy中的这些数组形状之间也存在差异
我相信答案就在Numpy词汇表中,它说(n,)
括号中的数字后跟逗号表示一个元组中有一个元素。尾随逗号区分单元素元组和带括号的n。
它自然地呼应了这里关于元组的Python语句
因此,形状数组(R,)是一个元组,将数组描述为具有一定范围R的1D,其中添加逗号以区分元组(R,)和非元组(R)。
然而,对于一维数组,没有行或列排序的意义;(R,1)是R行乘以1列,但是(1,R)将是R列的1行,尽管这对1D迭代器来说并不重要,它或者html" target="_blank">迭代器没有正确识别(,)并认为它是2D。(即,我不知道该部分的技术细节,但这些似乎是解释该行为的唯一选项。)
这个问题与Tensorflow中张量定义中出现的大小不确定性无关。在Tensorflow的上下文中,张量(数组)可能具有不确定的形状,因此当处理发生时,可以沿特定轴添加更多数据,例如成批添加,在这种情况下,初始张量形状包括一个前导无,以指示数组扩展预计发生的位置。(参见此处的张量形状)
回归问题的条件或者说前提是 1) 收集的数据 2) 假设的模型,即一个函数,这个函数里含有未知的参数,通过学习,可以估计出参数。然后利用这个模型去预测/分类新的数据。 1 线性回归的概念 线性回归假设特征和结果都满足线性。即不大于一次方。收集的数据中,每一个分量,就可以看做一个特征数据。每个特征至少对应一个未知的参数。这样就形成了一个线性模型函数,向量表示形式: 这个就是一个组合问题,
线性回归模型(linear regression) 1.模型定义 给定数据集,$$T={(x{(1)},y{(1)}),(x{(2)},y{(2)}),...,(x{(m)},y{(m)})}$$,其中$$x{(i)}=(1, x_1, x_2, ..., x_n)T\in X= R{n+1}$$,$$y{(i)}\in Y=R$$,线性回归模型试图学到一个通过属性的线性组合来进行预测的函数,即
1 普通线性模型 普通线性模型(ordinary linear model)可以用下式表示: Y = \beta0 + \beta_1 x_1 + \beta_2 x_2 + … + \beta{p-1} x_{p-1} + \epsilon 这里$\beta$是未知参数,$\epsilon$是误差项。普通线性模型主要有以下几点假设: 响应变量$Y$和误差项$\epsilon$均服从正太分
1 二元逻辑回归 回归是一种很容易理解的模型,就相当于y=f(x),表明自变量x与因变量y的关系。最常见问题如医生治病时的望、闻、问、切,之后判定病人是否生病或生了什么病, 其中的望、闻、问、切就是获取的自变量x,即特征数据,判断是否生病就相当于获取因变量y,即预测分类。最简单的回归是线性回归,但是线性回归的鲁棒性很差。 逻辑回归是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型
许多标准的机器学习算法可以归结为凸优化问题。例如,找到凸函数f的一个极小值的任务,这个凸函数依赖于可变向量w(在spark源码中,一般表示为weights)。 形式上,我们可以将其当作一个凸优化问题${min}_{w}f(w)$。它的目标函数可以表示为如下公式 (1): 在上式中,向量x表示训练数据集,y表示它相应的标签,也是我们想预测的值。如果L(w;x,y)可以表示为${w}^{T}x
试图将我的线性回归模型保存到磁盘上,我收到了一个错误:“typeerror:save()接受了2个位置参数,但给出了3个” sc=SparkContext() lr=线性回归(featuresCol='features',labelcol='nextorderindays',maxiter=10,regparam=0.3,ellasticnetparam=0.8) lr_model=LR.FIT(