Я хочу написать собственный слой с обучаемым параметром внутри него. На самом деле, я просто хочу добавить эту обучаемую модель в мою модель, и мне не нужен этот слой, чтобы что-то делать. Мой код подобен приведенному ниже:
from time import time
import numpy as np
import random
from keras.models import Model
import keras.backend as K
from keras.engine.topology import Layer, InputSpec
from keras.layers import Dense, Input, GaussianNoise, Layer, Activation
from keras.models import Model
from keras.optimizers import SGD, Adam
from keras.utils.vis_utils import plot_model
from keras.callbacks import EarlyStopping
class Mylayer(Layer):
def __init__(self,output_dim):
super(Mylayer,self).__init__()
self.output_dim = output_dim
def build(self,input_shape):
self.kernel = self.add_weight(shape=(input_shape[-1],self.output_dim),
initializer = 'random_uniform',
trainable=True)
def call(self,inputs):
return [inputs,self.kernel]
def compute_output_shape(self,input_shape):
return [input_shape,(input_shape[-1],self.output_dim)]
Input_1 = Input((100,))
middle = Dense(50)(Input_1)
middle = Dense(25)(middle)
middle,kernel = Mylayer(10)(middle)
output = Dense(100)(middle)
model = Model(inputs=Input_1,outputs=output)
data = np.random.randn(25,100)
model.compile(optimizer='adam',
loss='mse',
metrics=['accuracy'])
model.fit(data,
data,
batch_size=32,
epochs=5,
verbose=1)
, и модель может быть скомпилирована, но когда она запускается,model.fit
Исходя, возникает ошибка:
An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.
Ну, я думаю, возможно, проблема возникает в возвращении trainable_parameters self.kernel
, так как я должен получить пользовательскийобучаемый параметр в керасе? Другими словами, есть ли какой-нибудь метод для создания обучаемых параметров в Керасе? Я думаю, что использование tf.Variable()
создаст хаос в модели Keras. Спасибо!