【发布时间】:2017-11-14 15:10:36
【问题描述】:
我正在创建一个自定义层,其权重需要在激活之前按元素相乘。当输出和输入的形状相同时,我可以让它工作。当我将一阶数组作为输入,将二阶数组作为输出时,就会出现问题。 tensorflow.multiply 支持广播,但是当我尝试在 Layer.call(x, self.kernel) 中使用它时 将 x 乘以 self.kernel 变量,它抱怨说它们是不同的形状:
ValueError: Dimensions must be equal, but are 4 and 3 for 'my_layer_1/Mul' (op: 'Mul') with input shapes: [?,4], [4,3].
这是我的代码:
from keras import backend as K
from keras.engine.topology import Layer
import tensorflow as tf
from keras.models import Sequential
import numpy as np
class MyLayer(Layer):
def __init__(self, output_dims, **kwargs):
self.output_dims = output_dims
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=self.output_dims,
initializer='ones',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x):
#multiply wont work here?
return K.tf.multiply(x, self.kernel)
def compute_output_shape(self, input_shape):
return (self.output_dims)
mInput = np.array([[1,2,3,4]])
inShape = (4,)
net = Sequential()
outShape = (4,3)
l1 = MyLayer(outShape, input_shape= inShape)
net.add(l1)
net.compile(loss='mean_absolute_error', optimizer='adam', metrics=['accuracy'])
p = net.predict(x=mInput, batch_size=1)
print(p)
编辑: 给定输入形状 (4,) 和输出形状 (4,3),权重矩阵应该与输出形状相同,并用 1 初始化。所以在上面的代码中输入是[1,2,3,4],权重矩阵应该是[[1,1,1,1],[1,1,1,1],[1,1,1 ,1]] 和输出应该看起来像 [[1,2,3,4],[1,2,3,4],[1,2,3,4]]
【问题讨论】:
-
考虑
tf.reshape方法 -
如果要逐元素乘法,为什么要更改输出形状?
-
如果我使用 tf.reshape,我想我必须手动复制每一行的值。我觉得 tf.multiply 应该可以工作,但也许我没有以正确的形式传递参数。
-
我希望输入在输出中的多行广播,如下所示:输入:[1,2,3] 输出:[[1,2,3],[1,2,3 ],[1,2,3]]
-
元素乘法如何参与其中?
标签: python tensorflow neural-network keras keras-layer