gpt4 book ai didi

python - 将 keras 占位符初始化为自定义层的输入

转载 作者:行者123 更新时间:2023-12-02 10:35:53 26 4
gpt4 key购买 nike

我想使用自定义 keras 层来操纵前一层的激活。下面的层只是将一个数字与前一层的激活值相乘。

class myLayer(Layer):

def __init__(self, **kwargs):
super(myLayer, self).__init__(**kwargs)

def build(self, input_shape):
self.output_dim = input_shape[0][1]
super(myLayer, self).build(input_shape)

def call(self, inputs, **kwargs):
if not isinstance(inputs, list):
raise ValueError('This layer should be called on a list of inputs.')

mainInput = inputs[0]
nInput = inputs[1]

changed = tf.multiply(mainInput,nInput)

forTest = changed
forTrain = inputs[0]

return K.in_train_phase(forTrain, forTest)

def compute_output_shape(self, input_shape):
print(input_shape)
return (input_shape[0][0], self.output_dim)

我正在创建模型

inputTensor = Input((5,))
out = Dense(units, input_shape=(5,),activation='relu')(inputTensor)

n = K.placeholder(shape=(1,))
auxInput = Input(tensor=n)
out = myLayer()([out, auxInput])

out = Dense(units, activation='relu')(out)
out = Dense(3, activation='softmax')(out)
model = Model(inputs=[inputTensor, auxInput], outputs=out)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics='acc'])

当我尝试使用时出现此错误

model.fit(X_train, Y_train, epochs=epochs, verbose=1)

错误

InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder_3' with dtype float and shape [1]

当我尝试将值赋予占位符时,例如

model.fit([X_train, np.array([3])], Y_train, epochs=epochs, verbose=1)

我得到:

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 arrays but instead got the following list of 2 arrays:

我应该如何初始化这个占位符?我的目标是使用 model.evaluate 来测试模型在推理过程中不同 n 值的效果。谢谢。

最佳答案

我找到了一个避免使用数组来表示 n 的解决方案。

不要使用占位符,而是使用K.variable:

n = K.variable([someInitialValue])
auxInput = Input(tensor=n)

然后您可以随时这样设置 n 的值,即使是在编译模型之后:

K.set_value(n,[anotherValue])

这使您可以继续训练,而无需重新编译模型,也无需将 n 传递给 fit 方法。

model.fit(X_train,Y_train,....)
<小时/>

如果使用许多这样的输入,您可以这样做:

n = K.variable([val1,val2,val3,val4]) #tensor definition
K.set_value(n,[new1,new2,new3,new4]) #changing values

在各层内部,第二个输入(即 n 的张量)将有 4 个元素:

n1 = inputs[1][0]
n2 = inputs[1][1]
....

关于python - 将 keras 占位符初始化为自定义层的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46234722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com