(self, D, ft, hidden_layer_sizes=[])
| 65 | # approximates pi(a | s) |
| 66 | class PolicyModel: |
| 67 | def __init__(self, D, ft, hidden_layer_sizes=[]): |
| 68 | self.ft = ft |
| 69 | |
| 70 | ##### hidden layers ##### |
| 71 | M1 = D |
| 72 | self.hidden_layers = [] |
| 73 | for M2 in hidden_layer_sizes: |
| 74 | layer = HiddenLayer(M1, M2) |
| 75 | self.hidden_layers.append(layer) |
| 76 | M1 = M2 |
| 77 | |
| 78 | # final layer mean |
| 79 | self.mean_layer = HiddenLayer(M1, 1, lambda x: x, use_bias=False, zeros=True) |
| 80 | |
| 81 | # final layer variance |
| 82 | self.var_layer = HiddenLayer(M1, 1, T.nnet.softplus, use_bias=False, zeros=False) |
| 83 | |
| 84 | # get all params for gradient later |
| 85 | params = self.mean_layer.params + self.var_layer.params |
| 86 | for layer in self.hidden_layers: |
| 87 | params += layer.params |
| 88 | |
| 89 | # inputs and targets |
| 90 | X = T.matrix('X') |
| 91 | actions = T.vector('actions') |
| 92 | advantages = T.vector('advantages') |
| 93 | target_value = T.vector('target_value') |
| 94 | |
| 95 | # get final hidden layer |
| 96 | Z = X |
| 97 | for layer in self.hidden_layers: |
| 98 | Z = layer.forward(Z) |
| 99 | |
| 100 | mean = self.mean_layer.forward(Z).flatten() |
| 101 | var = self.var_layer.forward(Z).flatten() + 1e-5 # smoothing |
| 102 | |
| 103 | # can't find Theano log pdf, we will make it |
| 104 | def log_pdf(actions, mean, var): |
| 105 | k1 = T.log(2*np.pi*var) |
| 106 | k2 = (actions - mean)**2 / var |
| 107 | return -0.5*(k1 + k2) |
| 108 | |
| 109 | def entropy(var): |
| 110 | return 0.5*T.log(2*np.pi*np.e*var) |
| 111 | |
| 112 | log_probs = log_pdf(actions, mean, var) |
| 113 | cost = -T.sum(advantages * log_probs + 0.1*entropy(var)) |
| 114 | updates = adam(cost, params) |
| 115 | |
| 116 | # compile functions |
| 117 | self.train_op = theano.function( |
| 118 | inputs=[X, actions, advantages], |
| 119 | updates=updates, |
| 120 | allow_input_downcast=True |
| 121 | ) |
| 122 | |
| 123 | # alternatively, we could create a RandomStream and sample from |
| 124 | # the Gaussian using Theano code |
nothing calls this directly
no test coverage detected