keras新手:如何获得更高的准确性

时间:2018-07-29 19:00:37

标签: machine-learning keras

我是一名新手,所以使自己成为玩具问题。在这里,我只是根据向量对它们进行标记,并允许少量的错误标记。任务是正确地对向量进行分类。这是代码:

import numpy as np
from sklearn.model_selection import train_test_split
from keras.wrappers.scikit_learn import KerasClassifier
from keras.models import Sequential
from keras.layers import Dense
import keras

# Function to create model, required for KerasClassifier
def create_model():
    # create model
    model = Sequential()
    model.add(Dense(12, input_dim=100, activation='relu'))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(2, activation='sigmoid'))
    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

np.random.seed(0)
M = np.random.random_sample((1000,100))

X = []
Y = []
p = 0.8
for i in range(len(M)):
    new_norm = np.linalg.norm(M[i])
    if new_norm <= 5.7:
        if np.random.random_sample() < p:
            X.append(M[i])
            Y.append(0)
        else:
            X.append(M[i])
            Y.append(1)
    elif new_norm > 5.7:
        if np.random.random_sample() < p:
            X.append(M[i])
            Y.append(1)
        else:
            X.append(M[i])
            Y.append(0)
print(len([y for y in Y if y == 0]), len([y for y in Y if y == 1]))

X = np.array(X)
Y = np.array(Y)
Y = keras.utils.to_categorical(Y)            
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=42)

clf = KerasClassifier(build_fn=create_model, epochs=150, batch_size=10, verbose=2)
clf.fit(X_train, y_train)
print("Keras score ", clf.score(X_test, y_test))

Keras报告的得分约为0.5,如果使用标准,则得分约为0.8。 Keras还报告了训练中的准确度1.0,因此我显然做错了。如:

Epoch 148/150
 - 0s - loss: 0.0016 - acc: 1.0000
Epoch 149/150
 - 0s - loss: 0.0015 - acc: 1.0000
Epoch 150/150
 - 0s - loss: 0.0014 - acc: 1.0000

作为改善我的keras模型和培训的第一步,我应该做什么?

1 个答案:

答案 0 :(得分:0)

我认为问题出在数据上。
首先,根据您的数据生成情况,您不太可能会看到if new_norm <= 5.7:
当您生成标签(YY_trainY_test)时,您显然有80%/ 20%的不平衡,因此,基本上,您所看到的是模型学会仅预测一个标签我的测试证实了“最多”的时间。我训练了您的模型,并获得80%的验证准确度(您选择标签的概率)。然后,如果您尝试以下代码,则可以看到该模型在大多数情况下只说1。

temp = clf.predict(X_test)
len(temp[temp == 1]) # 329
len(temp[temp == 0]) # 1

第二,您的数据是完全随机的,因此我看不出该模型如何从这些数据中学习任何东西。
我建议您将数据集更改为另一数据集。一种流行的是Iris Dataset

祝你好运。