首页 > 解决方案 > 如何从张量流中的多输入模型获得回归输出?

问题描述

在此处输入图像描述

这是我建立的模型,代码:

#---IMPORT DEPENDENCEIS-------------------------------------------------------+
import pandas as pd
import numpy as np
import random
import seaborn as sns
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.utils import plot_model

#---DATA----------------------------------------------------------------------+
D_tr = pd.read_csv('Training Data.csv')   # training data set
D_te = pd.read_csv('Test Data.csv')       # test data set

#---PREPROCESSING-------------------------------------------------------------+

# numerical inputs
def form_num(column,DF):
    df = DF[column].copy()
    df -= df.min()
    df /= df.max()
    return df

a_1 = form_num('income',D_tr)
a_2 = form_num('age',D_tr)
a_3 = form_num('experience',D_tr)
a_4 = form_num('current_job_years',D_tr)
a_5 = form_num('current_house_years',D_tr)

# categorical inputs
def form_cat(column,DF):
    df = DF[column].copy()
    df = pd.get_dummies(df)
    return df

a_6 = form_cat('married',D_tr)
a_7 = form_cat('house_ownership',D_tr)
a_7 = form_cat('car_ownership',D_tr)
a_8 = form_cat('profession',D_tr)
a_9 = form_cat('city',D_tr)
a_10 = form_cat('state',D_tr)

# targets
t = D_tr['risk_flag'].copy()

#---MODEL---------------------------------------------------------------------+
 
# branch data
branch_1_data = pd.concat((a_1,a_3,a_4,a_7),axis = 1)
branch_2_data = pd.concat((a_6,a_8,a_10),axis = 1)
branch_3_data = pd.concat((a_1,a_5,a_9,a_10),axis = 1)

# branch_1 map
branch_1_input = keras.Input(shape = (branch_1_data.shape[1],),name = 'branch_1_input')
branch_1_layer = layers.Dense(10,activation = 'relu')(branch_1_input)
branch_1_output = layers.Dense(1,activation = 'relu')(branch_1_layer)

# branch_2 map
branch_2_input = keras.Input(shape = (branch_2_data.shape[1],),name = 'branch_2_input')
branch_2_layer = layers.Dense(10,activation = 'relu')(branch_2_input)
branch_2_output = layers.Dense(1,activation = 'relu')(branch_2_layer)

# branch_3 map
branch_3_input = keras.Input(shape = (branch_3_data.shape[1],),name = 'branch_3_input')
branch_3_layer = layers.Dense(10,activation = 'relu')(branch_3_input)
branch_3_output = layers.Dense(1,activation = 'relu')(branch_3_layer)

# stem join
stem = layers.concatenate([branch_1_output,branch_2_output,branch_3_output])

# trunk map
trunk_1 = layers.Dense(10,activation = 'relu')(stem)
trunk_2 = layers.Dense(5,activation = 'relu')(trunk_1)
trunk_output = layers.Dense(1)(trunk_2)

# Distributed Attribute Learning Deep Neural Network
DAL_DNN = keras.Model(inputs = [branch_1_input,
                                branch_2_input,
                                branch_3_input],
                      outputs = trunk_output)

DAL_DNN.compile(
    optimizer = tf.keras.optimizers.Adam(
        learning_rate=0.001,
        beta_1=0.9,beta_2=0.999,
        epsilon=1e-07,
        amsgrad=False,
        name="Adam"),
    loss = 'mse'
    )

callback = EarlyStopping(monitor = 'loss',patience = 3)

history = DAL_DNN.fit(
    x = {'branch_1_input':branch_1_data,
         'branch_2_input':branch_2_data,
         'branch_3_input':branch_3_data},
    y = t,
    epochs = 1,
    batch_size = 20,
    validation_split = 0.2,
    callbacks = [callback],
    verbose = 1)

i = [[{'branch_1_input':branch_1_data.iloc[0],
     'branch_2_input':branch_2_data.iloc[0],
     'branch_3_input':branch_3_data.iloc[0]}],
     [{'branch_1_input':branch_1_data.iloc[0],
     'branch_2_input':branch_2_data.iloc[0],
     'branch_3_input':branch_3_data.iloc[0]}]]

j = [
     [
      branch_1_data.iloc[0].to_numpy(),
      branch_2_data.iloc[0].to_numpy(),
      branch_3_data.iloc[0].to_numpy()
      ],
     [
      branch_1_data.iloc[0].to_numpy(),
      branch_2_data.iloc[0].to_numpy(),
      branch_3_data.iloc[0].to_numpy()
      ]
     ]

代码的最后一部分有两个输入ij我想将它们提供给网络,我希望得到一个回归输出,但首先这是一个多输入模型,所以我不知道如何格式化要提供给的输入model.predict(),并且对于两者i以及j何时model.predict()抛出错误:

ValueError: Data cardinality is ambiguous:
  x sizes: 5, 82, 348, 5, 82, 348
Make sure all arrays contain the same number of samples.

如何获得回归输出model.predict()

标签: pythonpandastensorflowkerasdeep-learning

解决方案


推荐阅读