Keras:带有矩阵乘法的自定义图层在正确时会产生尺寸错误

时间:2019-02-11 17:54:43

标签: keras keras-layer

我有一个自定义的keras图层,该图层接受具有相同大小的多个矢量(例如:3个输入矢量的列表,每个矢量的长度为10。在keras中,每个输入矢量的形状为(?,10)。 )

在调用部分下的自定义层中,我首先堆叠这三个向量以形成形状(?,3,10),其中每个向量成为行向量,并且这三个向量合并以形成矩阵x(不包括批次尺寸)。

然后,x乘以权重矩阵w,该权重矩阵的大小为(3,3),没有批次尺寸。权重矩阵在自定义层的构建部分中定义。

对结果y进行置换,使批次尺寸再次成为第一维。

最后,该图层必须输出3个长度与原始输入相同的向量。因此,我沿轴= 1切片以给出3个张量,每个张量的大小相同(?,10)。

我尝试了一个测试用例,它似乎可以工作。但是,当我调用模型并为model.summary()创建一行时,它出现以下错误: ValueError:尺寸必须相等,但输入形状为[3,3],[0]的“添加”(操作:“添加”)的尺寸应为3和0。

我尝试了包括K.batch_dot()在内的各种解决方案,但是对于batch_dot(),由于尺寸错误,我无法使其正常工作...

谢谢您的帮助!

已解决

替换

self.trainable_weights = self._w

使用

self.trainable_weights.append(self._w)

Ph

# Test Case
import keras.backend as K
a = K.variable(np.array([[1,2,3],[4,5,6],[7,8,9]]))
b = K.variable(np.repeat(np.array([[1,1,10,1,1],[2,2,20,2,2],[3,3,30,3,3]])[np.newaxis,:],repeats=10,axis=0))
c = K.dot(a,b)
c = K.permute_dimensions(c,pattern=(1,0,2))
y = K.eval(c)
print(y)
print(c.shape)  # (10, 3, 5)

# Custom layer build part
def build(self, input_shape):
    # input_shape should be a list, since cross stitch must take in inputs from all the individual tasks.
    self._input_count = len(input_shape)
    w = np.identity(self._input_count) * 0.9
    inverse_diag_mask = np.invert(np.identity(self._input_count, dtype=np.bool))
    off_value = 0.1 / (self._input_count - 1)
    w[inverse_diag_mask] = off_value
    self._w = K.variable(np.array(w))
    self.trainable_weights = self._w

    super(CrossStitchLayer, self).build(input_shape)

# Custom layer call part
def call(self, x, **kwargs):
    temp = x  # to show shape
    x = K.stack(x, axis=1)
    y1 = K.dot(self._w, x)
    y = K.permute_dimensions(y1, pattern=(1, 0, 2))
    results = []
    for idx in range(self._input_count):
        results.append(y[:, idx, :])
    return results

完整错误消息:

回溯(最近通话最近):   _create_c_op中第1628行的文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py”     c_op = c_api.TF_FinishOperation(op_desc) tensorflow.python.framework.errors_impl.InvalidArgumentError:尺寸必须相等,但输入形状为[3,3],[0]的“ add”(op:“ Add”)的尺寸应为3和0。

在处理上述异常期间,发生了另一个异常:

回溯(最近通话最近):   文件“ C:/Users/limka/Desktop/Python/strain_sensor/run_cross_validation.py”,第10行,在     k_folds = 10,k_shuffle = True,save_model = False,save_model_name = None,save_model_dir ='。/ save / models /')   在run_skf中的文件“ C:\ Users \ limka \ Desktop \ Python \ strain_sensor \ own_package \ cross_validation.py”,第57行     型号= MTmodel(fl = ss_fl,mode = model_mode,hparams = hparams,labels_norm = True)    init 中的文件“ C:\ Users \ limka \ Desktop \ Python \ strain_sensor \ own_package \ models.py”,行217     cs_model = cross_stitch(self.features_dim,self.labels_dim,self.hparams)   文件“ C:\ Users \ limka \ Desktop \ Python \ strain_sensor \ own_package \ models.py”,第193行,在cross_stitch中     model.summary()   文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ keras \ engine \ network.py”,摘要1260行     print_fn = print_fn)   文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ keras \ utils \ layer_utils.py”,行166,在print_summary中     print_layer_summary_with_connections(layers [i])   文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ keras \ utils \ layer_utils.py”,行153,在print_layer_summary_with_connections中     layer.count_params(),   在count_params中,文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ keras \ engine \ base_layer.py”,行1129     返回count_params(self.weights)   文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ keras \ engine \ base_layer.py”,行1022,权重     返回self.trainable_weights + self.non_trainable_weights   _run_op中的第856行的文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ ops \ variables.py”     返回getattr(ops.Tensor,operator)(a._AsTensor(),* args)   文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ ops \ math_ops.py”,第878行,位于binary_op_wrapper中     返回func(x,y,name = name)   添加文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ ops \ gen_math_ops.py”,     “添加”,x = x,y = y,名称=名称)   _apply_op_helper中的第787行“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ framework \ op_def_library.py”     op_def = op_def)   文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ util \ deprecation.py”,行488,在new_func中     return func(* args,** kwargs)   在create_op中的第3274行,文件``C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py''     op_def = op_def)   文件“ C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py”,行1792,在 init 中     control_input_ops)   文件``C:\ Users \ limka \ Anaconda3 \ envs \ my-rdkit-env \ lib \ site-packages \ tensorflow \ python \ framework \ ops.py'',行163_,位于_create_c_op中     引发ValueError(str(e)) ValueError:尺寸必须相等,但输入形状为[3,3],[0]的“添加”(操作:“添加”)的尺寸应为3和0。

0 个答案:

没有答案