为什么RNN总是输出1

2024-02-09

我使用循环神经网络 (RNN) 进行预测,但由于某些奇怪的原因,它总是输出 1。这里我用一个玩具示例对此进行解释:

Example考虑一个矩阵M维度 (360, 5) 和一个向量Y其中包含 rowsumM。现在,使用 RNN,我想预测Y from M. Using rnn R包,我将模型训练为

   library(rnn) 
    M <- matrix(c(1:1800),ncol=5,byrow = TRUE) # Matrix (say features) 
    Y <- apply(M,1,sum) # Output equls to row sum of M
    mt <- array(c(M),dim=c(NROW(M),1,NCOL(M))) # matrix formatting as [samples, timesteps, features]
    yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) # formatting
    model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=1000) # training

我在训练时观察到的一件奇怪的事情是历元误差始终是 4501。理想情况下,历元误差应该随着历元的增加而减少。

接下来,我创建了一个与上述结构相同的测试数据集,如下所示:

M2 <- matrix(c(1:15),nrow=3,byrow = TRUE)
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2)))
predictr(model,mt2)

通过预测,我总是得到输出 1。 持续的纪元误差和相同的输出可能是什么原因?

更新#1

@Barker 提供的答案对我的问题不起作用。为了使其开放,我在这里通过保管箱链接共享简约数据训练数据 https://www.dropbox.com/s/6u4dsjkfbef9pxl/train.csv?dl=0, 测试数据 https://www.dropbox.com/s/nnmdvppvs1xfkii/test.csv?dl=0, 和我的R代码为.

数据详细信息:“功率”列是响应变量,它是温度、湿度和前几天从第 1 天到第 14 天消耗的功率的函数。

normalize_data <- function(x){
  normalized = (x-min(x))/(max(x)-min(x))
  return(normalized)
}

#read test and train data
traindat <- read.csv(file = "train.csv")
testdat <- read.csv(file = "test.csv")
# column "power" is response variable and remaining are predictors
# predictors in  traindata
trainX <- traindat[,1:dim(traindat)[2]-1]
# response of train data
trainY <- traindat$power
# arrange data acc. to RNN as [samples,time steps, features]
tx <- array(as.matrix(trainX), dim=c(NROW(trainX), 1, NCOL(trainX)))
tx <- normalize_data(tx) # normalize data in range of [0,1]
ty <- array(trainY, dim=c(NROW(trainY), 1, NCOL(trainY))) # arrange response acc. to predictors
# train model
model <- trainr(X = tx, Y = ty, learningrate = 0.08, hidden_dim = 6, numepochs = 400)

# predictors in test data
testX <- testdat[,1:dim(testdat)[2]-1]
testX <- normalize_data(testX) # normalize data in range of [0,1]
#testY <- testdat$power
# arrange data acc. to RNN as [samples,time steps, features]
tx2 <- array(as.matrix(testX), dim=c(NROW(testX), 1, NCOL(testX))) # predict
pred <- predictr(model,tx2)
pred

我改变了参数learning rate, hidden_dim, numepochs,但结果仍然是 0.9 或 1。


大多数 RNN 不喜欢没有恒定均值的数据。处理这个问题的一种策略是区分数据。要了解这是如何工作的,让我们使用一个基础R时间序列co2。这是一个具有良好平滑季节性和趋势的时间序列,因此我们应该能够对其进行预测。

对于我们的模型,我们的输入矩阵将是“季节性”和“趋势”co2时间序列,使用创建stl分解。因此,让我们像之前一样制作训练和测试数据并训练模型(注意我减少了numepochs对于运行时)。我将使用最近一年半的所有数据进行训练,然后使用最近一年半的数据进行测试:

#Create the STL decomposition
sdcomp <- stl(co2, s.window = 7)$time.series[,1:2]

Y <- window(co2, end = c(1996, 6))
M <- window(sdcomp, end = c(1996, 6))
#Taken from OP's code
mt <- array(c(M),dim=c(NROW(M),1,NCOL(M)))
yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y))) 
model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=100)

现在我们可以对去年的测试数据进行预测:

M2 <- window(sdcomp, start = c(1996,7))
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2)))
predictr(model,mt2)

output:
      [,1]
 [1,]    1
 [2,]    1
 [3,]    1
 [4,]    1
 [5,]    1
 [6,]    1
 [7,]    1
 [8,]    1
 [9,]    1
[10,]    1
[11,]    1
[12,]    1
[13,]    1
[14,]    1
[15,]    1
[16,]    1
[17,]    1
[18,]    1

哎呀,又是全一,就像你的例子一样。现在让我们再试一次,但这次我们将对数据进行差异化。由于我们试图在一年半后进行预测,因此我们将使用 18 作为差分滞后,因为这些是我们提前 18 个月知道的值。

dco2 <- diff(co2, 18)
sdcomp <- stl(dco2, s.window = "periodic")$time.series[,1:2]
plot(dco2)

太好了,趋势现在已经消失了,所以我们的神经网络应该能够更好地找到模式。让我们用新数据再试一次。

Y <- window(dco2, end = c(1996, 6))
M <- window(sdcomp, end = c(1996, 6))

mt <- array(c(M),dim=c(NROW(M),1,NCOL(M)))
yt <- array(c(Y),dim=c(NROW(M),1,NCOL(Y)))
model <- trainr(X=mt,Y=yt,learningrate=0.5,hidden_dim=10,numepochs=100)

M2 <- window(sdcomp, start = c(1996,7))
mt2 <- array(c(M2),dim=c(NROW(M2),1,NCOL(M2)))
(preds <- predictr(model,mt2))

output:
              [,1]
 [1,] 9.999408e-01
 [2,] 9.478496e-01
 [3,] 6.101828e-08
 [4,] 2.615463e-08
 [5,] 3.144719e-08
 [6,] 1.668084e-06
 [7,] 9.972314e-01
 [8,] 9.999901e-01
 [9,] 9.999916e-01
[10,] 9.999916e-01
[11,] 9.999916e-01
[12,] 9.999915e-01
[13,] 9.999646e-01
[14,] 1.299846e-02
[15,] 3.114577e-08
[16,] 2.432247e-08
[17,] 2.586075e-08
[18,] 1.101596e-07

好吧,现在有东西了!让我们看看它与我们试图预测的相比如何,dco2:

并不理想,但我们正在寻找数据的一般“上下”模式。现在,您所要做的就是调整您的学习率,并开始使用所有这些可爱的超参数进行优化,这些超参数使神经网络的使用变得如此愉快。当它按照您想要的方式工作时,您只需获取最终输出并添加回过去 18 个月的训练数据即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么RNN总是输出1 的相关文章

  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 无法获取未知等级的 Shape 长度

    我有一个神经网络 来自tf data数据生成器和tf keras模型 如下 简化版本 因为太长 dataset A tf data Dataset反对与next x方法调用get next为了x train迭代器和next y方法调用get
  • 如何对数字进行四舍五入并使其显示零?

    R 中将数字四舍五入到小数点后 2 位的常用代码是 gt a 14 1234 gt round a digits 2 gt a gt 14 12 但是 如果该数字的前两位小数位为零 则 R 会在显示中抑制零 gt a 14 0034 gt
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • 将字符串列拆分为多个虚拟变量

    作为 R 中 data table 包的相对缺乏经验的用户 我一直在尝试将一个文本列处理为大量指示符列 虚拟变量 每列中的 1 表示特定的子字符串是在字符串列中找到 例如我想处理这个 ID String 1 a b 2 b c 3 c 进入
  • R 可以创建带有可单击条形图的条形图图像以插入网页吗?

    我知道如何创建条形图 以及如何将其粘贴在网页上 例如 使用hwriteImage in the 作家包 http www embl de gpau hwriter 我想要的是每个栏都是一个在鼠标悬停时突出显示的区域 并且每个栏在单击时都有不
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • 如何在 data.table 中分组后使用条件计算行数

    我有以下数据框 dat lt read csv s1 s2 v1 v2 a b 10 20 a b 22 NA a b 13 33 c d 3 NA c d 4 5 NA c d 10 20 dat gt A tibble 6 x 4 gt
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • 如何在 Shiny 中提取动态生成的输入值?

    我正在创建一个闪亮的应用程序 它将根据客户的不同功能为客户生成分数 在我闪亮的应用程序中 我提供了 checkboxGroupInput 来选择所需的功能 根据所选功能 应用程序将动态地将 numericInput 添加到 Web ui 以
  • 如何在 R 中的 for 循环内将值存储在向量中

    我正在开始使用 R 但我对以下问题感到非常沮丧 我试图将 for 循环内完成的某些计算的值存储到我之前定义的向量中 问题是如何进行索引 因为for循环迭代代码的次数取决于用户的输入 所以变量i不一定要从1开始 它可以从80开始 for举个例
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • 如何声明包含 M 个元素的列表对象

    我想声明一个包含 M 3 x 3 矩阵的列表 如果我事先知道数字 M 那么我可以通过以下方式声明这样的列表 elm lt matrix NA 3 3 Say M 7 myList lt list elm elm elm elm elm el
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • R,使用具有两种以上可能性的二项式分布

    我知道这可能是基本的 但我似乎有一个心理障碍 假设您想要计算在一个骰子上掷出 4 5 或 6 的概率 在 R 中 这很简单 sum 1 6 1 6 1 6 这给出了 1 2 这是正确答案 然而 我内心深处 可能应该保留的地方 认为我应该能够
  • R Shinydashboard 自定义 CSS 到 valueBox

    我一直在尝试将 valueBox 的颜色更改为自定义颜色 超出 validColors 中可用的颜色 但一直无法这样做 我知道有一种方法可以使用标签来包含自定义 CSS 但是我无法将它们放在正确的位置 ui lt dashboardPage
  • Keras model.predict 函数给出输入形状错误

    我已经在 Tensorflow 中实现了通用句子编码器 现在我正在尝试预测句子的类概率 我也将字符串转换为数组 Code if model model type universal classifier basic class probs
  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • ggplot:如何限制条形图中的输出,以便仅显示最频繁出现的情况?

    我几个小时以来一直在寻找这个简单的东西 但没有结果 我有一个数据框 其中一列为变量 国家 地区 我想要两件事以下 绘制最常见的国家 地区 最常见的位于顶部 找到部分解决方案EDIT找到完整的解决方案 gt gt 重点问题是根据频率限制条形图

随机推荐

  • 如何创建这样的渐变进度指示器?

    我注意到基本的CircularProgressIndicator小部件有很少的参数来定制它 我想要达到像 gif 上那样的结果 不幸的是 我的知识不足以从头开始创建这样一个指标 在 pub dev 上搜索没有带来任何结果 Make a Cu
  • PHP 返回错误 500,但没有记录任何内容

    当我有一个 php 应用程序返回内部服务器错误 500 但错误日志中没有显示任何内容时 我遇到了问题 现在我知道我正在尝试运行的内容有错误 我知道我丢失了一些文件以及什么没有 但是 apache 错误日志中应该显示一些内容 否则我应该如何确
  • 使用 opencv 3.0 的 cv2 中的 KNN train()

    我正在尝试使用 cv2 python 2 7 和 opencv 3 0 运行 k 最近邻 我使用类似的代码复制了相同的错误消息http docs opencv org 3 0 beta doc py tutorials py ml py k
  • 使用 AWS SimpleDB 从 Java Servlet 创建域

    我是一名大学生 正在从事一个研究项目 该项目涉及将 Web 应用程序迁移到亚马逊云 上学期我一直在研究 servlet 并且能够使用 Tomcat 中运行的 java servlet 来实现应用程序的大部分功能 我现在正在尝试集成 Amaz
  • 将 TYPO3 extbase storagePageIds / storagePid 设置为当前

    我正在使用 TYPO3 扩展 feupload 它依赖于 extbase 这是我第一次接触extbase 但问题是关于 extbase 的 我希望 TYPO3 在查询中默认包含通常的 IN 当前页面 pid 检查 除非另有说明 但在 ext
  • AngularJS 上传文件并将其发送到数据库

    我一直在努力得到ng文件上传 https github com danialfarid ng file upload工作 以便我可以上传图像并将它们发送到数据库 在我的例子中是mongoLab http mongolab com接受 JSO
  • vue-devtools 总是被 nuxt.js 禁用

    我正在使用 nuxt js 创建一个新项目v2 3 0 当我跑步时npm run dev在我的 IDE 控制台中 一切都可以正确编译 但是当我转到该页面时 出现以下错误 Nuxt js Vue js is detected on this
  • Python - 检查两个单词是否在字符串中

    我想检查Python数组的每个元素中是否有两个单词 汽车 和 摩托车 我知道如何检查一个单词in但不知道如何用两个词来做 非常感谢任何帮助 两字解决方案 for string in array if car in string and mo
  • 如何在 SharePoint 2010 中获取服务应用程序权限

    在 SharePoint 2010 中读取特定服务应用程序的帐户权限的最佳 最简单方法是什么 目前我一直在搞乱 var solution SPFarm Local Solutions Service App Name wsp var sol
  • Spark 任务无法使用滞后窗口函数进行序列化

    我注意到 在 DataFrame 上使用 Window 函数后 如果我使用函数调用 map Spark 将返回 任务不可序列化 异常 这是我的代码 val hc org apache spark sql hive HiveContext n
  • 将键值对列表转换为哈希表

    将列表转换为哈希表的最佳方法是什么 假设我有一个像这样的列表 Key value Key2 value2 将其转换为哈希表的最短语法是什么 尝试以下操作 table new object System Collections Hashtab
  • GORM 域类属性默认值

    也许是一个愚蠢的问题 但我应该在哪里 如何定义 GORM 域类属性的默认值 例如 当我创建一个新的 Company 对象实例时 我希望属性国家 地区的默认值为 美国 我想我可以在创建控制器中做到这一点 但它看起来有点脏 就像是 def cr
  • 搜索 youtube 并在我的网站上显示结果

    如何从我的网站搜索 YouTube 并将结果显示在同一页面下方 我已经设法使用以下代码添加搜索功能
  • 在nds的子屏幕上绘制图像

    我对 libdns 完全陌生 我尝试更改示例 Graphics Backgrounds 256 color bmp 在子屏幕上显示背景 这是我的代码 您知道在子屏幕上显示 hey typBitmap 缺少什么吗 我已经设法在顶部屏幕上显示新
  • 加载后 JavaScript 不会执行

    我的网站包含链接 当我点击一次时 目标 HTML 内容会使用 JQuery 加载到 div 中 到目前为止没有问题 我的问题是 当第三次加载下面的搜索页面时 脚本将不会执行 h1 span Search span h1 p class bi
  • 在 Shiny App 中显示 HTML 文件

    是否可以在 Shiny 应用程序 在主面板中 中显示 html 文件 该 HTML 是由 SAS 代码创建的 但我想在 Shiny 应用程序中显示 这不是一个小图像 这是 HTML 文件中的表格输出 Html 文件包含 tabele 如下所
  • 删除 Bootstrap 3 导航中的品牌

    首先 我已经访问了具有相同问题的其他主题 但没有给我任何答案 这是 Bootstrap 3 导航 正如您在左侧看到的 那里有一个 品牌 文本 用于在我删除的源中删除它 a class navbar brand href Brand a 结果
  • 如何调试 Spring MVC url 映射?

    我正在使用 Spring MVC 3 并且遇到 URL 映射问题 我有一个方法 Controller public class DocumentController RequestMapping value docs pupil class
  • 使用 Greasemonkey 删除表

    我正在尝试使用油脂猴子用我自己的桌子替换桌子 拥有该表的页面有 2 个具有相同类且没有 ID 的表 我只需要替换第二个表 用我自己的表 并且对第一个表不执行任何操作 没有什么可以真正使第二个表与第一个表不同 所以我唯一能想到的就是尝试在第二
  • 为什么RNN总是输出1

    我使用循环神经网络 RNN 进行预测 但由于某些奇怪的原因 它总是输出 1 这里我用一个玩具示例对此进行解释 Example考虑一个矩阵M维度 360 5 和一个向量Y其中包含 rowsumM 现在 使用 RNN 我想预测Y from M