from caffe import layers as L, params as P
def l2normed(vec, dim):
"""Returns L2-normalized instances of vec; i.e., for each instance x in vec,
computes x / ((x ** 2).sum() ** 0.5). Assumes vec has shape N x dim."""
denom = L.Reduction(vec, axis=1, operation=P.Reduction.SUMSQ)
denom = L.Power(denom, power=(-0.5))
denom = L.Reshape(denom, num_axes=0, axis=-1, shape=dict(dim=[1]))
denom = L.Tile(denom, axis=1, tiles=dim)
return L.Eltwise(vec, denom, operation=P.Eltwise.PROD)
layer {
name: "denom"
type: "Reduction"
bottom: "fc5"
top: "denom"
reduction_param {
operation: SUMSQ
axis: 1
}
}
layer {
name: "power"
type: "Power"
bottom: "denom"
top: "power"
power_param {
power: -0.5
shift: 9.99999996004e-13
}
}
layer {
name: "reshape"
type: "Reshape"
bottom: "power"
top: "reshape"
reshape_param {
shape {
dim: 1
}
axis: -1
num_axes: 0
}
}
layer {
name: "tile"
type: "Tile"
bottom: "reshape"
top: "tile"
tile_param {
axis: 1
tiles: 1000
}
}
layer {
name: "elwise"
type: "Eltwise"
bottom: "loss3/classifierCustom"
bottom: "tile"
top: "elwise"
eltwise_param {
operation: PROD
}
}