神经网络模型不起作用

时间:2017-10-17 07:53:21

标签: python scikit-learn neural-network

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)的系数和预测值是相同的。 我做错了什么?

1 个答案:

答案 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]

正如您所看到的,学习权重/偏见的细节存在,并且它们会不时地改变。