我创建了一个自定义的keras层,目的是在推理过程中手动改变前一层的激活。下面是简单地将激活与一个数字相乘的基本层。
import numpy as np
from keras import backend as K
from keras.layers import Layer
import tensorflow as tf
class myLayer(Layer):
def __init__(self, n=None, **kwargs):
self.n = n
super(myLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.output_dim = input_shape[1]
super(myLayer, self).build(input_shape)
def call(self, inputs):
changed = tf.multiply(inputs, self.n)
forTest = changed
forTrain = inputs
return K.in_train_phase(forTrain, forTest)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
在IRIS数据集上使用时,它工作正常
model = Sequential()
model.add(Dense(units, input_shape=(5,)))
model.add(Activation('relu'))
model.add(myLayer(n=3))
model.add(Dense(units))
model.add(Activation('relu'))
model.add(Dense(3))
model.add(Activation('softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
model.summary()
但是现在我想把'n'从init移到call函数中,这样我就可以在训练后应用不同的n值来评估模型。这个想法是用一个占位符代替n,在调用evaluate函数之前,可以用某个值初始化n。我不知道如何实现这个。正确的方法是什么?谢谢
1条答案
按热度按时间5vf7fwbs1#
您应该使用与“Concatenate”层相同的方法。
这些采用多个输入的层依赖于在列表中传递的输入(和输入形状)。
请参见
build
、call
和comput_output_shape
中的验证部分:然后你调用这个层,传递一个列表给它。但是为了这个,我强烈建议你远离
Sequential
模型。它们是纯粹的限制。使用
Input(tensor=...)
的旧答案,模型将不会像通常发生的那样要求您将2个输入传递给fit
和predict
方法。但是使用新选项,对于
Input(shape=...)
,它将需要两个输入,因此:不幸的是,我不能让它与只有一个元素的
n
一起工作。它必须有与完全相同的样本数(这是一个keras限制)。