I posted this in lasagne-users as well: Running into a strange error when
trying to calculate updates. The end
goal is a learned pruning/dropping layer, who's total number of activations
along with how binary those
activations are are part of the cost function - these activations from its
own weights are then multiplied by the
incoming layer in order to selectively turn off the least useful inputs.
Once the mask is learned, the layers
before and after can be resized. Seems sound in principle, but I'm having
trouble convincing theano of the idea.
The code:
------------------------------------------------------------------------------------------------------------------------------------------
from lasagne.layers import InputLayer, DenseLayer, Layer, get_output
from lasagne.nonlinearities import sigmoid, rectify, tanh
from numpy.random import random
from numpy.random import randint
from numpy import zeros
from theano import shared
import theano as th
import theano.tensor as T
import numpy as np
import lasagne as nn
floatX = th.config.floatX
batchsize = 4
Width = 10
Target = 5
np.set_printoptions(precision=2, suppress=True)
class Mask(Layer):
def __init__(self, incoming, A=10**4, **kwargs):
super(Mask, self).__init__(incoming, **kwargs)
num_inputs = self.input_shape[1]
self.A = A
self.num_units = num_inputs
W = ((random( (batchsize,num_inputs))-(1/2))*.001).astype(floatX)
for n in range(1,W.shape[0]):
W[n]=W[0]
W = shared(W )
self.W = self.add_param(W,(batchsize,num_inputs), name = 'W_Mask')
def get_output_for(self, input, **kwargs):
#return ((sigmoid(rectify(self.W*self.A) )-(1/2))*2)
return ((tanh(self.A*self.W)/2)+.5 +(input*0) ).astype(floatX)
def average(self):
Acc = zeros((1,self.num_units))
W = self.W.get_value()
for w in W:
Acc += w
Acc /= batchsize
W = zeros((batchsize,self.num_units))
for n in range(batchsize):
W[n] = Acc[:]
self.W.set_value(W)
class MaskLayer(Layer):
def __init__(self, incoming, W, A=10**6, **kwargs):
super(MaskLayer, self).__init__(incoming, **kwargs)
num_inputs = self.input_shape[1]
self.A = A
self.num_units = num_inputs
self.W = self.add_param(W,(1,num_inputs), name = 'W')
def get_output_for(self, input, **kwargs):
return (((tanh(self.A*self.W)/2)+.5)*input).astype(floatX)
In = InputLayer((3,Width),input_var=x)
M = Mask(In)
LM = MaskLayer(In,M.W)
LN = DenseLayer(LM,1,nonlinearity=sigmoid)
X = (random((batchsize,Width))-.5).astype(floatX)
x = T.matrix('x')
Out = get_output(LN,x)
M1 = get_output(M,x)
params = nn.layers.get_all_params(LN)
mask = th.function([x],M1)
cost = ((Target - (M1.sum().mean() / batchsize))**2 +
1000*T.sin(M1*np.pi).mean() - Out.mean()).astype(floatX)
Updates = nn.updates.sgd(cost,params,learning_rate=.001)
#train = th.function([x],[cost],updates=Updates)
run = th.function([x],[cost, Out, M1],on_unused_input='ignore',
updates=Updates)
print('In:\n',X)
print('Mask:\n',M.get_output_for(X).eval())
print('Masked:\n',LM.get_output_for(X).eval())
print('Dense:\n',LN.get_output_for(X).eval())
The Error:
--------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------TypeError
Traceback (most recent call
last)/usr/local/lib/python3.4/dist-packages/theano/compile/pfunc.py in
rebuild_collect_shared(outputs, inputs, replace, updates, rebuild_strict,
copy_inputs_over, no_default_updates) 192 update_val =
store_into.type.filter_variable(update_val,--> 193
allow_convert=False) 194 except
TypeError:
/usr/local/lib/python3.4/dist-packages/theano/tensor/type.py in
filter_variable(self, other, allow_convert) 233
other=other,--> 234 self=self)) 235
TypeError: Cannot convert Type TensorType(float64, matrix) (of Variable
Elemwise{sub,no_inplace}.0) into Type TensorType(float32, matrix). You can try
to manually convert Elemwise{sub,no_inplace}.0 into a TensorType(float32,
matrix).
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython-input-70-60c11801fab9> in <module>() 68 Updates =
nn.updates.sgd(cost,params,learning_rate=.001) 69 #train =
th.function([x],[cost],updates=Updates)---> 70 run = th.function([x],[cost,
Out, M1],on_unused_input='ignore', updates=Updates)
71 print('In:\n',X)
72 print('Mask:\n',M.get_output_for(X).eval())
/usr/local/lib/python3.4/dist-packages/theano/compile/function.py in
function(inputs, outputs, mode, updates, givens, no_default_updates,
accept_inplace, name, rebuild_strict, allow_input_downcast, profile,
on_unused_input) 320 on_unused_input=on_unused_input,
321 profile=profile,--> 322
output_keys=output_keys) 323 # We need to add the flag check_aliased
inputs if we have any mutable or
324 # borrowed used defined inputs
/usr/local/lib/python3.4/dist-packages/theano/compile/pfunc.py in pfunc(params,
outputs, mode, updates, givens, no_default_updates, accept_inplace, name,
rebuild_strict, allow_input_downcast, profile, on_unused_input, output_keys)
441 rebuild_strict=rebuild_strict,
442 copy_inputs_over=True,--> 443
no_default_updates=no_default_updates)
444 # extracting the arguments
445 input_variables, cloned_extended_outputs, other_stuff = output_vars
/usr/local/lib/python3.4/dist-packages/theano/compile/pfunc.py in
rebuild_collect_shared(outputs, inputs, replace, updates, rebuild_strict,
copy_inputs_over, no_default_updates) 206 ' function
to remove broadcastable dimensions.') 207 --> 208 raise
TypeError(err_msg, err_sug) 209 assert update_val.type ==
store_into.type 210
TypeError: ('An update must have the same type as the original shared variable
(shared_var=W_Mask, shared_var.type=TensorType(float32, matrix),
update_val=Elemwise{sub,no_inplace}.0, update_val.type=TensorType(float64,
matrix)).', 'If the difference is related to the broadcast pattern, you can
call the tensor.unbroadcast(var, axis_to_unbroadcast[, ...]) function to remove
broadcastable dimensions.')
--
---
You received this message because you are subscribed to the Google Groups
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.