Tensorflow NN 架构不兼容的形状

Tensorflow NN architecture incompatible shape

我正在尝试使用 Tensorflow 创建多任务神经网络。以下是我正在尝试开发的架构:

METRICS= [tf.keras.metrics.TruePositives(name='TP'),
         tf.keras.metrics.FalsePositives(name='FP'),
         tf.keras.metrics.TrueNegatives(name='TN'),
         tf.keras.metrics.FalseNegatives(name='FN'),
         tf.keras.metrics.Precision(name='precision'),
         tf.keras.metrics.Recall(name='recall'),
         tf.keras.metrics.AUC(curve='PR', name='PR-AUC')]

input_shape = (X_train.shape[1],)
inputlayer = tf.keras.layers.Input(shape=input_shape)
l1 = tf.keras.layers.Dense(input_shape[0]*2, activation= 'relu')(inputlayer)
l2 = tf.keras.layers.Dropout(0.1)(l1)
l3 =  tf.keras.layers.Dense(int(input_shape[0]/2), activation='relu')(l2)
output1 = tf.keras.layers.Dense(1, activation='sigmoid', name = 'output1')(l3)
output2 = tf.keras.layers.Dense(10, activation='softmax', name = 'output2')(l3)
output3 = tf.keras.layers.Dense(12, activation='softmax', name = 'output3')(l3)

model = tf.keras.Model(inputs=inputlayer, outputs=[output1, output2, output3])

model.compile(loss={"output1": 'binary_crossentropy',
                    "output2": 'categorical_crossentropy',
                    "output3": 'categorical_crossentropy'},
              optimizer=tf.keras.optimizers.Adam(learning_rate=.01), 
              metrics = METRICS, loss_weights = [1, 1e-1, 1e-1])

这是模型架构:

然后我尝试像这样训练模型:

BATCH_SIZE= 20

model.fit(X_train, [y1_train,y2_train,y3_train], batch_size=BATCH_SIZE, epochs=10, verbose=0)

但是我遇到了以下问题:

ValueError: Shapes (None, 1) and (None, 10) are incompatible

我已经验证了每个输出的标签,分别是2、10和12 我不明白到底是什么问题,谁能给我一个建议吗?

我认为您可能搞错了标签的顺序。这是一个工作示例:

import tensorflow as tf 

METRICS= [tf.keras.metrics.TruePositives(name='TP'),
         tf.keras.metrics.FalsePositives(name='FP'),
         tf.keras.metrics.TrueNegatives(name='TN'),
         tf.keras.metrics.FalseNegatives(name='FN'),
         tf.keras.metrics.Precision(name='precision'),
         tf.keras.metrics.Recall(name='recall'),
         tf.keras.metrics.AUC(curve='PR', name='PR-AUC')]

input_shape = (31,)
inputlayer = tf.keras.layers.Input(shape=input_shape)
l1 = tf.keras.layers.Dense(input_shape[0]*2, activation= 'relu')(inputlayer)
l2 = tf.keras.layers.Dropout(0.1)(l1)
l3 =  tf.keras.layers.Dense(int(input_shape[0]/2), activation='relu')(l2)
output1 = tf.keras.layers.Dense(1, activation='sigmoid', name = 'output1')(l3)
output2 = tf.keras.layers.Dense(10, activation='softmax', name = 'output2')(l3)
output3 = tf.keras.layers.Dense(12, activation='softmax', name = 'output3')(l3)

model = tf.keras.Model(inputs=inputlayer, outputs=[output1, output2, output3])

model.compile(loss={"output1": 'binary_crossentropy',
                    "output2": 'categorical_crossentropy',
                    "output3": 'categorical_crossentropy'},
              optimizer=tf.keras.optimizers.Adam(learning_rate=.01), 
              metrics = METRICS, loss_weights = [1, 1e-1, 1e-1])

y1_train, y2_train, y3_train = tf.random.uniform((50, 1), maxval=2), tf.random.uniform((50, 10), maxval=11), tf.random.uniform((50, 12), maxval=13)
model.fit(tf.random.normal((50, 31)), [y1_train,y2_train,y3_train], batch_size=20, epochs=10)

您需要确保 y1_trainy2_trainy3_train 的顺序正确且形状正确,即 (samples, 1)(samples, 10),和 (samples, 12)