Python 如何处理不同形状的属性来训练神经网络

Python 如何处理不同形状的属性来训练神经网络,python,python-3.x,neural-network,Python,Python 3.x,Neural Network,最初,我有一个具有2个属性的数据集: 一个称为“feature”的常规属性。该属性的每个元素都是shape=(13,87)的矩阵 标签(我想预测的功能) 此数据集可通过以下链接获得: 我通过执行以下代码,使用此数据集构建了一个神经网络: import pandas as pd import numpy as np from keras.models import Sequential from keras.layers import Dense, Dropout, Activati

最初,我有一个具有2个属性的数据集:

  • 一个称为“feature”的常规属性。该属性的每个元素都是shape=(13,87)的矩阵
  • 标签(我想预测的功能)
此数据集可通过以下链接获得:

我通过执行以下代码,使用此数据集构建了一个神经网络:

    import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics
from sklearn.model_selection import StratifiedKFold

from sklearn.preprocessing import LabelEncoder
from keras.utils import to_categorical

num_rows = 13
num_columns = 87
num_channels = 1
seed = 2001

path = 'C:/Users/lione/OneDrive/Bureau/Lionel/LDK_360/Projets/Fexy-consign/Data/cleaned_dataset.xlsx'

featuresdf = pd.read_excel(path)

X = np.array(featuresdf.feature.tolist())
y = np.array(featuresdf.label.tolist())

kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
cvscores = []

X = X.reshape(X.shape[0], num_rows, num_columns, num_channels)

for train, test in kfold.split(X, y):
  print(X[train].shape)


  le = LabelEncoder()
  yy = to_categorical(le.fit_transform(y)) 
  num_labels = yy.shape[1]
  num_labels = 5
  filter_size = 2

# Construct model 
  model = Sequential()
  model.add(Conv2D(filters=16, kernel_size=2, input_shape=(num_rows, num_columns, num_channels), activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))

  model.add(Conv2D(filters=32, kernel_size=2, activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))

  model.add(Conv2D(filters=64, kernel_size=2, activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))

  model.add(Conv2D(filters=128, kernel_size=2, activation='relu'))
  model.add(MaxPooling2D(pool_size=1))
  model.add(Dropout(0.5))
  model.add(GlobalAveragePooling2D())

  model.add(Dense(num_labels, activation='softmax'))
  # Compile model
  model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  #Fit the model
  model.fit(X[train], yy[train], epochs=100, batch_size=32, verbose=2)
  # evaluate the model
  scores = model.evaluate(X[test], yy[test], verbose=2)
  print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
  cvscores.append(scores[1] * 100)
我执行了一些附加测试,我将向这个初始数据集中添加几个属性

这些附加属性包含一个唯一的实际值

因此,生成的数据集将如下所示:

feature feature_1 feature_2 feature_3  label
[[...]]   1            2        3       class1
[[...]]   4            5        6       class2
   .      .            .        .         .
[[...]]   12           13       14       class5
我的问题是:

  • 如何处理具有不同形状属性的数据集?
    • 如果可行,我应该如何修改Python脚本来处理这样的数据集
    • 还是我应该训练几个模特

谢谢。

你可以训练一个模型,但你必须重新调整它。您需要有两个输入分支。第一种方法处理3D数据以应用卷积。第二个分支处理密集要素,这些要素是您创建的新要素。我给你们提供了一个虚拟的例子,在这里我训练这种模型

# define param
n_sample = 100
num_rows = 13
num_columns = 87
num_channels = 1
n_new_features = 4
num_labels = 5

# define data
X = np.random.uniform(0,1, (n_sample,num_rows,num_columns,num_channels))
X_new = np.random.uniform(0,1, (n_sample,n_new_features))
y = np.random.randint(0,2, (n_sample,num_labels))

# conv part
inp = Input((num_rows,num_columns,num_channels))
x = Conv2D(16, 3, activation='relu')(inp)
x = Flatten()(x)

# new dense part
inp_new = Input((n_new_features))
x_new = Dense(16, activation='relu')(inp_new)

# concat dense and conv
xx = Concatenate()([x,x_new])
out = Dense(num_labels, activation='softmax')(xx)

# define model
model = Model([inp,inp_new],out)
model.compile('adam','categorical_crossentropy')

model.fit([X,X_new], y, epochs=10)

如果有问题,请告诉我谢谢您的帮助@Marco Cerliani!我目前收集了一些数据来构建“新”属性。当我完成这项任务时(在本周末),我可以使用你的脚本来构建我的神经网络,如果有问题,我会告诉你。祝您有个美好的一天!你好,太好了!我的脚本是一个简单的教程,您必须根据需要进行调整和自定义。别忘了接受它作为答案;-)我终于找到了我提到的错误的修复方法:我使用了“inp_new=Input([n_new_features])”而不是“inp_new=Input((n_new_features))”……通过这样做,您的代码可以很好地工作。先验地,我认为(在适应了我自己的用例之后),您的代码没有理由不能处理我未来的数据。因此,我将接受你的答案。非常感谢。