【问题标题】:Neural Network model with keras python带有keras python的神经网络模型
【发布时间】:2018-05-13 20:49:18
【问题描述】:

我对我的 NN 模型有疑问。我正在使用来自 python 的 keras。我的训练包含 1000 个样本,每个样本有 4320 个特征。有 10 个类别,我的 Y 包含 10 个元素的 numpy 数组,除一个之外的所有位置都为 0。

但是,我的 NN 并没有从第一个 epoch 中学习,而且我的模型可能有误,这是我第一次尝试构建 NN 模型,我一定有一些地方出错了。

Epoch 1/150
1000/1000 [==============================] - 40s 40ms/step - loss: 6.7110 - acc: 0.5796
Epoch 2/150
1000/1000 [==============================] - 39s 39ms/step - loss: 6.7063 - acc: 0.5800
Epoch 3/150
1000/1000 [==============================] - 38s 38ms/step - loss: 6.7063 - acc: 0.5800
Epoch 4/150
1000/1000 [==============================] - 39s 39ms/step - loss: 6.7063 - acc: 0.5800
Epoch 5/150
1000/1000 [==============================] - 38s 38ms/step - loss: 6.7063 - acc: 0.5800
Epoch 6/150
1000/1000 [==============================] - 38s 38ms/step - loss: 6.7063 - acc: 0.5800
Epoch 7/150
1000/1000 [==============================] - 40s 40ms/step - loss: 6.7063 - acc: 0.5800
Epoch 8/150
1000/1000 [==============================] - 39s 39ms/step - loss: 6.7063 - acc: 0.5800
Epoch 9/150
1000/1000 [==============================] - 40s 40ms/step - loss: 6.7063 - acc: 0.5800

这是我的神经网络代码的一部分:

model = Sequential()
model.add(Dense(4320, input_dim=4320, activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dense(10, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=10)

所以,我的 X 是一个长度为 1000 的 numpy 数组,其中包含其他 4320 个元素的 numpy 数组。我的 Y 是一个长度为 1000 的 numpy 数组,其中包含其他 10 个元素(类别)的 numpy 数组。

是我做错了什么,还是无法根据这个训练集学习? (在曼哈顿距离的 1NN 上,我在这个训练集上的准确率约为 80%)

L.E.:在我标准化数据后,这是我前 10 个 epoch 的输出:

Epoch 1/150
1000/1000 [==============================] - 41s 41ms/step - loss: 7.9834 - acc: 0.4360
Epoch 2/150
1000/1000 [==============================] - 41s 41ms/step - loss: 7.2943 - acc: 0.5080
Epoch 3/150
1000/1000 [==============================] - 39s 39ms/step - loss: 9.0326 - acc: 0.4070
Epoch 4/150
1000/1000 [==============================] - 39s 39ms/step - loss: 8.7106 - acc: 0.4320
Epoch 5/150
1000/1000 [==============================] - 40s 40ms/step - loss: 7.7547 - acc: 0.4900
Epoch 6/150
1000/1000 [==============================] - 44s 44ms/step - loss: 7.2591 - acc: 0.5270
Epoch 7/150
1000/1000 [==============================] - 42s 42ms/step - loss: 8.5002 - acc: 0.4560
Epoch 8/150
1000/1000 [==============================] - 41s 41ms/step - loss: 9.9525 - acc: 0.3720
Epoch 9/150
1000/1000 [==============================] - 40s 40ms/step - loss: 9.7160 - acc: 0.3920
Epoch 10/150
1000/1000 [==============================] - 39s 39ms/step - loss: 9.3523 - acc: 0.4140

看起来它开始波动,所以看起来不错

【问题讨论】:

  • 如果类是互斥的,使用softmax 激活和categorical_crossentropy 作为损失函数更合适。另外,您的数据集是否标准化?
  • 谢谢你,我已经做了你的改变。完全忘记了对数据进行规范化,现在就这样做了,看起来准确度开始从一个时代变化到另一个时代(编辑了主帖)。你觉得隐藏层的神经元数量还可以吗?如果我的准确率在第一个 epochs 下降可以吗?
  • 一旦你确定一切正常(现在没问题),你就需要调整它。您是否也尝试更改激活函数和损失函数?
  • 是的,都改了

标签: python numpy tensorflow neural-network keras


【解决方案1】:

看起来你的类别,类是互斥的,因为你的目标数组是单热编码的(即你永远不必同时预测 2 个类)。在这种情况下,您应该在最后一层使用softmax 来生成分布并使用categorical_crossentropy 进行训练。事实上,您可以将目标设置为 Y = [2,4,0,1] 作为类别索引并使用 sparse_categorical_crossentropy 进行训练,这将节省您创建 2 个形状数组(样本,10)的时间。

您似乎拥有很多功能,您的网络性能很可能取决于您预处理数据的方式。对于连续输入,明智的做法是将其标准化,对于离散输入,将其编码为 one-hot 以帮助学习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多