在 Keras 中使用自定义步骤激活函数会导致“'tuple' object has no attribute '_keras_shape'”错误。如何解决这个问题?
Using a custom step activation function in Keras results in “'tuple' object has no attribute '_keras_shape'” error. How to resolve this?
我正在尝试在 Keras 模型的输出层中实现二进制自定义激活函数。
这是我的试用版:
def binary_activation(x):
ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)
def grad(dy):
return dy
return switch(x > 0.5, ones, zeros), grad
类似于。
但我收到以下错误:
文件“/usr/local/lib/python3.6/dist-packages/spyder_kernels/customize/spydercustomize.py”,第 786 行,在运行文件中
execfile(文件名,命名空间)
文件“/usr/local/lib/python3.6/dist-packages/spyder_kernels/customize/spydercustomize.py”,第 110 行,在 execfile 中
执行(编译(f.read(),文件名,'exec'),命名空间)
文件“/home/marlon/区域Trabalho/omj_project/predicting_change.py”,第 85 行,在
模型 = baseline_model()
文件“/home/marlon/区域 Trabalho/omj_project/predicting_change.py”,第 80 行,在 baseline_model
model.add(密集(1, 激活=binary_activation))
文件“/usr/local/lib/python3.6/dist-packages/keras/engine/sequential.py”,第 181 行,在添加
output_tensor = 图层(self.outputs[0])
文件“/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py”,第 497 行,在 call 中
参数=user_kwargs)
文件“/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py”,第 565 行,在 _add_inbound_node
output_tensors[i]._keras_shape = output_shapes[i]
AttributeError: 'tuple' 对象没有属性 '_keras_shape'
感谢您的帮助。
你需要添加
@tf.custom_gradient
在你的代码之上,就像你提到的其他评论一样。
@tf.custom_gradient
def binary_activation(x):
ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)
res = tf.keras.backend.switch(x > 0.5, ones, zeros)
def grad(dy):
return dy
return res, grad
我正在尝试在 Keras 模型的输出层中实现二进制自定义激活函数。
这是我的试用版:
def binary_activation(x):
ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)
def grad(dy):
return dy
return switch(x > 0.5, ones, zeros), grad
类似于
文件“/usr/local/lib/python3.6/dist-packages/spyder_kernels/customize/spydercustomize.py”,第 786 行,在运行文件中 execfile(文件名,命名空间)
文件“/usr/local/lib/python3.6/dist-packages/spyder_kernels/customize/spydercustomize.py”,第 110 行,在 execfile 中 执行(编译(f.read(),文件名,'exec'),命名空间)
文件“/home/marlon/区域Trabalho/omj_project/predicting_change.py”,第 85 行,在 模型 = baseline_model()
文件“/home/marlon/区域 Trabalho/omj_project/predicting_change.py”,第 80 行,在 baseline_model model.add(密集(1, 激活=binary_activation))
文件“/usr/local/lib/python3.6/dist-packages/keras/engine/sequential.py”,第 181 行,在添加 output_tensor = 图层(self.outputs[0])
文件“/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py”,第 497 行,在 call 中 参数=user_kwargs)
文件“/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py”,第 565 行,在 _add_inbound_node output_tensors[i]._keras_shape = output_shapes[i]
AttributeError: 'tuple' 对象没有属性 '_keras_shape'
感谢您的帮助。
你需要添加
@tf.custom_gradient
在你的代码之上,就像你提到的其他评论一样。
@tf.custom_gradient
def binary_activation(x):
ones = tf.ones(tf.shape(x), dtype=x.dtype.base_dtype)
zeros = tf.zeros(tf.shape(x), dtype=x.dtype.base_dtype)
res = tf.keras.backend.switch(x > 0.5, ones, zeros)
def grad(dy):
return dy
return res, grad