Я пишу тестовую модель с использованием кера, где я хочу, чтобы некоторая математика зависела от числовых значений выходных данных слоя и его производных.
Я использую бэкэнд тензорного потока.Я использую 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.Пожалуйста, помогите, если у вас есть идеи.Спасибо!