- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图最初使用一个小数据集(仅用于 POC)在 tensorflow.js 中创建一个示例前馈神经网络。有 5 个输入节点和 1 个输出节点。数据与住房相关,有多种输入,我们正在预测价格。
x_train:
[ [ 79545.45857, 5.682861322, 7.009188143, 4.09, 23086.8005 ],
[ 79248.64245, 6.002899808, 6.730821019, 3.09, 40173.07217 ],
[ 61287.06718, 5.86588984, 8.51272743, 5.13, 36882.1594 ],
[ 63345.24005, 7.188236095, 5.586728665, 3.26, 34310.24283 ],
[ 59982.19723, 5.040554523, 7.839387785, 4.23, 26354.10947 ],
...
]
y_train
[ [ 1059033.558 ],
[ 1505890.915 ],
[ 1058987.988 ],
[ 1260616.807 ],
[ 630943.4893 ],
...
]
const model = tf.sequential();
const config_hidden = {
inputShape: [5],
activation: 'sigmoid',
units: 6
}
const config_output = {
units: 1,
activation: 'sigmoid'
}
const hidden = tf.layers.dense(config_hidden);
const output = tf.layers.dense(config_output);
model.add(hidden);
model.add(output);
const optimizer = tf.train.sgd(0.5);
const config = {
optimizer: optimizer,
loss: 'meanSquaredError',
metrics: ['accuracy']
}
model.compile(config);
train_data().then(function () {
console.log('Training is Complete');
}
async function train_data() {
const options = {
shuffle: true,
epochs: 10,
batch_size: 100,
validationSplit: 0.1
}
for (let i = 0; i < 10; i++) {
const res = await model.fit(xs, ys, options);
console.log(res.history.loss[0]);
}
}
模型编译良好。但训练模型时的损失是巨大的
Model Successfully Compiled
Epoch 1 / 10
eta=0.0 ====================================================================>
1058ms 235us/step - acc=0.00 loss=1648912629760.00 val_acc=0.00 val_loss=1586459705344.00
Epoch 2 / 10
eta=0.0 ====================================================================>
700ms 156us/step - acc=0.00 loss=1648913285120.00 val_acc=0.00 val_loss=1586459705344.00
Epoch 3 / 10
eta=0.0 ====================================================================>
615ms 137us/step - acc=0.00 loss=1648913022976.00 val_acc=0.00 val_loss=1586459705344.00
Epoch 4 / 10
eta=0.0 ====================================================================>
852ms 189us/step - acc=0.00 loss=1648913285120.00 val_acc=0.00 val_loss=1586459705344.00
我认为这可能是因为训练数据没有标准化。所以我取了数据的平均值并除以它
xs = xs.div(xs.mean(0));
x_train
[[1.1598413, 0.9507535, 1.003062 , 1.0272969, 0.6384002],
[1.1555134, 1.0042965, 0.9632258, 0.7761241, 1.1108726],
[0.8936182, 0.9813745, 1.2182286, 1.2885166, 1.0198718],
...,
损失没有太大变化
Model Successfully Compiled
Epoch 1 / 10
eta=0.0 ====================================================================>
841ms 187us/step - acc=0.00 loss=1648912760832.00 val_acc=0.00 val_loss=1586459705344.00
Epoch 2 / 10
eta=0.0 ====================================================================>
613ms 136us/step - acc=0.00 loss=1648913154048.00 val_acc=0.00 val_loss=1586459705344.00
Epoch 3 / 10
eta=0.0 ====================================================================>
646ms 144us/step - acc=0.00 loss=1648913022976.00 val_acc=0.00 val_loss=1586459705344.00
然后我也标准化了输出,
ys = ys.div(1000000);
Model Successfully Compiled
Epoch 1 / 10
eta=0.0 ====================================================================>
899ms 200us/step - acc=0.00 loss=0.202 val_acc=0.00 val_loss=0.161
Epoch 2 / 10
eta=0.0 ====================================================================>
667ms 148us/step - acc=0.00 loss=0.183 val_acc=0.00 val_loss=0.160
Epoch 3 / 10
eta=0.0 ====================================================================>
609ms 135us/step - acc=0.00 loss=0.182 val_acc=0.00 val_loss=0.159
这使得损失减少到小数点。然而可以看出,即使在训练数据上运行 10000 次迭代也不会显着降低损失。例如
Epoch 8 / 10
eta=0.0 ====================================================================>
502ms 112us/step - acc=0.00 loss=0.181 val_acc=0.00 val_loss=0.158
Epoch 9 / 10
eta=0.0 ====================================================================>
551ms 122us/step - acc=0.00 loss=0.181 val_acc=0.00 val_loss=0.158
Epoch 10 / 10
eta=0.0 ====================================================================>
470ms 104us/step - acc=0.00 loss=0.181 val_acc=0.00 val_loss=0.158
0.18076679110527039
最终损失从 0.202 左右开始,下降到 0.180 左右。这会导致错误的预测。
这是一个非常常见的场景。具有不同范围值的多个输入(例如上面使用的住房数据)。多个输入传递到前馈神经网络。预计只有一个输出(本例中为价格)。
问题:1.上面的代码我做错了什么?2. 我是否以正确的方式标准化数据?3.我是否使用了正确的损失函数/优化器/学习率/激活等?4. 如何知道模型表现是否良好5.在tensorflow.js中还有其他方法可以做到这一点吗?
最佳答案
由于 S 形激活,我假设您没有尝试线性回归。如果您正在尝试线性回归,请删除各处的 sigmoidal 激活。将尝试解决我看到的所有错误:
从输出中删除 sigmoid 激活。 sigmoid 函数将输入压缩到 0 到 1 之间,因此它不适用于回归。您的最后一层不需要激活。
你的学习率太高了,所以我怀疑学习算法是否能够收敛。从 0.001 - 0.01 左右的值开始,并根据需要进行调整。
不,你没有正确标准化。通常,数据被归一化为均值为零和标准差为一。这是针对每个特征列完成的,仅使用该列的平均值和标准差,而不是所有数据。例如,特征列 x
中的 i
的公式如下:(x_i - x.mean())/x.std()
。 (我不懂javascript)
您提供的性能指标“准确性”用于分类,而不是回归,并且毫无意义(如果提供的话)。最小化均方误差或绝对平方误差是量化模型性能的最佳方法。
关于tensorflow - 最小化前馈神经网络的tensorflow.js中的损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56016743/
前一段时间写过一篇文章《 实战,一个高扩展、可视化低代码前端,详实、完整 》,得到了很多朋友的关注。 其中的逻辑编排部分过于简略,不少朋友希望能写一些关于逻辑编排的内容,本文就详细讲述一下逻辑
我正在尝试以下 Java 片段: int[] testArray={10,20,30,40}; int i= 0; testArray[i++]= testArray[i++]+1; System.o
我想知道我是否可以通过某种方式在 C++ 中进行前/后函数调用。我有一个包含很多函数的包装器类,在每次调用包装器函数后,我应该调用另一个始终相同的函数。 所以我不想像这样对每个函数调用 postFun
我有一个像这样的头文件: #pragma once #include "gamestate.h" #include "ExitListener.h" class InitialGameState :
学习左值和右值。定义是任何可以是“地址”的东西都是左值,否则就是右值。 我检查了运算符的优先级,前缀和后缀增量都比“地址”运算符具有更高的优先级。 对于下面的两个例子,谁能解释一下为什么第一个“&++
在我的学习过程中,我遇到了前后迭代器,我想知道是否有办法让它们就地创建容器元素。从文档来看,容器似乎需要实现 push_back 函数才能与 back_iterator 一起使用。但是有没有一种方法可
我有两个关于 Java 中运算符优先级的类似问题。 第一个: int X = 10; System.out.println(X++ * ++X * X++); //it prints 1440 根据
请放轻松,不要对我开枪,因为我还是新手。 当我运行这段代码时,我完全糊涂了,终生无法弄清楚为什么: int y = 9; cout << "++y = " << ++y << "\n--y = " <
两种表达方式有区别吗: (*x)++ 和 ++(*x) 我可以看到这两个语句都替换了 *x 中 (*x+1) 的内容。但是它们之间有什么区别吗? 最佳答案 (*x)++ 计算为*x的值;作为副作用,*
我有一个如下所示的数据集: Date CONSUMER DISCR CONSUMER STAPLES ENERGY FINANCIALS HEALTH CARE
我希望检查名称字段中输入的前两个字符是否为字母 - 除此之外没有什么区别(空格、'、- 等都是公平的游戏)。这是我到目前为止所拥有的,但它不起作用。想法?谢谢! if (document.form01
我制作了一个简单的脚本,为像素和所有附近的像素着色为相同的颜色 Click foto
我需要编写一个循环,以下列格式输出从昨天算起的最近 30 天: 2014-02-02 2014-02-03 2014-02-04 ... 2014-03-04 我想我需要像这样使用循环: for ($
我正在做一些练习,但我对这个感到困惑: public static int f (int x, int y) { int b=y--; while (b>0) { if (x%2!=0
我需要一个 4 个字符的正则表达式。前 3 个字符必须是数字,最后 1 个字符必须是字母或数字。 我形成了这个,但它不起作用 ^([0-9]{3}+(([a-zA-Z]*)|([0-9]*)))?$
我需要编写一个循环,以下列格式输出从昨天算起的最近 30 天: 2014-02-02 2014-02-03 2014-02-04 ... 2014-03-04 我想我需要像这样使用循环: for ($
我有下面的程序,我试图找到前 1000 个素数的总和。在代码中,解决方案1和2有什么区别?为什么我不应该将 count 变量放在 if 条件之外?如果我把变量放在 if 之外,我显然没有得到我需要的答
这个问题在这里已经有了答案: Replace First N Occurrences in the String (7 个答案) 关闭 4 年前。 我有一个如下的字符串 const str = '_
我正在尝试测量以纳秒为单位的平均访问延迟,但在第一次迭代后我收到“段错误(核心转储)”。我错过了什么吗?我是否滥用了指针。这是导致错误的函数: #include #include #include
我有一个 SQL 问题 (MySQL)。我如何从下表创建一个新表(表名称:“well_master_prod_inj”)。 我需要按井名和日期聚合数据。我希望每个井名只有一行数据以及显示以下数据的列:
我是一名优秀的程序员,十分优秀!