Python ValueError在Keras中构建具有2个输出的神经网络

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) 这是我的密码。我试图把它减少到最低限度,以便

我试图构建一个网络,它有一个输入X(大小为Xa*Xb的二维矩阵)和两个输出Y1和Y2(均为一维)。尽管我在下面发布的代码中不是这样,但Y1应该是一个输出一个热向量的分类器,Y2应该是用于回归的(原始代码引发了相同的错误)

在训练网络时,我遇到以下错误:

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()
层时,错误就消失了……这与网络的形状有关,但我仍然不明白这一切背后的真正原因

除非其他人发布了一些东西,否则我会将此标记为正确答案,因为它解决了问题。如果这不是正确的方法,请告诉我