使用 keras python 的神经网络模型



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

但是,我的 NN 不会从第一个时代学习,我的模型可能错了,这是我第一次尝试构建 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

这是我的 NN 代码的一部分:

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

看起来它开始波动,所以这似乎很好

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

似乎您有很多功能,很可能您的网络性能取决于您如何预处理数据。对于连续输入,明智的做法是将其规范化,对于离散输入,将其编码为独热以帮助学习。

最新更新