Python 3.x 神经网络预测n次方
我试图用多层神经网络来预测n次方 我有以下包含前99个方块的训练数据Python 3.x 神经网络预测n次方,python-3.x,machine-learning,tensorflow,neural-network,artificial-intelligence,Python 3.x,Machine Learning,Tensorflow,Neural Network,Artificial Intelligence,我试图用多层神经网络来预测n次方 我有以下包含前99个方块的训练数据 1 1 2 4 3 9 4 16 5 25 ... 98 9604 99 9801 代码如下: import numpy as np import neurolab as nl # Load input data text = np.loadtxt('data_sq.txt') # Separate it into datapoints and labels data = text[
1 1
2 4
3 9
4 16
5 25
...
98 9604
99 9801
代码如下:
import numpy as np
import neurolab as nl
# Load input data
text = np.loadtxt('data_sq.txt')
# Separate it into datapoints and labels
data = text[:, :1]
labels = text[:, 1:]
# Define a multilayer neural network with 2 hidden layers;
# First hidden layer consists of 10 neurons
# Second hidden layer consists of 6 neurons
# Output layer consists of 1 neuron
nn = nl.net.newff([[0, 99]], [10, 6, 1])
# Train the neural network
error_progress = nn.train(data, labels, epochs=2000, show=10, goal=0.01)
# Run the classifier on test datapoints
print('\nTest results:')
data_test = [[100], [101]]
for item in data_test:
print(item, '-->', nn.sim([item])[0])
它为第100和第101个正方形打印1:
Test results:
[100] --> [ 1.]
[101] --> [ 1.]
正确的方法是什么?检查了neurolab的文档-默认情况下,在所有神经元中创建具有传递功能的神经网络。Sigmoid值始终在
(-1;1)
范围内,因此您的输出将永远不会离开此范围
第二个方块(4)已超出此范围,因此您的代码与您的问题根本不匹配
尝试使用其他功能(我建议)。它们与前馈网络配合得很好,允许反向传播训练(因为它们在整个域中是可派生的),并且具有范围(0,∞)代码>,如您所需
另外:newff的第一个参数定义输入数据的范围-您使用的[0,99]匹配所有训练数据,但不匹配您在测试时尝试的值(因为100和101大于99)。将此值更改为更大的值,这样您测试的值就不是“特殊的”(意思是“在范围的末尾”)-我会提出类似于[-300300]
的建议
此外,正如Seanny123在评论中所说的,我认为它根本不起作用,但以目前的设置,我可以肯定。祝你好运。如果你成功了,请告诉我(例如在评论中)
最后,但并非最不重要的一点是,您试图做的是外推(根据某个范围内的值计算出该范围外的值)。NN更适合于插值(根据该范围内的样本计算出该范围内的值),因为他们应该概括训练中使用的数据。试着教它平方,例如,每三个平方(所以1,16,49,…),然后通过要求其他平方(例如要求平方2或8)进行测试.根据菲利普·马尔扎克和肖尼123的建议和评论,我在tensorflow中实现了一个神经网络,以检查当我们试图教它预测(和插值)二次方时会发生什么
连续间歇训练
我在区间[-7,7](在此区间内取300点,使其连续)上训练网络,然后在区间[-30,30]上测试它。激活函数为ReLu,网络有3个隐藏层,每个层的大小为50。epochs=500。结果如下图所示。
因此,基本上,在区间[-7,7]内(也接近于区间[-7,7]),拟合是非常完美的,然后在区间外大致呈线性继续。很高兴看到,至少在最初,网络输出的斜率尝试“匹配”x^2
的斜率。如果我们增加测试间隔,两个图会出现很大的差异,如下图所示:
偶数训练
最后,如果我在区间[-100100]内的所有偶数整数集合上训练网络,并将其应用于该区间内的所有整数集合(偶数和奇数),则得到:
当训练网络生成上面的图像时,我将历元数增加到2500以获得更高的精度。其余参数保持不变。因此,在训练间隔内进行插值似乎效果很好(可能除了0附近的区域,拟合稍差)
下面是我在第一个图中使用的代码:
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.python.framework.ops import reset_default_graph
#preparing training data
train_x=np.linspace(-7,7,300).reshape(-1,1)
train_y=train_x**2
#setting network features
dimensions=[50,50,50,1]
epochs=500
batch_size=5
reset_default_graph()
X=tf.placeholder(tf.float32, shape=[None,1])
Y=tf.placeholder(tf.float32, shape=[None,1])
weights=[]
biases=[]
n_inputs=1
#initializing variables
for i,n_outputs in enumerate(dimensions):
with tf.variable_scope("layer_{}".format(i)):
w=tf.get_variable(name="W",shape=[n_inputs,n_outputs],initializer=tf.random_normal_initializer(mean=0.0,stddev=0.02,seed=42))
b=tf.get_variable(name="b",initializer=tf.zeros_initializer(shape=[n_outputs]))
weights.append(w)
biases.append(b)
n_inputs=n_outputs
def forward_pass(X,weights,biases):
h=X
for i in range(len(weights)):
h=tf.add(tf.matmul(h,weights[i]),biases[i])
h=tf.nn.relu(h)
return h
output_layer=forward_pass(X,weights,biases)
cost=tf.reduce_mean(tf.squared_difference(output_layer,Y),1)
cost=tf.reduce_sum(cost)
optimizer=tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
#train the network
for i in range(epochs):
idx=np.arange(len(train_x))
np.random.shuffle(idx)
for j in range(len(train_x)//batch_size):
cur_idx=idx[batch_size*j:batch_size*(j+1)]
sess.run(optimizer,feed_dict={X:train_x[cur_idx],Y:train_y[cur_idx]})
#current_cost=sess.run(cost,feed_dict={X:train_x,Y:train_y})
#print(current_cost)
#apply the network on the test data
test_x=np.linspace(-30,30,300)
network_output=sess.run(output_layer,feed_dict={X:test_x.reshape(-1,1)})
plt.plot(test_x,test_x**2,color='r',label='y=x^2')
plt.plot(test_x,network_output,color='b',label='network output')
plt.legend(loc='center')
plt.show()
文本变量中数据的格式是什么?你确定神经网络应该能够做到这一点吗?根据我的经验,神经网络并不擅长数学推理。@Seanny123我不知道。我也在试图找到这一点-如果这对神经网络或人工智能来说是个好问题。如果不是NN,线性分类器会是个好问题吗fit?根据你和Seanny123的建议,我实现了这个网络。你可以在我的答案中看到结果。很好。我想知道如果你教它偶数,并测试相同范围的奇数,会发生什么。我想你会得到近乎完美的匹配,但肯定看到这一点会很好。我检查并更新了我的答案这个例子也是。比赛确实非常好。非常感谢。这对像我这样的业余爱好者有很大的帮助。你能帮我用最简单的方法保存和加载这个模型进行预测吗?