Ошибка использования K.function вместе с K.gradients - PullRequest
0 голосов
/ 23 марта 2019

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

Я использую бэкэнд тензорного потока.Я использую K.function, чтобы получить значения выходов лямбда-слоя и производных слоев.Однако, я получил странную ошибку, если выбрал функцию в слое Lambda в качестве степенной функции, например, x ** 2.Если я изменю x ** 2 на sin (x), все будет работать нормально.

import numpy as np
from keras.models import Model
from keras.layers import Input, Layer, Lambda
from keras import backend as K

x = Input(shape=(1,))

# the Lambda layer 
c = Lambda(lambda x: x**2)(x)     # this will causs err
#c = Lambda(lambda x: K.sin(x))(x) # but this works fine


class dc_layer(Layer):

    def __init__(self,*args,**kwargs):
        self.is_placeholder = True
        super(dc_layer, self).__init__(*args,**kwargs)

    def call(self,inputs):
        x = inputs[0]
        c0 = inputs[1]
        c1 = K.gradients(c0,x)
        return c1

# the derivatives of the lambda layer    
c1 = dc_layer()([x,c])
c2 = dc_layer()([x,c1])

Затем я использую backend.function, чтобы определить функцию для получения выходных данных слоя

# define a function to get the derivatives
get_layer_outputs = K.function([x],[c2])

x_data = np.linspace(0,1,6)
val = get_layer_outputs([x_data])[0]
print(val)

Я получил следующее сообщение об ошибке в блокноте jupyter

InvalidArgumentError: data[0].shape = [1] does not start with indices[0].shape = [2]

, который прослеживается до

---> 36 val = get_layer_outputs([x_data])[0]

, но если я смотрю на слой c1

# define a function to get the derivatives
get_layer_outputs = K.function([x],[c1])

x_data = np.linspace(0,1,6)
val = get_layer_outputs([x_data])[0]
print(val)

, он работает нормально.

Я думаю, что-то не так, когда яиспользуйте K.function.Будем благодарны за любые решения / предложения.

=====================================================

Дополнительный вопрос:

Даже если я попробую очень простой код, я получу ошибку при использовании K.function, следующим образом

x = Input(shape=(1,))
h = Dense(10,activation='sigmoid')(x)
c = Dense(1)(h)

get_layer_outputs = K.function([x],[c])

x_data = np.linspace(0,1,6)
val = get_layer_outputs([x_data])[0]
print(val)

Я получил

InvalidArgumentError: In[0] is not a matrix
     [[Node: dense_24/MatMul = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_input_19_0_0, dense_24/kernel/read)]]

Теперь я действительно запутался в том, как правильно использовать K.function.Пожалуйста, помогите, если у вас есть идеи.Спасибо!

1 Ответ

0 голосов
/ 23 марта 2019

Для меня это работает - ваш вектор x_data был 0-мерным:

import numpy as np

from keras.models import Model
from keras.layers import Input, Layer, Lambda, Dense
from keras import backend as K

x = Input(shape=(1,))

# the Lambda layer 
c = Lambda(lambda x: x**2)(x)     # this will causs err
#c = Lambda(lambda x: K.sin(x))(x) # but this works fine


class dc_layer(Layer):

    def __init__(self,*args,**kwargs):
        self.is_placeholder = True
        super(dc_layer, self).__init__(*args,**kwargs)

    def call(self,inputs):
        x = inputs[0]
        c0 = inputs[1]
        c1 = K.gradients(c0,x)
        return c1

# the derivatives of the lambda layer    
c1 = dc_layer()([x,c])  # in Keras 2.0.2 need to unpack results, Keras 2.2.4 seems fine.
c2 = dc_layer()([x,c1])

# define a function to get the derivatives
get_layer_outputs = K.function([x],[c2])

x_data = np.linspace(0,1,6)[:,None] # ensure vector is 1D, not 0D
val = get_layer_outputs([x_data])[0]
print(val)

вывод:

[[2.]
 [2.]
 [2.]
 [2.]
 [2.]
 [2.]]
...