我正在学习神经网络,最近我有了这样的想法:尝试给出函数$f(x) = 2x$的NN训练数据。问题是,神经网络能否准确地预测它必须将输入数加倍才能给出正确的输出?
这只是一次“心理锻炼”,让我更好地理解NNs的工作原理。
我的Python代码不起作用,下面是我尝试过的:
神经网络类:
import numpy as np
class NeuralNetwork:
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
self.lr = learningrate
self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
def train(self, inputs_list, targets_list):
inputs = np.array(inputs_list, ndmin=2).T
targets = np.array(targets_list, ndmin=2).T
hidden_outputs = np.dot(self.wih, inputs)
final_outputs = np.dot(self.who, hidden_outputs)
output_errors = targets - final_outputs
hidden_errors = np.dot(self.who.T, output_errors)
self.who += self.lr * np.dot(
(output_errors * final_outputs * (1.0 - final_outputs)),
np.transpose(hidden_outputs)
)
self.wih += self.lr * np.dot(
(hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
np.transpose(inputs)
)
def query(self, inputs_list):
inputs = np.array(inputs_list, ndmin=2).T
hidden_outputs = np.dot(self.wih, inputs)
final_outputs = np.dot(self.who, hidden_outputs)
return final_outputs培训网络并预测价值:
input_nodes = 1
hidden_nodes = 20
output_nodes = 1
learning_rate = 0.3
nn = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
for i in range(10):
i += 1
inputs = np.log(i)
targets = np.log(2*i)
nn.train(inputs, targets)
print(nn.query(np.asfarray([4])))下面是我试图运行这段代码的输出:
x.py:26: RuntimeWarning: overflow encountered in multiply
(output_errors * final_outputs * (1.0 - final_outputs)),
x.py:31: RuntimeWarning: overflow encountered in multiply
(hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
[[nan]]我真的不知道如何解释这个问题,也不知道我的设计对这个应用程序是否正确。任何帮助都将不胜感激。
谢谢。
发布于 2020-05-22 14:31:13
一些建议:
由于兴趣函数(
f(x)=2x)是线性的,只需要一个权重,我们就可以通过1层权重和0层隐藏层来极大地简化网络。我们正在调试一个问题,所以我们应该尽可能地简化,以消除错误的来源。使用包含多个隐节点的隐层意味着我们需要寻找矩阵,因为我们寻找函数weights.W1.dot(W2)=2 --感兴趣的函数是线性的,我们知道,任何非线性函数的使用都是分散注意力的。此外,乙状结肠和tanh函数的饱和,或垂死的ReLU现象,也会给优化动力学带来额外的问题,从而阻碍我们取得进展。看:https://stats.stackexchange.com/questions/301285/what-is-vanishing-gradient发布于 2020-05-22 12:53:37
我认为你在人工神经网络体系结构中缺少了一个非常重要的部分/构建块,这个块被称为激活函数,它试图将输出在0,1或-1之间正常化,所以我认为在计算每个隐藏层输出后附加一个激活函数(这是非常重要的)可以解决这个问题,因为数据传播网络将保持规范化值,例如0,1之间,因此可能不会发生溢出。
备注
。
https://stackoverflow.com/questions/61955266
复制相似问题