14
14
15
15
16
16
class DBN (object ):
17
- def __init__ (self , input = None , n_ins = 2 , hidden_layer_sizes = [3 , 3 ], n_outs = 2 , \
17
+ def __init__ (self , input = None , label = None , n_ins = 2 , hidden_layer_sizes = [3 , 3 ], n_outs = 2 , \
18
18
numpy_rng = None ): # constructor does not contain input
19
19
20
- self .input = input
20
+ self .x = input
21
+ self .y = label
21
22
22
23
self .sigmoid_layers = []
23
24
self .rbm_layers = []
24
25
self .n_layers = len (hidden_layer_sizes ) # = len(self.rbm_layers)
25
26
26
27
if numpy_rng is None :
27
28
numpy_rng = numpy .random .RandomState (1234 )
28
-
29
29
30
+
30
31
assert self .n_layers > 0
31
32
32
33
@@ -40,7 +41,7 @@ def __init__(self, input=None, n_ins=2, hidden_layer_sizes=[3, 3], n_outs=2, \
40
41
41
42
# layer_input
42
43
if i == 0 :
43
- layer_input = self .input
44
+ layer_input = self .x
44
45
else :
45
46
layer_input = self .sigmoid_layers [- 1 ].output ()
46
47
@@ -62,28 +63,22 @@ def __init__(self, input=None, n_ins=2, hidden_layer_sizes=[3, 3], n_outs=2, \
62
63
self .rbm_layers .append (rbm_layer )
63
64
64
65
65
- # exit()
66
-
67
-
68
66
# layer for output using Logistic Regression
69
67
self .log_layer = LogisticRegression (input = self .sigmoid_layers [- 1 ].output (),
68
+ label = self .y ,
70
69
n_in = hidden_layer_sizes [- 1 ],
71
70
n_out = n_outs )
72
71
73
72
# finetune cost: the negative log likelihood of the logistic regression layer
74
- # self.finetune_cost = self.log_layer.negative_log_likelihood()
75
- # print self.finetune_cost
76
-
77
-
78
- # self.errors
73
+ self .finetune_cost = self .log_layer .negative_log_likelihood ()
79
74
80
75
81
76
82
77
def pretrain (self , lr = 0.1 , k = 1 , epochs = 100 ):
83
78
# pre-train layer-wise
84
79
for i in xrange (self .n_layers ):
85
80
if i == 0 :
86
- layer_input = self .input
81
+ layer_input = self .x
87
82
else :
88
83
layer_input = self .sigmoid_layers [i - 1 ].output ()
89
84
rbm = self .rbm_layers [i ]
@@ -92,92 +87,74 @@ def pretrain(self, lr=0.1, k=1, epochs=100):
92
87
for epoch in xrange (epochs ):
93
88
c = []
94
89
rbm .contrastive_divergence (lr = lr , k = k , input = layer_input )
95
- cost = rbm .get_reconstruction_cross_entropy ()
96
- # c.append(cost)
97
- print >> sys .stderr , \
98
- 'Pre-training layer %d, epoch %d, cost ' % (i , epoch ), cost
90
+ # cost = rbm.get_reconstruction_cross_entropy()
91
+ # # c.append(cost)
92
+ # print >> sys.stderr, \
93
+ # 'Pre-training layer %d, epoch %d, cost ' %(i, epoch), cost
99
94
100
95
# print numpy.mean(c)
101
96
102
97
103
- def finetune (self , y , lr = 0.1 , epochs = 100 ):
98
+ def finetune (self , lr = 0.1 , epochs = 100 ):
104
99
layer_input = self .sigmoid_layers [- 1 ].output ()
105
100
106
101
# train log_layer
107
102
epoch = 0
108
103
done_looping = False
109
104
while (epoch < epochs ) and (not done_looping ):
110
- self .log_layer .train (y = y , lr = lr , input = layer_input )
111
- cost = self .log_layer .negative_log_likelihood (y = y )
112
- print >> sys .stderr , 'Training epoch %d, cost is ' % epoch , cost
105
+ self .log_layer .train (lr = lr , input = layer_input )
106
+ # self.finetune_cost = self.log_layer.negative_log_likelihood()
107
+ # print >> sys.stderr, 'Training epoch %d, cost is ' % epoch, self.finetune_cost
113
108
114
109
lr *= 0.95
115
110
epoch += 1
116
111
117
- # print self.log_layer.W
118
- # exit()
119
112
120
113
def predict (self , x ):
121
114
layer_input = x
122
115
123
116
for i in xrange (self .n_layers ):
124
- print layer_input
125
117
sigmoid_layer = self .sigmoid_layers [i ]
118
+ # rbm_layer = self.rbm_layers[i]
126
119
layer_input = sigmoid_layer .output (input = layer_input )
127
120
128
- # print self.log_layer.W
129
121
out = self .log_layer .predict (layer_input )
130
- print layer_input
131
-
132
122
return out
133
123
134
124
135
- def test_dbn (pretrain_lr = 0.1 , pretraining_epochs = 10 , k = 1 , \
136
- finetune_lr = 0.1 , finetune_epochs = 10 ):
137
-
138
- x = numpy .array ([[0 , 0 , 0 , 1 ],
139
- [0 , 0 , 1 , 0 ],
140
- [0 , 0 , 1 , 0 ],
141
- [0 , 1 , 0 , 0 ],
142
- [0 , 1 , 0 , 0 ],
143
- [1 , 0 , 0 , 0 ]])
144
- y = numpy .array ([[0 , 0 , 0 , 1 ],
145
- [0 , 0 , 1 , 0 ],
146
- [0 , 0 , 1 , 0 ],
147
- [0 , 1 , 0 , 0 ],
148
- [0 , 1 , 0 , 0 ],
149
- [1 , 0 , 0 , 0 ]])
125
+ def test_dbn (pretrain_lr = 0.1 , pretraining_epochs = 1000 , k = 1 , \
126
+ finetune_lr = 0.1 , finetune_epochs = 1000 ):
127
+
128
+ x = numpy .array ([[1 ,1 ,1 ,0 ,0 ,0 ],
129
+ [1 ,0 ,1 ,0 ,0 ,0 ],
130
+ [1 ,1 ,1 ,0 ,0 ,0 ],
131
+ [0 ,0 ,1 ,1 ,1 ,0 ],
132
+ [0 ,0 ,1 ,1 ,0 ,0 ],
133
+ [0 ,0 ,1 ,1 ,1 ,0 ]])
134
+ y = numpy .array ([[1 , 0 ],
135
+ [1 , 0 ],
136
+ [1 , 0 ],
137
+ [0 , 1 ],
138
+ [0 , 1 ],
139
+ [0 , 1 ]])
140
+
150
141
151
142
rng = numpy .random .RandomState (123 )
152
143
153
144
# construct DBN
154
- dbn = DBN (input = x , n_ins = 4 , hidden_layer_sizes = [10 ], n_outs = 4 , numpy_rng = rng )
145
+ dbn = DBN (input = x , label = y , n_ins = 6 , hidden_layer_sizes = [2 ], n_outs = 2 , numpy_rng = rng )
155
146
156
147
# pre-training (TrainUnsupervisedDBN)
157
148
dbn .pretrain (lr = pretrain_lr , k = 1 , epochs = pretraining_epochs )
158
149
159
150
# fine-tuning (DBNSupervisedFineTuning)
160
- dbn .finetune (y , lr = finetune_lr , epochs = finetune_epochs )
151
+ dbn .finetune (lr = finetune_lr , epochs = finetune_epochs )
161
152
162
153
163
154
# test
164
- x = numpy .array ([0 , 0 , 0 , 1 ])
165
- print dbn .predict (x ) # 0
166
- print
167
-
168
-
169
- exit ()
170
- x = numpy .array ([0 , 0 ])
171
- print dbn .predict (x ) # 0
172
- print
173
- x = numpy .array ([0 , 1 ])
174
- print dbn .predict (x ) # 1
175
- print
176
- x = numpy .array ([1 , 0 ])
177
- print dbn .predict (x ) # 1
178
- print
179
- x = numpy .array ([1 , 1 ])
180
- print dbn .predict (x ) # 0
155
+ x = numpy .array ([1 , 1 , 0 , 0 , 0 , 0 ])
156
+ print dbn .predict (x )
157
+
181
158
182
159
if __name__ == "__main__" :
183
160
test_dbn ()
0 commit comments