【问题标题】:Pybrain simple feedforward network not outputting expected valuesPybrain 简单的前馈网络不输出期望值
【发布时间】:2016-03-24 03:23:55
【问题描述】:

我正在尝试使用 pybrain 输出 rgb 值。输入层采用 rgb 值数组,所有隐藏层都是线性模型。我本来希望网络输出 rgb 值。然而,这个网络的输出结果是一个值数组,这些值在 0:255 的范围内并不接近。 这些图像是大约 25 种不同的公牛 .jpg 图像。每个图像都是一个长度为 575280 的扁平数组。我希望网络能够收敛到最终类似于公牛的图像上。

import numpy as np
from pybrain.structure import FeedForwardNetwork, LinearLayer, SigmoidLayer, GaussianLayer, TanhLayer
from pybrain.structure import FullConnection, BiasUnit
import testabull

bull_x = 510
bull_y = 398
bull_flat = 575280

n = FeedForwardNetwork()

bias_unit = BiasUnit()
in_layer = LinearLayer(bull_flat)
hidden_A = LinearLayer(5)
hidden_B = LinearLayer(10)
out_layer = LinearLayer(bull_flat)

n.addInputModule(in_layer)
n.addModule(hidden_A)
n.addModule(hidden_B)
n.addOutputModule(out_layer)
n.addModule(bias_unit)

in_to_hidden = FullConnection(in_layer, hidden_A)
hidden_to_hidden = FullConnection(hidden_A, hidden_B)
hidden_to_out = FullConnection(hidden_B, out_layer)
bias_to_hidden = FullConnection(hidden_B, out_layer)

n.addConnection(in_to_hidden)
n.addConnection(hidden_to_hidden)
n.addConnection(bias_to_hidden)
n.addConnection(hidden_to_out)

n.sortModules()


bull_img_array = testabull.crop_the_bull_images('../../imgs/thebull/')

trainable_array = [] ## an array of flattened images
for im in bull_img_array:
    flat_im = np.array(im).flatten()
    trainable_array.append(flat_im)

print n
print n.activate(trainable_array[0])

output = None
for a in trainable_array:
    output = n.activate(a)
print output, len(output) 

如果有人有任何提示,我将非常感激。

【问题讨论】:

  • print output -> [ 1039728.7439811 -2709035.59004357 181299.70423675 ​​..., -2346161.70897572 2502290.25359657 -404511.8070

标签: python machine-learning neural-network pybrain


【解决方案1】:

首先这里有两个问题,一个是您需要在 0 到 255 之间缩放输出。您可以在之后进行一些转换来做到这一点。通过取最大值和最小值,然后在 0 到 255 之间转置。

另一方面,这个网络可能不会学习你想要的,你的隐藏层使用的是线性层。这不是很有用,因为权重本身形成了线性变换。你基本上会得到一个线性函数。 ftp://ftp.sas.com/pub/neural/FAQ2.html#A_act

我建议对隐藏层使用 SigmoidLayer,这当然会将值压缩在 0 和 1 之间。您可以在输出层中通过乘以 255 来纠正此问题。通过固定层或仅在之后转换值。

【讨论】:

  • 感谢您的帮助。我能够使用 sigmoid 层对 0:255 之间的输出进行归一化。你是对的,网络只是生成一个看起来像随机 RGB 值的图像。使用某种反向传播会帮助我的事业吗?如果我的术语不正确,请原谅。我基本上想知道是否可以将网络的输出与公牛的图像进行比较,计算误差,然后更新权重。这可能会导致图像类似于公牛吗?再次感谢。
  • 不客气,没错,你想使用某种训练算法,反向传播将是一个好的开始。我不知道输出是否类似于公牛,取决于您的训练数据;以及您将处于的局部最小值/最大值。这就是机器学习的美妙之处和野兽 :) Pybrain 有一些培训文档(尽管它的文档不是很好),我已经有一段时间没有使用它了;试一试,看看会发生什么。 pybrain.org/docs/quickstart/training.html
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 2018-12-23
  • 2019-01-15
  • 2019-06-22
  • 2013-02-01
  • 2015-12-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多