如何用 python 构建字典神经网络择时模型

thanks Cssk8 &&
pybrain 神经网络 创建多层隐藏层神经网络的例子 bp
最近实习需要用到这几个库,主要是用pybrain里的神经网络来做预测模型,而caffe和多线程编程的知识是我自己想学的,因为以后如果数据量庞大的话,就需要性能更好的库如caffe,也能做深度卷积网络的学习,而对于IO密集型的数据处理和保存来说,多线程的使用是必须的,所以我就把这两者加入了学习计划。先占个坑,慢慢更新
我去。。还没写这个就变成我博客涨访问最快的了。。心理难安啊,本来打算慢慢来的,看来要速度点了,明天(3.13)前就把pybrain的写好!
pybrain的神经网络看的差不多了,总结如下!
一 pybrain
关于pybrain的安装,会git的兄弟们只要使用如下命令:
git&clonegit:///pybrain/pybrain.git&&
python&setup.py&install&&
就可以安装pybrain了,什么,你不会用git!?那你可以在下面留言,我把下载的安装包发给你。
然后pybrain本身有一些关联的包需要下载如:numpy,scipy,我的建议是下载anaconda,这个IDE是专门用来给做数据分析的,里面把各种关联的库都帮你绑定好了,连scikit-learn都有,我之前自己关联各种库的时候老是会出错,所以建议大家就用这个了,省心省力啊。安装好后可以输入import pybrain验证一下是否成功了。接下来讲pybrain的使用。
anaconda下载地址:
https://www.continuum.io/downloads
pybrain内部集成了一些分类器,有BP神经网络、循环神经网络RNN,还有增强学习RL的东西,这里只介绍下怎么使用BP神经网络,其他的大家要是感兴趣可以去看官方文档:
http://www.pybrain.org/docs/
这次建模通过拟合y=x1^2+x2^2+x3^2这个函数来做示例。总共是三个输入一个输出,步骤如下:
[python]&&
from&pybrain.tools.shortcuts&import&buildNetwork&&
from&pybrain.datasets&import&SupervisedDataSet&&
from&pybrain.supervised.trainers&import&BackpropTrainer&&
from&pybrain.structure&import&TanhLayer,LinearLayer,SigmoidLayer,SoftmaxLayer&&&
from&pybrain.tools.validation&import&CrossValidator,Validator&&
import&numpy&as&np&&
import&pandas&as&pd&&
2、创建数据X和Y
[python]&&
x1=[float(x)&for&x&in&range(-100,400)]&&&&&&
x2=[float(x)&for&x&in&range(-200,800,2)]&&
x3=[float(x)&for&x&in&range(-500,1000,3)]&&
num=len(x1)&&
for&i&in&range(num):&&
&&&&y.append(x1[i]**2+x2[i]**2+x3[i]**2)&&
3、使用minmax标准化并转化成array格式
[python]&&
x1=[(x-min(x1))/(max(x1)-min(x1))&for&x&in&x1]&&
x2=[(x-min(x2))/(max(x2)-min(x2))&for&x&in&x2]&&
x3=[(x-min(x3))/(max(x3)-min(x3))&for&x&in&x3]&&
y=[(x-min(y))/(max(y)-min(y))&for&x&in&y]&&
[python]&&
x=np.array([x1,x2,x3]).T&&
y=np.array(y)&&
xdim=x.shape[1]&&&&&&&&&
ydim=1&&&&&&&&&&&&&&&&&&
此时x和y的格式如下:
X:500行3列
array([[ 0. & & & &, &0. & & & &, &0. & & & &],& & & &[ 0., &0., &0.],& & & &[ 0., &0., &0.],& & & &...,&& & & &[ 0., &0., &0.],& & & &[ 0., &0., &0.],& & & &[ 1. & & & &, &1. & & & &, &1. & & & &]])
Y:500行1列
array([ &1., & 1., & 1.,& & & & &1., & 1., & 1.,& & & & &1., & 1., & 1.,& & & & &...,& & & & &1., & 1., & 1.])
4、创建神经网络使用的监督数据集
[python]&&
DS=SupervisedDataSet(xdim,ydim)&&
for&i&in&range(num):&&
&&&&DS.addSample(x[i],y[i])&&
train,test=DS.splitWithProportion(0.75)&&&&
5、创建神经网络
#如下,我这次总共创建了4层的神经网络,一层输入,2个隐含层,分别是10个节点和5个节点,一层输出,多少层可以根据自己需求来确定
[python]&&
ann=buildNetwork(xdim,10,5,ydim,hiddenclass=TanhLayer,outclass=LinearLayer)&&
trainer=BackpropTrainer(ann,dataset=train,learningrate=0.1,momentum=0.1,verbose=True)&&
trainer.trainUntilConvergence(maxEpochs=50)&&&&&&&&&&&&&&&
6、预测与作图
[python]&&
output=ann.activateOnDataset(test)&&
for&i&in&output:&&
&&&&out.append(i[0])&&
df=pd.DataFrame(out,columns=['predict'])&&
df['real']=test['target']&&
df1=df.sort_values(by='real')&&
df1.index=range(df.shape[0])&&
df.plot(kind='line')&&
对test作图情况如下:
其中横坐标仅表示第几个数,纵坐标表示标准化后的y
若对整个五百组数据拟合的话,情况如下:
只需将代码中的test都改成DS即可。
到了这里操作基本差不多了,其他模块还有一些附加功能,如:
[python]&&
v=Validator()&&
v.MSE(output,test['target'])&&&&&&&&
[python]&&
CrossValidator(trainer,&DS,&n_folds=5,max_epochs=20)&&
可以根据自己需要来选取相应的功能。
然后以上的神经网络训练针对的是连续型输出的,当要使用分类的神经网络时,最好设置下神经网络中代表分类的变量,具体可以查阅pybrain的doc
最后总结下这几天学习操作和查的资料对神经网络做个总结。
首先,神经网络这玩意的激活函数的范围基本都在0-1或者-1-1,所以数据必须标准化,不然如下:
sigmoid函数
可以看到,当X&4之后,得到的转化值基本都是1了,这样后期拟合将无法收敛。然后关于隐藏节点和输出节点的激活函数选择,一般是这样的,如果是连续型的输出,我们一般使用输出函数为y=x的线性输出函数,如果是分类的神经网络,二元分类的时候我们使用sigmoid,多元分类的时候则采用softmax。softmax具有将一个较大的值转化为1,其他值转化为0的功能,相当于一个max函数,在多元分类中非常有用,而sigmoid多使用与二元分类,能将数据转化到0-1,通过设置阈值来判断取0还是1。然后关于为什么我选择了tanh作为隐藏节点的激活函数,因为《神经网络43个案例分析》书里提到对各个激活函数的匹配情况作了分析,发现tanh和y=x配套的时候拟合误差是最低的,所以我这里使用了这两函数。如下:
purelin就是y=x.
然后关于参数的设置:
momentun冲量:为了越过局部最小值learningrate学习率:为了加快学习速度weightdecay:给损失函数加个惩罚,惩罚过大的权值数,让他能够选取权值和最小的NN,目的是为了防止过拟合,一般为0.1左右
PS:weightdecay设置的不好,可能使得本身可以收敛的网络变得无法收敛,所以要嘛不设,要嘛多尝试几个来自集智百科
本页面主要内容来自
有多层神经元
高层神经元控制(接受)底层神经元的输入
使用卷积来定义不同层神经元之间的作用,回忆一维卷积的效果
可以将一维卷积推广到二维卷积
卷积是很有意思的东西,是The common patterns in nature一文中的核心概念。可以简单解释如下(来自我以前写的文章《统计之道:墨子见鬼谷子》):
图层之间的作用示例
更具体完整的模型如下所示(lenet)
我们将使用以下对图片进行处理
import theano
import theano.tensor as T
import pylab
from PIL import Image
import cPickle, gzip, numpy
from theano.tensor.nnet import conv
rng = numpy.random.RandomState(23455)
input = T.tensor4(name='input')
# initialize shared variable for weights.
w_shp = (2, 3, 9, 9)
w_bound = numpy.sqrt(3 * 9 * 9)
W = theano.shared( numpy.asarray(
rng.uniform(
low=-1.0 / w_bound,
high=1.0 / w_bound,
size=w_shp),
dtype=input.dtype), name ='W')
b_shp = (2,)
b = theano.shared(numpy.asarray(
rng.uniform(low=-.5, high=.5, size=b_shp),
dtype=input.dtype), name ='b')
conv_out = conv.conv2d(input, W)
output = T.nnet.sigmoid(conv_out + b.dimshuffle('x', 0, 'x', 'x'))
f = theano.function([input], output)
# open random image of dimensions 639x516
img = Image.open('E:/wulingfei/pkuwinter.jpg')
(width, height) = img.size
img = numpy.asarray(img, dtype='float64') / 256.
# put image in 4D tensor of shape (1, 3, height, width)
img_ = img.swapaxes(0, 2).swapaxes(1, 2).reshape(1, 3, height, width)
filtered_img = f(img_)
plt.figure(1,figsize=(7,15))
# plot original image and first and second components of output
pylab.subplot(3, 1, 1); pylab.axis('off'); pylab.imshow(img)
pylab.gray();
# recall that the convOp output (filtered image) is actually a "minibatch",
# of size 1 here, so we take index 0 in the first dimension:
pylab.subplot(3, 1, 2); pylab.axis('off'); pylab.imshow(filtered_img[0, 0, :, :])
pylab.subplot(3, 1, 3); pylab.axis('off'); pylab.imshow(filtered_img[0, 1, :, :])
处理的结果如下图所示
所谓的“深度学习”(deep learning)里的“深度”其实就是人工神经网络的层次。我们这里介绍的卷积神经网络是各类深度学习模型中的一种。因为机器的增强-特别是并行计算,和数据量的加大,使得构建多层的人工神经网络模型变得可行。经过多层的处理,高层的神经元可以以非线性的方式储藏底层神经元的信息,最终形成对原始图像的抽象特征的理解。例如在这个例子中,我们识别出了图象的“边缘”。这样的学习,比起单纯地用一个分线性的分类器,例如logistic或者SVM,来理解数据里的非线性结构,无疑是更深刻的,也更贴近人脑的工作方式:使用抽象概念描述世界。原文地址:http://blog.csdn.net/csmqq/article/details/
用Keras搭建神经网络,编译和训练时,常见问题:
No.1怎么保存Keras模型?
不推荐使用pickle或cPickle。
(1) 如果只保存模型结构,代码如下:
# save as JSON
json_string = model.to_json()
# save as YAML
yaml_string = model.to_yaml()
# model reconstruction from JSON:
from keras.modelsimport model_from_json
model = model_from_json(json_string)
# model reconstruction from YAML
model =model_from_yaml(yaml_string)
(2) 如果需要保存数据:
model.save_weights('my_model_weights.h5')&&
model.load_weights('my_model_weights.h5')
&(3) 综合运用:
json_string = model.to_json()&
open('my_model_architecture.json','w').write(json_string)&
model.save_weights('my_model_weights.h5')&
model = model_from_json(open('my_model_architecture.json').read())&
model.load_weights('my_model_weights.h5')&&&
No.2为什么训练损失比测试损失要大?
Keras有两种模型:训练和测试。规则化,比如Dropout和L1/L2,在测试时关闭了。
另外,训练损失是每一次训练batch的平均损失。模型因为在时刻变化,最开始的batch损失肯定要比最后的batches损失要高。另一方面,每一次epoch损失使用最后的epoch计算,因此返回的结果就比较小。
&No.3如何将中间层的输出可视化?
通过Theano function的output。示例如下:
#&with&a&Sequential&model&&get_3rd_layer_output&=theano.function([model.layers[0].input],&&&model.layers[3].get_output(train=False))&&layer_output&=get_3rd_layer_output(X)&&&&&#&with&a&Graph&model&&get_conv_layer_output&=theano.function([model.inputs[i].inputfor&iin&model.input_order],model.outputs['conv'].get_output(train=False),&on_unused_input='ignore')&&conv_output&=&get_conv_output(input_data_dict)&&
No.4如何用Keras处理不适合存放在内存中的数据集?
Batch trainingusingmodel.train_on_batch(X,y)和model.test_on_batch(X, y)参考文档:。
You can also seebatch training in action inour&.
&No.5当验证损失不再继续降低时,如何中断训练?
用EarlyStopping回调函数,代码如下:
from&keras.callbacksimport&EarlyStopping&&early_stopping&=EarlyStopping(monitor='val_loss',&patience=2)&&model.fit(X,&y,&validation_split=0.2,&callbacks=[early_stopping])&&
参考文档:
&No.6在训练时,数据会被随机打乱吗?
如果model.fit中的参数suffle=True时,会随机打算每一次epoch的数据。(默认打乱)
但是验证数据默认不会打乱。
&No.7如何记录每一次epoch的训练/验证损失/准确度?
Model.fit函数会返回一个 History 回调,该回调有一个属性history包含一个封装有连续损失/准确的lists。代码如下:
hist&=&model.fit(X,&y,validation_split=0.2)&&print(hist.history)&&
各种精确度和损失的区别:
训练精确度
验证精确度
No.8如何让我的Keras脚本每次产生确定的数据?
在引入Kerans之前,引入numpy,并且用其random.seed(种子)产生一个随机数对象。这样在相同硬件的机器上运行时,每次产生的随机数的顺序都是一样的。
import&numpy as&np&&np.random.seed(1234)&&&&&#&Keras&imports&start&here&&from&keras import&...&&
N0.9 在训练过程中,batch_size, nb_epoch分别什么意思
No.10 测试过程中,evaluate实现测试的机制是什么?返回值的大小反应了什么?
score = model.evaluate(x_test, y_test,batch_size=20)
No.11 预测过程后,如何绘制误差曲线?如何绘制拟合曲线?
参考网站:
将fit 函数中的verbose=0: model.fit(X_train, y_train, batch_size=BATCH_SIZE, nb_epoch=1, verbose=0,
&&&&&&&&&&&&& validation_data=(X_val, y_val))
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:26007次
积分:1787
积分:1787
排名:第17672名
原创:112篇
转载:266篇
(54)(101)(67)(58)(64)(37)

我要回帖

更多关于 keras 构建神经网络 的文章

 

随机推荐