我有一个自定义的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。