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