import numpy as np
temp_data_x = np.random.randn(200,3)
temp_data_y = temp_data_x[:,0] + temp_data_x[:,1] + temp_data_x[:,2] + np.random.randn(200,1).reshape(200,)
from sklearn.neural_network import MLPRegressor
net = MLPRegressor(hidden_layer_sizes=(3), activation='tanh', max_iter=1000,
learning_rate_init=0.1,verbose=True, random_state=3)
net1 = net.fit(temp_data_x[0:150,],temp_data_y[0:150])
net.coefs_[0][0:5,0:5]
net1.coefs_[0][0:5,0:5]
net.predict(temp_data_x[199,].reshape(1,-1))
net1.predict(temp_data_x[199,].reshape(1,-1))
我使用python numpy和scikit学习制作并运行这个简单的神经网络, 但是初始模型(净)和拟合模型(net1)的系数和预测值是相同的。 我做错了什么?
答案 0 :(得分:2)
回答有关为什么使用变量net和net1获得相同系数和预测的问题,是因为它们都是对同一对象的引用。 要检查一下,你可以运行:
print(net is net1)
您将获得True
。原因是您已经为MLPRegressor
对象创建了引用。因此,当fit
模型的值为X和y时,net
的模型将尝试适合提供的值,然后将同一对象分配给net1
。
接下来,我相信你必须降低你的学习率(比如说0.01)才能更好地学习或至少让你的神经网络适应所提供的数据。
最后,正如您可能已经检查过的那样,由于您的数据是随机数据,因此您的模型可能无法在测试数据之外的值上执行得更好。
修改强>
根据每轮纪元后打印学习重量(系数)的请求,我正在添加额外的细节。与MLPRegressor一样,在每次迭代/批处理等之后,您将无法打印学习权重的详细信息。为此,您将必须使用sknn.mlp模块。它们有各种callbacks,可用于打印/评估您的学习时间。
请考虑以下代码,以帮助您入门:
def print_coeff_callback(**variables):
print('End of epoch: {}'.format(variables['i']))
print('Layer 0: Weights:')
print(variables['best_params'][0][0])
print('Layer 0: Biases:')
print(variables['best_params'][0][1])
print('Layer 1: Weights:')
print(variables['best_params'][1][0])
print('Layer 1: Biases:')
print(variables['best_params'][1][1])
print()
import numpy as np
temp_data_x = np.random.randn(200,3)
temp_data_y = temp_data_x[:,0] + temp_data_x[:,1] + temp_data_x[:,2]\
+ np.random.randn(200,1).reshape(200,)
from sknn.mlp import Regressor, Layer
net = Regressor(layers = [Layer('Tanh', units = 3), Layer('Linear', units = 1)],
learning_rate = 0.01, n_iter = 10,
verbose = True, random_state = 3,
callback = {'on_epoch_finish': print_coeff_callback})
net.fit(temp_data_x[0:150,],temp_data_y[0:150])
当您运行此代码时,在每个时代结束时,您将获得以下其他详细信息:
End of epoch: 1
Layer 0: Weights:
[[-0.50751932 -0.72378025 -0.37128063]
[-0.53206593 -0.33147215 0.83072845]
[-0.66474313 -0.76372327 -0.85991181]]
Layer 0: Biases:
[-0.03277463 -0.10826231 0.01669442]
Layer 1: Weights:
[[-0.88015991]
[-1.13531142]
[ 0.06633887]]
Layer 1: Biases:
[ 0.16668694]
End of epoch: 2
Layer 0: Weights:
[[-0.49187796 -0.70438651 -0.36641678]
[-0.66897643 -0.51718653 0.83213911]
[-0.68042139 -0.72434914 -0.85017705]]
Layer 0: Biases:
[ 0.09687692 0.04577672 0.00219902]
Layer 1: Weights:
[[-1.11614207]
[-1.31741563]
[-0.02267721]]
Layer 1: Biases:
[ 0.02075817]
正如您所看到的,学习权重/偏见的细节存在,并且它们会不时地改变。