Рассчитать взвешенное стандартное отклонение? - PullRequest
1 голос
/ 12 апреля 2019

Я хочу, чтобы моя сеть вычисляла взвешенное стандартное отклонение (или дисперсию) на лету во время тренировки.

Весовые коэффициенты должны быть получены из постоянного вектора, например:

weights = np.array([0.1,0.4,0.5,0.6,0.1,0.3,0.6,0.9])

Вход имеет тот же размер, что и weights.

Как я могу сделать это в Керасе?

Я получил формулу для среднего значения

weights = K.variable(weights)
width = dot([in, weights],axes=-1, normalize=False)

, но даже это вылетает с ошибкой:

File "/sps/atlas/a/aghosh/miniconda3/envs/cpuApril19/lib/python2.7/site-packages/keras/layers/merge.py", line 668, in dot
return Dot(axes=axes, normalize=normalize, **kwargs)(inputs)
File "~/envs/cpuApril19/lib/python2.7/site-packages/keras/engine/base_layer.py", line 474, in __call__
output_shape = self.compute_output_shape(input_shape)
File "~/envs/cpuApril19/lib/python2.7/site-packages/keras/layers/merge.py", line 512, in compute_output_shape
shape2.pop(0)
IndexError: pop from empty list

Редактировать:

Я сделал ошибку, я хотел бы рассчитать дисперсию вектора константы с вводом в качестве весов.

Следуя предложению @ Sharky, я сделал:

constVector = np.array([-0.1,-0.4,-0.5,0.6,0.1,0.3,0.6,0.9])
....
in = Input(shape=(8,), name='Input')
width = Lambda(lambda x: tf.nn.weighted_moments(x,axes=-1,frequency_weights=in)[1])(constVector)
Model = Model(inputs=[in], outputs= width)

выдает эту ошибку: AttributeError: у объекта 'NoneType' нет атрибута '_inbound_nodes'

Если я переключаю тензоры как:

tf.nn.weighted_moments(x,axes=-1,frequency_weights=constVector)[1])(in )

, он компилируетсяно мне нужно отклонение constVector, взвешенное на in

Edit2: просто необходимо правильно реализовать слой Lamda

tf.nn.weighted_moments(constVector,axes=-1,frequency_weights=x)[1])(in)

1 Ответ

0 голосов
/ 15 апреля 2019

После комментария @ Sharky я использовал функцию weighted_moments() TensorFlow, обернув ее в Keras:

constVector = np.array([-0.1,-0.4,-0.5,0.6,0.1,0.3,0.6,0.9])
constVector = K.variable(constVector)
def wWidthFunc(x, y=constVector):
    # only works for 1-D vector inputs
    z = tf.nn.weighted_moments(y,axes=[1],frequency_weights=x)[1]
    z = K.expand_dims(z, -1)        # z of shape (batch_size, 1)
    return z
def make_width_model():
    m_input = Input(shape=(8,), name='Input_')
    width = Lambda(wWidthFunc)(m_input) # m_input values must be >0
    M_w = Model(inputs=[m_input], outputs= width)
    return M_w
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...