Numpy Keras Deep NN不包括所有类别

Numpy Keras Deep NN不包括所有类别,numpy,tensorflow,keras,neural-network,multiclass-classification,Numpy,Tensorflow,Keras,Neural Network,Multiclass Classification,我制作了一个模型,经过训练,可以预测34-63之间的数字(无小数),即30个潜在输出 当我运行模型时,它会抱怨并希望我在最后一层中输入15,我知道这应该是输出的数量 在终端经过培训后,我还获得以下输出: ValueError: y_true and y_pred contain different number of classes 7, 16. Please provide the true labels explicitly through the labels argument. Clas

我制作了一个模型,经过训练,可以预测34-63之间的数字(无小数),即30个潜在输出

当我运行模型时,它会抱怨并希望我在最后一层中输入15,我知道这应该是输出的数量

在终端经过培训后,我还获得以下输出:

ValueError: y_true and y_pred contain different number of classes 7, 16. Please provide the true labels explicitly through the labels argument. Classes found in y_true: [51 52 53 54 56 59 63]
当我运行模型时,使用:

prediction = model.predict(test)
print(model.predict(test))
print(np.argmax(model.predict(test), axis=-1))
我得到:

警告:tensorflow:最近19次调用中有6次触发了tf.function回溯。跟踪代价高昂,跟踪次数过多可能是由于(1)在循环中重复创建@tf.function,(2)传递不同形状的张量,(3)传递Python对象而不是张量。对于(1),请在循环之外定义@tf.function。对于(2),@tf.function具有实验性的_relax_shapes=True选项,该选项可以松弛参数形状,从而避免不必要的回溯。有关(3),请参阅和了解更多详细信息

[[0.00006836 0.33038142 0.22732003 0.03764497 0.22742009 0.01213347
  0.16344884 0.00000338 0.0012028  0.00014862 0.00000717 0.00017032
  0.00000437 0.00001909 0.00002712]]
[1]
我猜矩阵应该是所有的大小,但只有15个。我已经查看了我的数据集,所有类都至少有3个实例,因此它们应该包含在培训中

#更新我已经包括下面的模型

np.set_printoptions(suppress=True)
pd.set_option("display.max_rows", None, "display.max_columns", None)
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)

Labeldata = ['Output_Label']

RelevantFeatures = ['column A','column B','column X']
RelevantFeaturesandlabel = ['column A','column B','column X','Output_Label']

PATH = 'Training_Data.xlsx'
PATHVa = 'Validation_Data.xlsx'

Full_Data = pd.read_excel(PATH)
ValidationFull = pd.read_excel(PATHVa)

# Which range of outputs should be included
Full_Data = Full_Data[(Full_Data['Output_Label'] >= 34) & (Full_Data['Output_Label'] <= 70)]
ValidationFull = ValidationFull[(ValidationFull['Output_Label'] >= 34) & (ValidationFull['Output_Label'] <= 70)]


FeatureDatadf = Full_Data.filter(items = RelevantFeatures, axis = 1)
Validation = ValidationFull.filter(items = RelevantFeatures, axis = 1)
ValidationLabel = ValidationFull.filter(items = Labeldata, axis = 1)
FeatureData = pd.DataFrame(StandardScaler().fit_transform(FeatureDatadf))
Validation = pd.DataFrame(StandardScaler().fit_transform(Validation))

FeatureData = FeatureData.apply(pd.to_numeric, errors='coerce')
FeatureData = FeatureData.to_numpy()
Validation = Validation.to_numpy()

#Standardisation
LabelData = Full_Data.filter(items = Labeldata, axis=1)
LabelData = LabelData.apply(pd.to_numeric, errors='coerce')
dummies = pd.get_dummies(['34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50','51','52','53','54','55','56','57','58','59','60','61','62','63'], prefix = 'Size')
dummies = pd.get_dummies(LabelData['Output_Label'],prefix = 'Size')
LabelData = dummies.to_numpy()



# Split the sets up
Feature_train, Feature_test, Label_train, Label_test = train_test_split(FeatureData, LabelData, test_size=0.2)

# Model
model = Sequential()
model.add(Dense(26, activation = LeakyReLU(alpha=1), input_dim = 26,activity_regularizer=regularizers.l1(1e-4),use_bias=False))#209))
model.add(Dense(26,RandomFourierFeatures(output_dim=1024, scale=10.0, kernel_initializer="gaussian"),use_bias=False))
model.add(Dense(26,RandomFourierFeatures(output_dim=1024, scale=10.0, kernel_initializer="gaussian"),use_bias=False))
model.add(Dense(26,RandomFourierFeatures(output_dim=1024, scale=10.0, kernel_initializer="gaussian"),use_bias=False))
model.add(Dense(50,RandomFourierFeatures(output_dim=1024, scale=10.0, kernel_initializer="gaussian"),use_bias=False))


model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26,Dropout(0.4),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26,Dropout(0.4),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26,Dropout(0.4),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26,Dropout(0.4),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1),use_bias=False))



model.add(Dense(26,GaussianNoise(stddev = 0.5),use_bias=False))
model.add(Dense(26,GaussianNoise(stddev = 0.5),use_bias=False))
model.add(Dense(26,GaussianNoise(stddev = 0.5),use_bias=False))
model.add(Dense(26,GaussianNoise(stddev = 0.5),use_bias=False))
model.add(Dense(26,GaussianNoise(stddev = 0.5),use_bias=False))
#model.add(Dense(25,Normalization(),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1), activity_regularizer=regularizers.l1(1e-4),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1), activity_regularizer=regularizers.l1(1e-4),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1), activity_regularizer=regularizers.l1(1e-4),use_bias=False))
model.add(Dense(26, activation = LeakyReLU(alpha=1), activity_regularizer=regularizers.l1(1e-4),use_bias=False))


model.add(Dense(15, activation = 'softmax',use_bias=False))#Output is the number of classes

#optimisation
opt = SGD(lr=0.001, momentum=0.9)

# Compile
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['categorical_accuracy'])

history = model.fit(Feature_train, Label_train, validation_data=(Feature_test, Label_test), epochs=500, verbose=1)

# evaluate the model
_, train_acc = model.evaluate(Feature_train, Label_train, verbose=1)
_, test_acc = model.evaluate(Feature_test, Label_test, verbose=1)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
# plot loss during training
pyplot.subplot(211)
pyplot.title('Loss')
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
# plot accuracy during training
pyplot.subplot(212)
pyplot.title('categorical_accuracy')
pyplot.plot(history.history['categorical_accuracy'], label='train')
pyplot.plot(history.history['val_categorical_accuracy'], label='test')
pyplot.legend()
pyplot.show()


prediction = model.predict(Validation)

Predictionsdf = pd.DataFrame(prediction, columns = dummies.columns)

Predictionsdf.to_excel('Preditions.xlsx', index = False)

#Save model
model.summary()

model.save(os.path.join('.', 'Output_Label.h5'))


score = metrics.log_loss(ValidationLabel, prediction)
print("Log loss score: {}".format(score))
它应该:

  • 从[44-61]打印acc预测
  • 按从大到小的顺序打印名称
  • 从最大到最小打印acc预测
但我得到:

如中所述,数据集中的类数只有15个,因此15个值的输出是合适的

要获取顶部的
k
类概率,可以使用
numpy.argsort
然后使用dataframe列获取类名:

y_pred=model.predict(x)
#top_k具有形状(N,k)
top_k=np.argsort(y_pred,-1)[:,:k]
名称=dummies.columns.to_numpy()[top_k]
probs=np。沿轴取(y\u pred,top\u k,-1)

names
然后在
x
中包含每个实例的顶部
k
类的名称,并且
probs
包含相应的概率。

是什么错误导致您只为最后一层放置15个类?
ValueError:Shapes(无,15)和(无,30)不兼容
特征矩阵和标签矩阵的形状是什么?(即,
Feature\u train
Label\u train
,等等)Feature\u train是一个浮点数数组:262,26 Label\u train是一个uint8:328的数组,15两个列数组的第一维度应该相同,所以这里出了问题。第二维度的标签也应该有30个,因为它们应该是30个类的一个热编码。因此,在使用
pd.get_dummies()
probs
前,确保表中所有30个类都存在,而
predict()
将返回所有15个类。
prediction = model_Chest.predict(test)
print(model_Chest.predict(test))
y_pred = model_Chest.predict(test)
# top_k has shape (N, k)
K=18
dummies = pd.get_dummies(['44','45', '46','47', '48','49', '50','51', '52','53', '54','55', '56','57', '58','59', '60', '61'], prefix = 'Size')
top_K = np.argsort(y_pred, -1)[:, :K]
names = dummies.columns.to_numpy()[top_K]
probs = np.take_along_axis(y_pred, top_K, -1)
print(names)
print(probs)