Python 3.x 使用model.fit()时的InvalidArgumentError

Python 3.x 使用model.fit()时的InvalidArgumentError,python-3.x,tensorflow,keras,Python 3.x,Tensorflow,Keras,我正在尝试在keras/tensorflow中构建一个自定义层。目的是将其扩展为RNN。问题出现在训练过程中,显然,在训练过程中,输出形状和训练数据集不兼容 X_train.shape (100, 5) X_target.shape (100, 5) 这是自定义图层: class MyLayer(Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim

我正在尝试在keras/tensorflow中构建一个自定义层。目的是将其扩展为RNN。问题出现在训练过程中,显然,在训练过程中,输出形状和训练数据集不兼容

X_train.shape
(100, 5)
X_target.shape
(100, 5)
这是自定义图层:

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        print(self.output_dim)
        print(input_shape)
        # Create a trainable weight variable for this layer.

        self.kernel = self.add_weight(name='kernel', 
                                  shape=(self.output_dim,   input_shape[1]), 
                                  initializer='uniform',
                                  trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this at the end

    def call(self, x):
        print('shape x: ')
        print(x.shape)
        print('shape kernel: ')
        print(self.kernel.shape)
        matrix = tf.transpose(self.kernel)
        print('matrix')
        print(matrix.shape)
        prod = K.dot(x, matrix)
        print('after product')
        print(prod.shape)

        return prod

    def compute_output_shape(self, input_shape):
        print('Compute output shape')
        print(input_shape)
        print(self.output_dim)
        return (input_shape[0], self.output_dim)

model = Sequential()
model.add(MyLayer(5, batch_input_shape=(100, 5)))
model.compile(optimizer='adam', loss='mse')
# fit model
model.fit(X_train, X_target)

tf.keras.__version__ = '2.1.6-tf'
由于我通过了形状为(100,5)的x_训练,我希望通过将其乘以(5,5)矩阵,我将得到一个与目标形状相同的矩阵(100,5),因此,在这种情况下,我将能够训练一个5x5权重矩阵。相反,我得到的是:

InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-77-4dee23ead957> in <module>()
      6 model.compile(optimizer='adam', loss='mse')
      7 # fit model
----> 8 model.fit(X_train, X_target)#, epochs=300, verbose=0)

~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
   1037                                         initial_epoch=initial_epoch,
   1038                                         steps_per_epoch=steps_per_epoch,
-> 1039                                         validation_steps=validation_steps)
   1040 
   1041     def evaluate(self, x=None, y=None,

~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/engine/training_arrays.py in fit_loop(model, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)
    197                     ins_batch[i] = ins_batch[i].toarray()
    198 
--> 199                 outs = f(ins_batch)
    200                 outs = to_list(outs)
    201                 for l, o in zip(out_labels, outs):

~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs)
   2713                 return self._legacy_call(inputs)
   2714 
-> 2715             return self._call(inputs)
   2716         else:
   2717             if py_any(is_tensor(x) for x in inputs):

~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py in _call(self, inputs)
   2673             fetched = self._callable_fn(*array_vals, run_metadata=self.run_metadata)
   2674         else:
-> 2675             fetched = self._callable_fn(*array_vals)
   2676         return fetched[:len(self.outputs)]
   2677 

~/anaconda3/envs/ldsa/lib/python3.5/site-packages/tensorflow/python/client/session.py in __call__(self, *args, **kwargs)
   1380           ret = tf_session.TF_SessionRunCallable(
   1381               self._session._session, self._handle, args, status,
-> 1382               run_metadata_ptr)
   1383         if run_metadata:
   1384           proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

~/anaconda3/envs/ldsa/lib/python3.5/site-packages/tensorflow/python/framework/errors_impl.py in __exit__(self, type_arg, value_arg, traceback_arg)
    517             None, None,
    518             compat.as_text(c_api.TF_Message(self.status.status)),
--> 519             c_api.TF_GetCode(self.status.status))
    520     # Delete the underlying status object from memory otherwise it stays alive
    521     # as there is a reference to status from this from the traceback due to

InvalidArgumentError: Incompatible shapes: [100,5] vs. [32,5]
     [[Node: training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _class=["loc:@training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_grad/Reshape"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_grad/Shape, training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_grad/Shape_1)]]
InvalidArgumentError回溯(最近一次调用上次)
在()
6.model.compile(优化器='adam',loss='mse')
7#拟合模型
---->8模型拟合(X_序列,X_目标)#,历元=300,详细=0)
~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/engine/training.py in-fit(self、x、y、批量大小、历元、详细信息、回调、验证拆分、验证数据、无序排列、类权重、样本权重、初始历元、每个历元的步骤、验证步骤、**kwargs)
1037初始纪元=初始纪元,
1038步/u历元=步/u历元,
->1039验证步骤=验证步骤)
1040
1041 def评估(自我,x=无,y=无,
~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/engine/training\u arrays.py in-fit\u循环(模型、f、ins、out\u标签、批次大小、历元、冗余、回调、val\u f、val\u-ins、随机、回调度量、初始历元、每个历元的步骤、验证步骤)
197 ins_批次[i]=ins_批次[i].toarray()
198
-->199输出=f(输入/输出批次)
200个出局=待办名单(出局)
201用于l,o-in-zip(out_标签,out):
~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/backend/tensorflow\u backend.py in\uuuuu调用(self,输入)
2713返回自。\u传统\u调用(输入)
2714
->2715返回自调用(输入)
2716其他:
2717如果py_有(输入中x的张量为x):
调用中的~/anaconda3/envs/ldsa/lib/python3.5/site-packages/keras/backend/tensorflow\u backend.py(自我,输入)
2673 fetched=self.\u callable\u fn(*array\u vals,run\u metadata=self.run\u metadata)
2674其他:
->2675 fetched=self.\u callable\u fn(*array\u vals)
2676获取的返回[:len(自输出)]
2677
~/anaconda3/envs/ldsa/lib/python3.5/site-packages/tensorflow/python/client/session.py在调用中(self,*args,**kwargs)
1380 ret=tf_session.tf_SessionRunCallable(
1381 self.\u session.\u session,self.\u句柄,参数,状态,
->1382运行(元数据)
1383如果运行\u元数据:
1384 proto_data=tf_session.tf_GetBuffer(run_metadata_ptr)
~/anaconda3/envs/ldsa/lib/python3.5/site-packages/tensorflow/python/framework/errors\u impl.py in\uuuuuuu exit\uuuuuuuuu(self,type\u arg,value\u arg,traceback\u arg)
517没有,没有,
518 compat.as_text(c_api.TF_消息(self.status.status)),
-->519 c_api.TF_GetCode(self.status.status))
520#从内存中删除基础状态对象,否则它将保持活动状态
521#由于以下原因,在回溯中有一个状态参考:
InvalidArgumentError:不兼容的形状:[100,5]与[32,5]
[[Node:training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_grad/BroadcastGradientArgs=BroadcastGradientArgs[T=DT_INT32,_class=[[loc:@training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_Grade/Reformate],_device=“/job:localhost/replica:0/task:0/device:CPU:0](training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_grad/Shape,training_12/Adam/gradients/loss_17/my_layer_19_loss/sub_grad/Shape_1)]]

我的惊讶来自于:不兼容的形状:[100,5]与[32,5],这32从何而来?

自动命名的实例吓坏了我!我看到“training_12”和“loss_17”以及“My_layer_19_loss”,这让我想
导入keras.backend作为K
K。在
model=Sequential()之前清除会话()
。自动命名实例让我害怕!我看到“training_12”、“loss_17”和“my_layer_19_loss”,这让我想
将keras.backend导入为K
K。在
model=Sequential()
之前清除会话()。