- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试构建一个用于预测的递归神经网络。我正在做 PyBrain .
我创建了两个简单的脚本来测试这些想法和技术,然后再将它们实现到更复杂的事情上。
我已尝试尽可能多地遵循经证明有效的代码,即:在 stackoverflow , 和 github .
在第一个示例中,我尝试根据过去值的时间范围预测 sin 值:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""An example of a simple RNN."""
import time
import math
import matplotlib.pyplot as plt
from normalizator import Normalizator
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure.modules import LSTMLayer
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.supervised import RPropMinusTrainer
from pybrain.datasets import SupervisedDataSet
from pybrain.datasets import SequentialDataSet
import pybrain.datasets.sequential
class Network(object):
"""Sieć neuronowa."""
def __init__(self, inputs, hidden, outputs):
"""Just a constructor."""
self.inputs = inputs
self.outputs = outputs
self.hidden = hidden
self.network = self.build_network(inputs, hidden, outputs)
self.norm = Normalizator()
def build_network(self, inputs, hidden, outputs):
"""Builds the network."""
network = buildNetwork(inputs, hidden, outputs,
hiddenclass=LSTMLayer,
#hiddenclass=SigmoidLayer,
outclass=SigmoidLayer,
bias = True,
outputbias=False, recurrent=True)
network.sortModules()
print "Constructed network:"
print network
return network
def train(self, learning_set, max_terations=100):
"""Trains the network."""
print "\nThe network is learning..."
time_s = time.time()
self.network.randomize()
#trainer = RPropMinusTrainer(self.network, dataset=learning_set,
# verbose=True)
learning_rate = 0.05
trainer = BackpropTrainer(self.network, learning_set, verbose=True,
momentum=0.8, learningrate=learning_rate)
errors = trainer.trainUntilConvergence(maxEpochs=max_terations)
#print "Last error in learning:", errors[-1]
time_d = time.time() - time_s
print "Learning took %d seconds." % time_d
return errors, learning_rate
def test(self, data):
"""Tests the network."""
print ("X\tCorrect\tOutput\t\tOutDenorm\tError")
mse = 0.0
outputs = []
#self.network.reset()
for item in data:
x_val = self.norm.denormalize("x", item[0])
sin_val = self.norm.denormalize("sin", item[1])
#get the output from the network
output = self.network.activate(item[0])[0]
out_denorm = self.norm.denormalize("sin", output)
outputs.append(out_denorm)
#compute the error
error = sin_val - out_denorm
mse += error**2
print "%f\t%f\t%f\t%f\t%f" % \
(round(x_val, 2), sin_val, output, out_denorm, error)
mse = mse / float(len(data))
print "MSE:", mse
return outputs, mse
def show_plot(self, correct, outputs, learn_x, test_x,
learning_targets, mse):
"""Plots some useful stuff :)"""
#print "learn_x:", learn_x
#print "test_x:", test_x
#print "output:", outputs
#print "correct:", correct
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(test_x, outputs, label="Prediction", color="red")
ax.plot(test_x, correct, ":", label="Original data")
ax.legend(loc='upper left')
plt.xlabel('X')
plt.ylabel('Sinus')
plt.title('Sinus... (mse=%f)' % mse)
#plot a portion of the learning data
learning_plt = fig.add_subplot(111)
learn_index = int(0.9 * len(learning_targets))
learning_plt.plot(learn_x[learn_index:], learning_targets[learn_index:],
label="Learning values", color="blue")
learning_plt.legend(loc='upper left')
plt.show()
def prepare_data(self):
"""Prepares the data."""
learn_inputs = [round(x, 2) for x in [y * 0.05 for y in range(0, 4001)]]
learn_targets = [math.sin(z) for z in learn_inputs]
test_inputs = [round(x, 2) for x in [y * 0.05 for y in range(4001, 4101)]]
test_targets = [math.sin(z) for z in test_inputs]
self.norm.add_feature("x", learn_inputs + test_inputs)
self.norm.add_feature("sin", learn_targets + test_targets)
#learning_set = pybrain.datasets.sequential.SupervisedDataSet(1, 1)
learning_set = SequentialDataSet(1, 1)
targ_close_to_zero = 0
for inp, targ in zip(learn_inputs, learn_targets):
if abs(targ) < 0.01:
targ_close_to_zero += 1
#if inp % 1 == 0.0:
if targ_close_to_zero == 2:
print "New sequence at", (inp, targ)
targ_close_to_zero = 0
learning_set.newSequence()
learning_set.appendLinked(self.norm.normalize("x", inp),
self.norm.normalize("sin", targ))
testing_set = []
for inp, targ in zip(test_inputs, test_targets):
testing_set.append([self.norm.normalize("x", inp),
self.norm.normalize("sin", targ), inp, targ])
return learning_set, testing_set, learn_inputs, test_inputs, learn_targets
if __name__ == '__main__':
nnetwork = Network(1, 20, 1)
learning_set, testing_set, learning_inputs, testing_inputs, learn_targets = \
nnetwork.prepare_data()
errors, rate = nnetwork.train(learning_set, 125)
outputs, mse = nnetwork.test(testing_set)
correct = [element[3] for element in testing_set]
nnetwork.show_plot(correct, outputs,
learning_inputs, testing_inputs, learn_targets, mse)
至少可以说,结果是悲惨的。
X Correct Output OutDenorm Error
200.050000 -0.847857 0.490775 -0.018445 -0.829411
200.100000 -0.820297 0.490774 -0.018448 -0.801849
200.150000 -0.790687 0.490773 -0.018450 -0.772237
200.200000 -0.759100 0.490772 -0.018452 -0.740648
200.250000 -0.725616 0.490770 -0.018454 -0.707162
这太疯狂了。
第二个类似,基于sun spots数据:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""An example of a simple RNN."""
import argparse
import sys
import operator
import time
from pybrain.tools.shortcuts import buildNetwork
from pybrain.structure import FullConnection
from pybrain.structure.modules import LSTMLayer
from pybrain.structure import LinearLayer, SigmoidLayer
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.supervised import RPropMinusTrainer
from pybrain.datasets import SupervisedDataSet
import pybrain.datasets.sequential
import matplotlib.pyplot as plt
from matplotlib.ticker import FormatStrFormatter
from normalizator import Normalizator
class Network(object):
"""Neural network."""
def __init__(self, inputs, hidden, outputs):
"""Constructor."""
self.inputs = inputs
self.outputs = outputs
self.hidden = hidden
self.network = self.build_network(inputs, hidden, outputs)
self.norm = Normalizator()
def build_network(self, inputs, hidden, outputs):
"""Builds the network."""
network = buildNetwork(inputs, hidden, outputs, bias=True,
hiddenclass=LSTMLayer,
#hiddenclass=SigmoidLayer,
outclass=SigmoidLayer,
outputbias=False, fast=False, recurrent=True)
#network.addRecurrentConnection(
# FullConnection(network['hidden0'], network['hidden0'], name='c3'))
network.sortModules()
network.randomize()
print "Constructed network:"
print network
return network
def train(self, learning_set, max_terations=100):
"""Trains the network."""
print "\nThe network is learning..."
time_s = time.time()
trainer = RPropMinusTrainer(self.network, dataset=learning_set,
verbose=True)
learning_rate = 0.001
#trainer = BackpropTrainer(self.network, learning_set, verbose=True,
# batchlearning=True, momentum=0.8, learningrate=learning_rate)
errors = trainer.trainUntilConvergence(maxEpochs=max_terations)
#print "Last error in learning:", errors[-1]
time_d = time.time() - time_s
print "Learning took %d seconds." % time_d
return errors, learning_rate
def test(self, data):
"""Tests the network."""
print ("Year\tMonth\tCount\tCount_norm\t" +
"Output\t\tOutDenorm\tError")
# do the testing
mse = 0.0
outputs = []
#print "Test data:", data
for item in data:
#month = self.norm.denormalize("month", item[1])
#year = self.norm.denormalize("year", item[2])
year, month = self.norm.denormalize("ym", item[5])
count = self.norm.denormalize("count", item[3])
#get the output from the network
output = self.network.activate((item[1], item[2]))
out_denorm = self.norm.denormalize("count", output[0])
outputs.append(out_denorm)
#compute the error
error = count - out_denorm
mse += error**2
print "%d\t%d\t%s\t%f\t%f\t%f\t%f" % \
(year, month, count, item[3],
output[0], out_denorm, error)
mse /= len(data)
print "MSE:", mse
#corrects = [self.norm.denormalize("count", item[3]) for item in data]
#print "corrects:", len(corrects)
return outputs, mse
def show_plot(self, correct, outputs, learn_x, test_x,
learning_targets, mse):
"""Rysuje wykres :)"""
#print "x_axis:", x_axis
#print "output:", output
#print "correct:", correct
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(test_x, outputs, label="Prediction", color="red")
ax.plot(test_x, correct, ":", label="Correct")
# int(201000.0 / 100)
ax.xaxis.set_major_formatter(FormatStrFormatter('%s'))
ax.legend(loc='upper left')
learn_index = int(0.8 * len(learn_x))
learn_part_x = learn_x[learn_index:]
learn_part_vals = learning_targets[learn_index:]
learning_plt = fig.add_subplot(111)
learning_plt.plot(learn_part_x, learn_part_vals,
label="Learning values", color="blue")
learning_plt.legend(loc='upper left')
plt.xlabel('Year-Month')
plt.ylabel('Values')
plt.title('... (mse=%f)' % mse)
plt.show()
def read_data(self, learnfile, testfile):
"""Wczytuje dane uczące oraz testowe."""
#read learning data
data_learn_tmp = []
for line in learnfile:
if line[1] == "#":
continue
row = line.split()
year = float(row[0][0:4])
month = float(row[0][4:6])
yearmonth = int(row[0])
count = float(row[2])
data_learn_tmp.append([month, year, count, yearmonth])
data_learn_tmp = sorted(data_learn_tmp, key=operator.itemgetter(1, 0))
# read test data
data_test_tmp = []
for line in testfile:
if line[0] == "#":
continue
row = line.split()
year = float(row[0][0:4])
month = float(row[0][4:6])
count = float(row[2])
year_month = int(row[0])
data_test_tmp.append([month, year, count, year_month])
data_test_tmp = sorted(data_test_tmp, key=operator.itemgetter(1, 0))
# prepare data for normalization
months = [item[0] for item in data_learn_tmp + data_test_tmp]
years = [item[1] for item in data_learn_tmp + data_test_tmp]
counts = [item[2] for item in data_learn_tmp + data_test_tmp]
self.norm.add_feature("month", months)
self.norm.add_feature("year", years)
ym = [(years[index], months[index]) for index in xrange(0, len(years))]
self.norm.add_feature("ym", ym, ranked=True)
self.norm.add_feature("count", counts)
#build learning data set
learning_set = pybrain.datasets.sequential.SequentialDataSet(2, 1)
#learning_set = pybrain.datasets.sequential.SupervisedDataSet(2, 1)
# add items to the learning dataset proper
last_year = -1
for item in data_learn_tmp:
if last_year != item[1]:
learning_set.newSequence()
last_year = item[1]
year_month = self.norm.normalize("ym", (item[1], item[0]))
count = self.norm.normalize("count", item[2])
learning_set.appendLinked((year_month), (count))
#build testing data set proper
words = ["N/A"] * len(data_test_tmp)
testing_set = []
for index in range(len(data_test_tmp)):
month = self.norm.normalize("month", data_test_tmp[index][0])
year = self.norm.normalize("year", data_test_tmp[index][3])
year_month = self.norm.normalize("ym",
(data_test_tmp[index][4], data_test_tmp[index][0]))
count = self.norm.normalize("count", data_test_tmp[index][5])
testing_set.append((words[index], month, year,
count, data_test_tmp[index][6], year_month))
#learning_set, testing_set, learn_inputs, test_inputs, learn_targets
learn_x = [element[3] for element in data_learn_tmp]
test_x = [element[3] for element in data_test_tmp]
learn_targets = [element[2] for element in data_learn_tmp]
test_targets = [element[2] for element in data_test_tmp]
return (learning_set, testing_set, learn_x, test_x,
learn_targets, test_targets)
def get_args():
"""Buduje parser cli."""
parser = argparse.ArgumentParser(
description='Trains a simple recurrent neural network.')
parser.add_argument('--inputs', type=int, default=2,
help='Number of input neurons.')
parser.add_argument('--hidden', type=int, default=5,
help='Number of hidden neurons.')
parser.add_argument('--outputs', type=int, default=1,
help='Number of output neurons.')
parser.add_argument('--iterations', type=int, default=100,
help='Maximum number of iteration epoch in training phase.')
parser.add_argument('trainfile', nargs='?', type=argparse.FileType('r'),
default=sys.stdin, help="File with learning dataset.")
parser.add_argument('testfile', nargs='?', type=argparse.FileType('r'),
default=sys.stdin, help="File with testing dataset.")
parser.add_argument('--version', action='version', version='%(prog)s 1.0')
return parser.parse_args()
if __name__ == '__main__':
args = get_args()
nnetwork = Network(args.inputs, args.hidden, args.outputs)
learning_set, testing_set, learn_x, test_x, learn_targets, test_targets = \
nnetwork.read_data(args.trainfile, args.testfile)
errors, rate = nnetwork.train(learning_set, args.iterations)
outputs, mse = nnetwork.test(testing_set)
nnetwork.show_plot(test_targets, outputs,
learn_x, test_x, learn_targets, mse)
而且在这里,我也只看到困惑,因为我没有足够的声望点,所以无法在情节中向您展示。但基本上,预测函数是一个周期性的齿形曲线,与输入或过去的数据没有太大关联。
Year Month Count Count_norm Output OutDenorm Error
2009 9 4.3 0.016942 0.216687 54.995108 -50.695108
2009 10 4.8 0.018913 0.218810 55.534015 -50.734015
2009 11 4.1 0.016154 0.221876 56.312243 -52.212243
2009 12 10.8 0.042553 0.224774 57.047758 -46.247758
2010 1 13.2 0.052009 0.184361 46.790833 -33.590833
2010 2 18.8 0.074074 0.181018 45.942258 -27.142258
2010 3 15.4 0.060678 0.183226 46.502806 -31.102806
我尝试了两种不同的学习算法、隐藏单元的许多组合、学习率、向学习数据集中添加元素的类型,但都无济于事。
我现在完全迷路了。
最佳答案
如果您在输出层使用逻辑激活函数,输出将被限制在 (0,1)
范围内。但是您的 sin 函数提供的输出范围为 (-1,1)
。我认为这就是为什么你的罪恶学习很难收敛到一个小错误。您甚至无法在训练数据中正确预测 sin 函数,对吗?也许您可能需要在训练和测试之前扩展您的输入/输出集。
关于python - 用于预测的循环神经网络无法学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20165669/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
介绍篇 什么是MiniApis? MiniApis的特点和优势 MiniApis的应用场景 环境搭建 系统要求 安装MiniApis 配置开发环境 基础概念 MiniApis架构概述
我正在从“JavaScript 圣经”一书中学习 javascript,但我遇到了一些困难。我试图理解这段代码: function checkIt(evt) { evt = (evt) ? e
package com.fastone.www.javademo.stringintern; /** * * String.intern()是一个Native方法, * 它的作用是:如果字
您会推荐哪些资源来学习 AppleScript。我使用具有 Objective-C 背景的传统 C/C++。 我也在寻找有关如何更好地开发和从脚本编辑器获取更快文档的技巧。示例提示是“查找要编写脚本的
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 6年前关闭。 Improve this
我是塞内加尔的阿里。我今年60岁(也许这是我真正的问题-笑脸!!!)。 我正在学习Flutter和Dart。今天,我想使用给定数据模型的列表(它的名称是Mortalite,请参见下面的代码)。 我尝试
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
学习 Cappuccino 的最佳来源是什么?我从事“传统”网络开发,但我对这个新框架非常感兴趣。请注意,我对 Objective-C 毫无了解。 最佳答案 如上所述,该网站是一个好地方,但还有一些其
我正在学习如何使用 hashMap,有人可以检查我编写的这段代码并告诉我它是否正确吗?这个想法是有一个在公司工作的员工列表,我想从 hashMap 添加和删除员工。 public class Staf
我正在尝试将 jQuery 与 CoffeScript 一起使用。我按照博客中的说明操作,指示使用 $ -> 或 jQuery -> 而不是 .ready() 。我玩了一下代码,但我似乎无法理解我出错
还在学习,还有很多问题,所以这里有一些。我正在进行 javascript -> PHP 转换,并希望确保这些做法是正确的。是$dailyparams->$calories = $calories;一条
我目前正在学习 SQL,以便从我们的 Magento 数据库制作一个简单的 RFM 报告,我目前可以通过导出两个查询并将它们粘贴到 Excel 模板中来完成此操作,我想摆脱 Excel 模板。 我认为
我知道我很可能会因为这个问题而受到抨击,但没有人问,我求助于你。这是否是一个正确的 javascript > php 转换 - 在我开始不良做法之前,我想知道这是否是解决此问题的正确方法。 JavaS
除了 Ruby-Doc 之外,哪些来源最适合获取一些示例和教程,尤其是关于 Ruby 中的 Tk/Tile?我发现自己更正常了 http://www.tutorialspoint.com/ruby/r
我只在第一次收到警告。这正常吗? >>> cv=LassoCV(cv=10).fit(x,y) C:\Python27\lib\site-packages\scikit_learn-0.14.1-py
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!