如何使用 tensorflow 后端在 Keras 的下一层中重用最后一层的偏差



我是Keras的新手我的神经网络结构如下:神经网络结构

我的想法是:

import keras.backend as KBack
import tensorflow as tf
#...some code here
model = Sequential()
hidden_units = 4
layer1 = Dense(
hidden_units,
input_dim=len(InputIndex),
activation='sigmoid'
)
model.add(layer1)
# layer1_bias = layer1.get_weights()[1][0]
layer2 = Dense(
1, activation='sigmoid',
use_bias=False
)
model.add(layer2)
# KBack.bias_add(model.output, layer1_bias[0])

我知道这不起作用,因为layer1_bias[0]不是张量,但我不知道如何修复它。或者有人有其他解决方案。

谢谢。

您会得到错误,因为bias_add需要一个Tensor,而您正在向它传递一个浮点值(偏差的实际值(。此外,请注意,您的隐藏层实际上有3个偏差(每个节点一个(。如果你想把第一个节点的偏置添加到你的输出层,这应该有效:

import keras.backend as K
from keras.layers import Dense, Activation
from keras.models import Sequential
model = Sequential()
layer1 = Dense(3, input_dim=2, activation='sigmoid')
layer2 = Dense(1, activation=None, use_bias=False)
activation = Activation('sigmoid')
model.add(layer1)
model.add(layer2)
K.bias_add(model.output, layer1.bias[0:1]) # slice like this to not lose a dimension
model.add(activation)
print(model.summary())

请注意,为了"正确"(根据致密层的定义(,你应该先添加偏置,然后添加激活。

此外,您的代码与您的网络并不完全一致。在图中,网络中的每个节点都添加了一个单独的共享偏差。您可以使用功能强大的API来实现这一点。这个想法是禁止在隐藏层和输出层中使用偏差,并手动添加一个您自己定义的偏差变量,该变量将由层共享。我对tf.add()使用tensorflow,因为它支持广播:

from keras.layers import Dense, Lambda, Input, Add
from keras.models import Model
import keras.backend as K
import tensorflow as tf
# Define the shared bias as a custom keras variable
shared_bias = K.variable(value=[0], name='shared_bias')
input_layer = Input(shape=(2,))
# Disable biases in the hidden layer
dense_1 = Dense(units=3, use_bias=False, activation=None)(input_layer)
# Manually add the shared bias
dense_1 = Lambda(lambda x: tf.add(x, shared_bias))(dense_1)
# Disable bias in output layer
output_layer = Dense(units=1, use_bias=False)(dense_1)
# Manually add the bias variable
output_layer = Lambda(lambda x: tf.add(x, shared_bias))(output_layer)
model = Model(inputs=input_layer, outputs=output_layer)
print(model.summary())

这是假设你的共同偏见是不可训练的。

最新更新