Python ValueError在Keras中构建具有2个输出的神经网络
我试图构建一个网络,它有一个输入X(大小为Xa*Xb的二维矩阵)和两个输出Y1和Y2(均为一维)。尽管我在下面发布的代码中不是这样,但Y1应该是一个输出一个热向量的分类器,Y2应该是用于回归的(原始代码引发了相同的错误) 在训练网络时,我遇到以下错误:Python ValueError在Keras中构建具有2个输出的神经网络,python,python-3.x,tensorflow,keras,Python,Python 3.x,Tensorflow,Keras,我试图构建一个网络,它有一个输入X(大小为Xa*Xb的二维矩阵)和两个输出Y1和Y2(均为一维)。尽管我在下面发布的代码中不是这样,但Y1应该是一个输出一个热向量的分类器,Y2应该是用于回归的(原始代码引发了相同的错误) 在训练网络时,我遇到以下错误: ValueError:形状(无,无)和(无,17,29)不兼容 显然,(None,17,29)转换为(None,size_-Xa,size_-Y1),我不明白为什么Xa和Y1首先应该相关(独立于Xb) 这是我的密码。我试图把它减少到最低限度,以便
ValueError:形状(无,无)和(无,17,29)不兼容
显然,(None,17,29)
转换为(None,size_-Xa,size_-Y1)
,我不明白为什么Xa和Y1首先应该相关(独立于Xb)
这是我的密码。我试图把它减少到最低限度,以便更容易理解
import numpy as np
from keras.layers import Dense, LSTM, Input
from keras.models import Model
def dataGenerator():
while True:
yield makeBatch()
def makeBatch():
"""generates a batch of artificial training data"""
x_batch, y_batch = [], {}
x_batch = np.random.rand(batch_size, size_Xa, size_Xb)
#x_batch = np.random.rand(batch_size, size_Xa)
y_batch['output1'] = np.random.rand(batch_size, size_Y1)
y_batch['output2'] = np.random.rand(batch_size, size_Y2)
return x_batch, y_batch
def generate_model():
input_layer = Input(shape=(size_Xa, size_Xb))
#input_layer = Input(shape=(size_Xa))
common_branch = Dense(128, activation='relu')(input_layer)
branch_1 = Dense(size_Y1, activation='softmax', name='output1')(common_branch)
branch_2 = Dense(size_Y2, activation='relu', name='output2')(common_branch)
model = Model(inputs=input_layer,outputs=[branch_1,branch_2])
losses = {"output1":"categorical_crossentropy", "output2":"mean_absolute_error"}
model.compile(optimizer="adam",
loss=losses,
metrics=['accuracy'])
return model
batch_size=5
size_Xa = 17
size_Xb = 13
size_Y2 = 100
size_Y1 = 29
model = generate_model()
model.fit( x=dataGenerator(),
steps_per_epoch=50,
epochs=15,
validation_data=dataGenerator(), validation_steps=50, verbose=1)
如果我在makeBatch中取消注释2条注释行并生成_模型,错误就会消失。因此,如果输入X是一维的,它将运行,但是当我将其更改为二维时(其他所有内容保持不变),会出现错误
这是否与具有2个输出的架构相关?我想这里有些东西我遗漏了,欢迎任何帮助
我添加完整的错误日志以供参考:
Epoch 1/15
Traceback (most recent call last):
File "neuralnet_minimal.py", line 41, in <module>
model.fit( x=dataGenerator(),
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 66, in _method_wrapper
return method(self, *args, **kwargs)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 848, in fit
tmp_logs = train_function(iterator)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 580, in __call__
result = self._call(*args, **kwds)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 627, in _call
self._initialize(args, kwds, add_initializers_to=initializers)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 505, in _initialize
self._stateful_fn._get_concrete_function_internal_garbage_collected( # pylint: disable=protected-access
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 2446, in _get_concrete_function_internal_garbage_collected
graph_function, _, _ = self._maybe_define_function(args, kwargs)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 2777, in _maybe_define_function
graph_function = self._create_graph_function(args, kwargs)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 2657, in _create_graph_function
func_graph_module.func_graph_from_py_func(
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py", line 981, in func_graph_from_py_func
func_outputs = python_func(*func_args, **func_kwargs)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py", line 441, in wrapped_fn
return weak_wrapped_fn().__wrapped__(*args, **kwds)
File "/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/framework/func_graph.py", line 968, in wrapper
raise e.ag_error_metadata.to_exception(e)
ValueError: in user code:
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:571 train_function *
outputs = self.distribute_strategy.run(
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:951 run **
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
return fn(*args, **kwargs)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:532 train_step **
loss = self.compiled_loss(
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/compile_utils.py:205 __call__
loss_value = loss_obj(y_t, y_p, sample_weight=sw)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/losses.py:143 __call__
losses = self.call(y_true, y_pred)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/losses.py:246 call
return self.fn(y_true, y_pred, **self._fn_kwargs)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/losses.py:1527 categorical_crossentropy
return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/backend.py:4561 categorical_crossentropy
target.shape.assert_is_compatible_with(output.shape)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/framework/tensor_shape.py:1117 assert_is_compatible_with
raise ValueError("Shapes %s and %s are incompatible" % (self, other))
ValueError: Shapes (None, None) and (None, 17, 29) are incompatible
纪元1/15
回溯(最近一次呼叫最后一次):
文件“neuralnet_minimal.py”,第41行,在
model.fit(x=dataGenerator(),
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/keras/engine/training.py”,第66行,在方法包装中
返回方法(self、*args、**kwargs)
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/keras/engine/training.py”,第848行
tmp_logs=训练函数(迭代器)
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/eager/def_function.py”,第580行,在__
结果=自身调用(*args,**kwds)
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/eager/def_function.py”,第627行,在调用中
self.\u初始化(参数、KWD、添加初始值设定项到=初始值设定项)
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/eager/def_function.py”,第505行,在
self._stateful_fn._get_concrete_function_internal_garbage_collected(#pylint:disable=protected access
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/eager/function.py”,第2446行,位于“获取混凝土”函数“内部垃圾”收集中
图函数,自我,可能定义函数(args,kwargs)
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/eager/function.py”,第2777行,在函数定义中
graph\u function=self.\u create\u graph\u function(args,kwargs)
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/eager/function.py”,第2657行,在“创建图形”函数中
func_graph_module.func_graph_from_py_func(
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/framework/func_graph.py”,第981行,在_py_func的func_图中
func_outputs=python_func(*func_args,**func_kwargs)
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/eager/def_function.py”,第441行,包装为
返回弱_-wrapped_-fn()
文件“/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/framework/func_graph.py”,第968行,在包装器中
将e.ag\u错误\u元数据引发到\u异常(e)
ValueError:在用户代码中:
/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/keras/engine/training.py:571 train_函数*
输出=self.distribution\u strategy.run(
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_-lib.py:951运行**
返回self.\u扩展。为每个\u副本调用\u(fn,args=args,kwargs=kwargs)
/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/distribute/distribute\u lib.py:2290为每个副本调用
返回自我。为每个副本(fn、ARG、kwargs)调用
/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/distribute/distribute\u lib.py:2649\u调用每个副本
返回fn(*args,**kwargs)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:532训练步骤**
损耗=自编的损耗(
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/compile\u-utils.py:205\u调用__
损耗值=损耗对象(y\u t,y\u p,样品重量=sw)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/loss.py:143\u调用__
损失=自我调用(y_true,y_pred)
/path/of/my/project/venv/lib/python3.8/site-packages/tensorflow/python/keras/loss.py:246调用
返回self.fn(y_true,y_pred,**self.\u fn\u kwargs)
/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/keras/loss.py:1527 category\u crossentropy
返回K.categorical\u crossentropy(y\u true,y\u pred,from\u logits=from\u logits)
/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/keras/backend.py:4561 category\u crossentropy
target.shape.assert\u与(output.shape)兼容
/path/of/my/project/venv/lib/python3.8/site packages/tensorflow/python/framework/tensor\u shape.py:1117 assert\u与
raise VALUERROR(“形状%s和%s不兼容”%(自身、其他))
ValueError:形状(无,无)和(无,17,29)不兼容
奇怪的是,当我在网络分裂之前添加一个flant()
层时,错误就消失了……这与网络的形状有关,但我仍然不明白这一切背后的真正原因
除非其他人发布了一些东西,否则我会将此标记为正确答案,因为它解决了问题。如果这不是正确的方法,请告诉我