【问题标题】:Neural Network doesn't learn - simple classification problem神经网络不学习 - 简单的分类问题
【发布时间】:2019-10-17 21:11:01
【问题描述】:

我目前正在尝试学习简单的神经网络识别 4 种不同的输出。有 2-value-inputs 实际上是这样的:

输出 + 均匀(-0.2,0.2) + 1

这些数据只有 200 条记录 - 但对我来说,尽可能少地保留数据很重要。

旁边的输入输出示例:

0.9936288071867917,1.0163870658585894  -  0

2.0133450399223953,1.9965272907556022  -  1

3.013918319917813,3.018102735071009  -  2

3.9935640040186025,4.00379069782054  -  3

我尝试设置不同数量的 epoch、隐藏神经元和激活函数。问题是我想让神经网络保持非常简单——这意味着只有两个隐藏层,每层最多有大约 20 个隐藏神经元。 无论我做什么,它仍然没有学习或学习很差。

这里是代码

import keras
import numpy as np
from sklearn.model_selection import train_test_split
#import pandas as pd
#import tensorflow as tf
from sklearn.utils import shuffle
from sklearn import metrics

seed = 10
np.random.seed(seed)

dataset = np.loadtxt("dataset.csv",delimiter=',')
#dataset = shuffle(dataset)

X = dataset[:,:2]
Y = dataset[:,2]

#print(X)
#print(Y)

(X_train,X_test,Y_train,Y_test) = train_test_split(X, Y, test_size=0.10, random_state=seed)
input_shape = (2,)

model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape))
model.add(keras.layers.core.Dense(8, activation='sigmoid'))
model.add(keras.layers.core.Dense(4, activation='sigmoid'))

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
history = model.fit(X_train,Y_train,validation_split=0.10,epochs=30)


val_loss, val_acc = model.evaluate(X_test,Y_test)
print('\nCost = ',val_loss,'\nAccuracy = ',val_acc,'\n')

通过 epochs(几乎相同)和评估,我仍然得到这样的结果:

Cost =  1.40975821018219 
Accuracy =  0.20000000298023224 

我能做些什么来改进这个神经网络?

【问题讨论】:

    标签: python-3.x machine-learning keras neural-network classification


    【解决方案1】:

    您可能想要更改的第一件事是最后一层中的激活函数。由于您有 4 个不同的输出,因此 softmax 是正确的激活函数。

    model.add(keras.layers.core.Dense(4, activation='softmax'))
    

    接下来你应该做的是替换

     model.add(keras.layers.core.Dense(8, activation='sigmoid'))
    

      model.add(keras.layers.core.Dense(8, activation='relu'))
    

    【讨论】:

    • 好吧,我做到了。 30 个 epoch 后准确率提高到 0.4 左右,之后又下降了。仍然没有什么令人满意的 :x 我还能做什么?
    • 一个输出的样本数增加到 1000。现在一切正常,但仍然 - 对于我的研究来说,它的数据太多了:\。另一件事是,MATLAB 实际上可以使用 nnstart 工具对其进行非常好的分类,每个输出仅使用 50 个样本。所以一定有办法让 keras nn 变得更好,我可以吗?
    • 如果你的准确率没有提高那么多,说明你的神经网络欠拟合。这意味着您可能希望使用更多层以及每层更多的神经元,以便神经网络更适合您的数据集。第一步尝试此操作。
    【解决方案2】:

    可能还有更多内容,但首先想到的是规范化您的数据。正如你在这个情节中看到的那样:
    对于 1、2,3 和 4,sigmoid 的值差别不大。但是,如果你的值在 -1 到 1 之间,你会得到更好的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2019-03-15
      • 2011-08-17
      • 2020-10-29
      相关资源
      最近更新 更多