李 *_* 慕 8 python keras tensorflow
我有以下数据形状
X_Train.shape,Y_Train.shape
Out[52]: ((983, 19900), (983,))
X_Test.shape,Y_Test.shape
Out[53]: ((52, 19900), (52,))
Run Code Online (Sandbox Code Playgroud)
我正在运行一个简单的二元分类器,因为 Y_train 和 Y_test 可以是 1 或 2
import keras
import tensorflow as tf
from keras import layers
from keras.layers import Input, Dense
from keras.models import Model,Sequential
import numpy as np
from keras.optimizers import Adam
myModel = keras.Sequential([
keras.layers.Dense(1000,activation=tf.nn.relu,input_shape=(19900,)),
keras.layers.Dense(64, activation=tf.nn.relu),
keras.layers.Dense(32, activation=tf.nn.relu),
keras.layers.Dense(1, activation=tf.nn.softmax)
])
myModel.compile(optimizer='adam', loss='sparse_categorical_crossentropy',metrics=['accuracy'])
myModel.fit(X_Train, Y_Train, epochs=100,batch_size=1000)
test_loss,test_acc=myModel.evaluate(X_Test,Y_Test)
Run Code Online (Sandbox Code Playgroud)
代码的输出
训练损失和准确性
Epoch 1/100
983/983 [==============================] - 1s 1ms/step - loss: nan - acc: 0.4608
Epoch 2/100
983/983 [==============================] - 0s 206us/step - loss: nan - acc: 0.4873
Epoch 3/100
983/983 [==============================] - 0s 200us/step - loss: nan - acc: 0.4883
Epoch 4/100
983/983 [==============================] - 0s 197us/step - loss: nan - acc: 0.4883
Epoch 5/100
983/983 [==============================] - 0s 194us/step - loss: nan - acc: 0.4873
Epoch 6/100
983/983 [==============================] - 0s 202us/step - loss: nan - acc: 0.4863
Epoch 7/100
983/983 [==============================] - 0s 198us/step - loss: nan - acc: 0.4863
Epoch 8/100
983/983 [==============================] - 0s 194us/step - loss: nan - acc: 0.4883
Epoch 9/100
983/983 [==============================] - 0s 196us/step - loss: nan - acc: 0.4873
Epoch 10/100
983/983 [==============================] - 0s 198us/step - loss: nan - acc: 0.4873
Epoch 11/100
983/983 [==============================] - 0s 200us/step - loss: nan - acc: 0.4893
Epoch 12/100
983/983 [==============================] - 0s 198us/step - loss: nan - acc: 0.4873
Epoch 13/100
983/983 [==============================] - 0s 194us/step - loss: nan - acc: 0.4873
Epoch 14/100
983/983 [==============================] - 0s 197us/step - loss: nan - acc: 0.4883
Epoch 97/100
983/983 [==============================] - 0s 196us/step - loss: nan - acc: 0.4893
Epoch 98/100
983/983 [==============================] - 0s 199us/step - loss: nan - acc: 0.4883
Epoch 99/100
983/983 [==============================] - 0s 193us/step - loss: nan - acc: 0.4883
Epoch 100/100
983/983 [==============================] - 0s 196us/step - loss: nan - acc: 0.4863
Run Code Online (Sandbox Code Playgroud)
测试损失和准确性
test_loss,test_acc
Out[58]: (nan, 0.4615384661234342)
Run Code Online (Sandbox Code Playgroud)
我还检查了我的数据中是否有任何 nan 值
np.isnan(X_Train).any()
Out[5]: False
np.isnan(Y_Train).any()
Out[6]: False
np.isnan(X_Test).any()
Out[7]: False
np.isnan(Y_Test).any()
Out[8]: False
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么我的训练准确度没有提高,为什么损失是 nan 还有为什么没有单热编码输出中的 softmax 工作正常?
注意1:我很抱歉我的数据很大,所以我不能在这里分享它,但如果有什么方法可以在这里分享它,那么我准备这样做。
Note2我的训练数据中有很多零值
小智 9
如果您在损失中得到 NaN 值,则意味着输入位于函数域之外。发生这种情况的原因有多种。以下是查找原因的几个步骤,
1) 如果输入在函数域之外,则确定这些输入是什么。跟踪成本函数的输入值的进展。
2) 检查输入数据集中是否存在任何 null 或 nan 值。可以通过以下方式完成
DataFrame.isnull().any()
Run Code Online (Sandbox Code Playgroud)
3) 更改输入数据的缩放比例。将数据标准化在 0 和 1 之间,开始训练。
4)改变权重初始化方法。
很难用深度神经网络指出确切的解决方案。因此,尝试上述方法,它应该能让您清楚地了解出了什么问题。
Softmax 激活在这里不是正确的选择。输出层上只有一个神经元。
让我们考虑一下softmax函数是如何定义的。(图片来自wikepedia.org)
。
由于最后一层只有一个神经元, 的所有值都将为 1
。
由于您使用的是sparse_categorical_crossentropy,keras(或张量流)可以从 logits 的形状推断类的数量。在keras(或tensorflow)中,logits 的形状被假定为 [BATCH_SIZE, NUM_CLASSES]。你的 logits 的形状是 [None, 1],所以 keras 假设你的类的数量是 1,但是你正在喂养多个类(0 或 1),这导致了错误。
这里正确的激活函数是 sigmoid(tanh 也可以通过将数据集目标更改为 -1 或 1 来工作)。损失应该是binary_crossentropy。
myModel = keras.Sequential([
keras.layers.Dense(1000,activation=tf.nn.relu,input_shape=(19900,)),
keras.layers.Dense(64, activation=tf.nn.relu),
keras.layers.Dense(32, activation=tf.nn.relu),
keras.layers.Dense(1, activation="sigmoid")
])
myModel.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7045 次 |
| 最近记录: |