root/lang/python/tremolo/tremolo/indications/neuralnet.py @ 32712

Revision 32712, 8.4 kB (checked in by rezoo, 4 years ago)

残りのバグ潰し.オプションの追加.

Line 
1#!/usr/bin/env python
2#-*- coding:utf-8 -*-
3
4import sys, os
5from foundation import Indication, Indications
6
7try:
8        from pybrain.tools.shortcuts import buildNetwork
9        from pybrain.datasets import SupervisedDataSet
10        from pybrain.structure  import RecurrentNetwork, LinearLayer, SigmoidLayer
11        from pybrain.supervised import RPropMinusTrainer
12except:
13        raise ImportError("this module needs pybrain.")
14
15class FeedForwardNetwork (Indication):
16        """
17        隠れレイヤの関数にシグモイド関数、学習に逆誤差伝搬法を用いた、
18        単純ニューラルネットワーク型のクラスです.
19        与えられた指標群のデータから、対象となる指標の値を推定します.
20        """
21        @classmethod
22        def isRealIndication(cls): return True
23        @classmethod
24        def getType(cls): return float
25       
26        def __init__(self, indications, target, network=None,
27                     hiddenLayers=10, dim=1, verbose=True, parent=None):
28                """
29                オブジェクトのコンストラクタです.
30               
31                indications  : 対象となるIndicationsインスタンス
32                target       : 学習先となる指標
33                network      : 使用するネットワーク.指定されない場合は新規に作成される
34                hiddenLayers : 隠れレイヤに用いるシグモイドユニットの数
35                dim          : 隠れレイヤの数
36                verbose      : 詳細なログを出力するか.デフォルトはTrue
37                parent       : 親となるオブジェクト
38                """
39                Indication.__init__(self, None, parent)
40               
41                if isinstance(indications, Indications):
42                        self.__indications = indications
43                else: raise TypeError("the attribute 'indications' is not valid.")
44                if issubclass(target.__class__, Indication):
45                        self.__target = target
46                else: raise TypeError("the attribute 'target' is not valid.")
47               
48                assert hiddenLayers > 0
49                assert dim > 0
50                self.__hiddenLayers = hiddenLayers
51                self.__dim = dim
52                self.__verbose = verbose
53               
54                if network: self.__network = network
55                else:
56                        args = [len(self.indications),]
57                        args += [hiddenLayers for i in xrange(dim)]
58                        args += [1,]
59                        kwargs = {"outputbias":False, "recurrent":False}
60                        self.__network = buildNetwork(*args, **kwargs)
61               
62                self.__dataset = SupervisedDataSet(len(self.indications), 1)
63                self.__trainer = RPropMinusTrainer(self.__network, verbose=verbose)
64       
65        def getVerbose(self): return self.__verbose
66        def setVerbose(self, v):
67                self.__verbose = v
68                self.__trainer.verbose = v
69        verbose = property(getVerbose, setVerbose)
70       
71        def getIndications(self): return self.__indications
72        def setIndications(self, i):
73                if isinstance(i, Indications):
74                        self.__indications = i
75                else: raise AttributeError
76        indications = property(getIndications, setIndications)
77       
78        def getTarget(self): return self.__target
79        def setTarget(self, t):
80                if issubclass(t.__class__, Indication):
81                        self.__target = t
82                else: raise AttributeError
83        target = property(getTarget, setTarget)
84       
85        def getNetwork(self): return self.__network
86        network = property(getNetwork)
87       
88        def getHiddenLayers(self): return self.__hiddenlayers
89        hiddenlayers = property(getHiddenLayers)
90       
91        def getDim(self): return self.__dim
92        dim = property(getDim)
93       
94        def getDataset(self): return self.__dataset
95        dataset = property(getDataset)
96       
97        def getTrainer(self): return self.__trainer
98        trainer = property(getTrainer)
99       
100        def getDescription(self): return "NeuralNet"
101       
102        def addSamples(self, start, end):
103                """
104                学習に必要なサンプルを指定されたtの範囲で収集します.
105                """
106                for t in xrange(start, end):
107                        input_list  = [c.getScalar(t) for c in self.indications]
108                        output_list = [self.target.getScalar(t),]
109                        self.__dataset.addSample(input_list, output_list)
110       
111        def clearSamples(self):
112                """
113                サンプルを消去します.
114                """
115                self.__dataset = SupervisedDataSet(len(self.indications), 1)
116       
117        def train(self):
118                """
119                与えられたサンプルを元に、ネットワークの学習を行います.
120                """
121                self.__trainer.trainOnDataset(self.__dataset)
122       
123        def trainEpochs(self, epochs=2):
124                """
125                指定された回数分だけ学習を行います.
126                """
127                self.__trainer.trainOnDataset(self.__dataset, epochs)
128               
129        def trainUntilConvergence(self, validationProportion=0.25):
130                """
131                ネットワークが指定された誤り率以下になるまで学習を繰り返します.
132                """
133                vp = validationProportion
134                self.__trainer.trainUntilConvergence(dataset=self.__dataset,
135                                                     validationProportion = vp)
136       
137        def evaluate(self, t):
138                args = [c.getScalar(t) for c in self.indications]
139                return self.network.activate(args)[0]
140
141
142class RecurrentNetwork (Indication):
143        """
144        RNNを用いたニューラルネットワーク型のクラスです.
145        与えられた指標群のデータから、対象となる指標の値を推定します.
146        """
147        @classmethod
148        def isRealIndication(cls): return True
149        @classmethod
150        def getType(cls): return float
151       
152        def __init__(self, indications, target, network=None,
153                     hiddenLayers=10, dim=1, verbose=True, parent=None):
154                """
155                オブジェクトのコンストラクタです.
156               
157                indications  : 対象となるIndicationsインスタンス
158                target       : 学習先となる指標
159                network      : 使用するネットワーク.指定されない場合は新規に作成される
160                hiddenLayers : 隠れレイヤに用いるシグモイドユニットの数
161                dim          : 隠れレイヤの数
162                parent       : 親となるオブジェクト
163                """
164                Indication.__init__(self, None, parent)
165                if isinstance(indications, Indications):
166                        self.__indications = indications
167                else: raise TypeError("the attribute 'indications' is not valid.")
168                if issubclass(target.__class__, Indication):
169                        self.__target = target
170                else: raise TypeError("the attribute 'target' is not valid.")
171               
172                assert hiddenLayers > 0
173                assert dim > 0
174                self.__hiddenLayers = hiddenLayers
175                self.__dim = dim
176                self.__verbose = verbose
177               
178                if network: self.__network = network
179                else:
180                        args = [len(self.indications),]
181                        args += [hiddenLayers for i in xrange(dim)]
182                        args += [1,]
183                        kwargs = {"outputbias":False, "recurrent":False}
184                        rnn = buildNetwork(*args, **kwargs)
185                        self.__network = rnn
186               
187                self.__dataset = SupervisedDataSet(len(self.indications), 1)
188                self.__trainer = RPropMinusTrainer(self.__network,
189                                                   self.__dataset, verbose=verbose)
190       
191        def getVerbose(self): return self.__verbose
192        def setVerbose(self, v):
193                self.__verbose = v
194                self.__trainer.verbose = v
195        verbose = property(getVerbose, setVerbose)
196       
197        def getIndications(self): return self.__indications
198        def setIndications(self, i):
199                if isinstance(i, Indications):
200                        self.__indications = i
201                else: raise AttributeError
202        indications = property(getIndications, setIndications)
203       
204        def getTarget(self): return self.__target
205        def setTarget(self, t):
206                if issubclass(t.__class__, Indication):
207                        self.__target = t
208                else: raise AttributeError
209        target = property(getTarget, setTarget)
210       
211        def getNetwork(self): return self.__network
212        network = property(getNetwork)
213       
214        def getHiddenLayers(self): return self.__hiddenlayers
215        hiddenlayers = property(getHiddenLayers)
216       
217        def getDim(self): return self.__dim
218        dim = property(getDim)
219       
220        def getDataset(self): return self.__dataset
221        dataset = property(getDataset)
222       
223        def getTrainer(self): return self.__trainer
224        trainer = property(getTrainer)
225       
226        def getDescription(self): return "ReccurentNeuralNet"
227       
228        def addSamples(self, start, end):
229                """
230                学習に必要なサンプルを指定されたtの範囲で収集します.
231                """
232                for t in xrange(start, end):
233                        input_list  = [c.getScalar(t) for c in self.indications]
234                        output_list = [self.target.getScalar(t),]
235                        self.__dataset.addSample(input_list, output_list)
236       
237        def clearSamples(self):
238                """
239                サンプルを消去します.
240                """
241                self.__dataset = SupervisedDataSet(len(self.indications), 1)
242       
243        def train(self):
244                """
245                与えられたサンプルを元に、ネットワークの学習を行います.
246                """
247                self.__trainer.trainOnDataset(self.__dataset)
248       
249        def trainEpochs(self, epochs=2):
250                """
251                指定された回数分だけ学習を行います.
252                """
253                self.__trainer.trainOnDataset(self.__dataset, epochs)
254       
255        def trainUntilConvergence(self, validationProportion=0.25):
256                """
257                ネットワークが指定された誤り率以下になるまで学習を繰り返します.
258                """
259                vp = validationProportion
260                self.__trainer.trainUntilConvergence(dataset=self.__dataset,
261                                                     validationProportion = vp)
262       
263        def evaluate(self, t):
264                args = [c.getScalar(t) for c in self.indications]
265                return self.network.activate(args)[0]
266
Note: See TracBrowser for help on using the browser.