machine-learning - keras新手: how to get better accuracy

标签 machine-learning keras

我是一个 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 模型和训练的第一步,我应该做什么?

最佳答案

我认为问题出在数据上。
首先,根据您生成的数据,您不太可能看到 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 .

祝你好运。

关于machine-learning - keras新手: how to get better accuracy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51583582/

相关文章:

python - 尝试理解 Keras 中的矩阵形状时遇到问题?

python - tensorflow 收敛但预测不佳

python - 导入 Keras 层时出错

python - 如何重复输入层直到超过一定数量的神经元?

keras - 需要在model.evaluate()之前编译Keras模型

python-3.x - 为什么随机搜索显示的结果比网格搜索更好?

tensorflow - 用于在 keras 中调用的自定义宏

python - Keras VGG 提取特征

python - Opencv DNN Net 1x1的大小

statistics - 学习最佳参数以最大化奖励