我正在尝试对Keras张量(带有TF后端)应用按功能进行特征缩放和平移(也称为仿射变换-该想法在此提要的文章的术语部分中进行了描述)。
我想转换的张量称为X卷积层的输出,并且具有shape (B,H,W,F),表示(批大小,高度,宽度,特征图的数量)。
我变换的参数是二维(B,F)张量,beta和gamma。
我想要X * gamma + beta或更具体地讲,
for b in range(B):
for f in range(F):
X[b,:,:,f] = X[b,:,:,f] * gamma[b,f] + beta[b,f]
Run Code Online (Sandbox Code Playgroud)
但是,这两种方法都无法在Keras中使用。第二个,按元素分配,由于
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
并且应该是相当低效的。
第一次失败的方式对我来说更神秘,但我的猜测是这是广播的问题。在下面的完整代码+追溯中,您可以看到我的尝试。
需要注意的两件事是,错误仅在训练时发生(而不是在编译时发生),并且'transform_vars'至少根据模型摘要,似乎从未使用过输入。
关于如何实现这一点的任何想法?
import numpy as np
import keras as ks
import keras.backend as K
print(ks.__version__)
# Load example data (here MNIST)
from keras.datasets import mnist
(x_img_train, y_train), _ = mnist.load_data() …Run Code Online (Sandbox Code Playgroud)