Python 3.x 使用model.fit()时的InvalidArgumentError
我正在尝试在keras/tensorflow中构建一个自定义层。目的是将其扩展为RNN。问题出现在训练过程中,显然,在训练过程中,输出形状和训练数据集不兼容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
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()
之前清除会话()。