人工预测神经网络出错

时间:2019-10-29 14:09:22

标签: python machine-learning keras neural-network classification

我有一个数据集(csv),其格式如下所示:

  

第一列:随机整数

     

第二列:每个整数的类(称为 bins

enter image description here

预处理后已创建了容器,例如,介于1000到1005之间的整数属于容器1的0号,1006和1011 onges,然后继续。

我的神经网络的目标列是 bins 列(第二列)。

我将 OneHotEncoding 用于目标列,并将每个bin编号转换为二进制矢量。我有3557个不同的垃圾箱(类)。

我对其进行了培训,并以99.7%的准确度对其进行了评估。

import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import OneHotEncoder
from keras import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split

df = pd.read_csv("/dbfs/FileStore/tables/export78.csv")

onehotencoder = OneHotEncoder(categorical_features = [1])
data2 = onehotencoder.fit_transform(df).toarray()
dataset = pd.DataFrame(data2)

X= dataset.iloc[:,3557].astype(float)
y= dataset.iloc[:,0:3557].astype(int)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)


classifier = Sequential()
#First Hidden Layer
classifier.add(Dense(3557, activation='sigmoid', kernel_initializer='random_normal', input_dim=1))
#Second  Hidden Layer
classifier.add(Dense(3557, activation='sigmoid', kernel_initializer='random_normal'))
#Output Layer
classifier.add(Dense(3557, activation='sigmoid', kernel_initializer='random_normal'))

#Compiling the neural network
classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics=['accuracy'])

#Fitting the data to the training dataset
classifier.fit(X_train,y_train, batch_size=50, epochs=10)

accr = classifier.evaluate(X_test, y_test)
print('Test set\n  Loss: {:0.3f}\n  Accuracy: {:0.3f}'.format(accr[0] ,accr[1]))

classifier.save("model.h67")


data1 = np.array(X_test)
List = [data1]
model = tf.keras.models.load_model("model.h67")
prediction = model.predict([(data1)])
target = (np.argmax(prediction, axis=0))
dataset1 = pd.DataFrame(target)
display(dataset1)

问题:

当我尝试使用模型手动进行预测时,我无法得出正确的结果。 作为预测输入,请给csv仅包含一列具有随机整数的列,并且我希望bin属于结果。 enter image description here

2 个答案:

答案 0 :(得分:1)

您收到错误消息还是只是错误的预测?您的问题还不清楚。

尝试:

prediction = model.predict(data1)

编辑:

  

我有3557个不同的垃圾箱(类)。

classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics=['accuracy'])

然后将binary_crossentropy作为损失函数是不正确的选择,请尝试categorical_crossentropy

答案 1 :(得分:1)

您的代码有几个问题。

开始于:

  

我对其进行了培训,并以99.7%的准确度对其进行了评估。

当一个人错误地将binary_crossentropy损失用于类分类问题时,这是一个已知的问题(伪造的高精度);看到:

第二,您也错误地在最后一层使用activation='sigmoid'activation='softmax'

第三,除去其余所有activation='sigmoid',并将它们替换为relu

最后,您应该摆脱模型层中的所有这些kernel_initializer='random_normal'语句;保留参数未定义,以便默认为glorot_uniformdocs)。

总而言之,这就是模型的外观:

classifier = Sequential()
classifier.add(Dense(3557, activation='relu', input_dim=1))
classifier.add(Dense(3557, activation='relu'))
classifier.add(Dense(3557, activation='softmax'))

classifier.compile(optimizer ='adam',loss='categorical_crossentropy', metrics=['accuracy'])

这是非常一般的建议,仅适用于初学者; 3557级的问题并非微不足道,也不清楚为什么您选择使用3层,所有这些层都具有相同数量(3557)的节点。在尝试上述架构的同时,请牢记以上几点...