python - 为什么准确率低于 0.01,但预测非常好(99.99%)
问题描述
我用 Python 中的 TensorFlow 2 做了我自己的第一个神经网络。我的想法是建立一个神经网络,它能够找到将二进制数(8 位)转换为十进制数的解决方案。几次尝试后:是的,它非常精确!
但我不明白的是:准确性非常低。
第二件事是:模型必须训练超过 200.000 个值!256 个可能的答案。我的代码/模型中的故障在哪里?
#dataset
def dataset(length, num):
global testdata, solution
testdata = np.random.randint(2, size=(num, length))
solution = testdata.copy()
solution = np.zeros((num, 1))
for i in range(num):
for n in range(length):
x = testdata [i,length - n -1] * (2 ** n)
solution [i] += x
length = 8
num = 220000
dataset (length, num)
#Modell
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(1, activation='relu')
])
model.compile(optimizer='adam',
loss='mean_squared_error',
metrics=['accuracy'])
#Training und Evaluate
model.fit(testdata, solution, epochs=4)
model.evaluate(t_testdata, t_solution, verbose=2)
model.summary()
损失:6.6441e-05 - 准确度:0.0077
它不应该是 0.77 或更高吗?
解决方案
您不应该将准确性视为回归问题的指标,因为您试图输出单个值,即使精度的微小变化也会导致为零,您可以考虑以下示例。
假设您尝试预测值 15,而模型返回值 14.99,则结果准确度仍将为零。
m = tf.keras.metrics.Accuracy()
_ = m.update_state([[15]], [[14.99]])
m.result().numpy()
结果:
0.0
您可以考虑以下回归指标列表。
- 回归指标
- 均方误差类
- RootMeanSquaredError 类
- 平均绝对错误类
- 平均绝对百分比错误类
- MeanSquaredLogarithmicError 类
- 余弦相似度类
- LogCoshError 类
我用上面列出的指标之一尝试了同样的问题,结果如下。
def bin2int(bin_list):
#bin_list = [0, 0, 0, 1]
int_val = ""
for k in bin_list:
int_val += str(int(k))
#int_val = 11011011
return int(int_val, 2)
def dataset(num):
# num - no of samples
bin_len = 8
X = np.zeros((num, bin_len))
Y = np.zeros((num))
for i in range(num):
X[i] = np.around(np.random.rand(bin_len)).astype(int)
Y[i] = bin2int(X[i])
return X, Y
no_of_smaples = 220000
trainX, trainY = dataset(no_of_smaples)
testX, testY = dataset(5)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(1, activation='relu')
])
model.compile(optimizer='adam',
loss='mean_absolute_error',
metrics=['mse'])
model.fit(trainX, trainY,validation_data = (testX,testY),epochs=4)
model.summary()
输出:
Epoch 1/4
6875/6875 [==============================] - 15s 2ms/step - loss: 27.6938 - mse: 2819.9429 - val_loss: 0.0066 - val_mse: 5.2560e-05
Epoch 2/4
6875/6875 [==============================] - 15s 2ms/step - loss: 0.0580 - mse: 0.1919 - val_loss: 0.0066 - val_mse: 6.0013e-05
Epoch 3/4
6875/6875 [==============================] - 16s 2ms/step - loss: 0.0376 - mse: 0.0868 - val_loss: 0.0106 - val_mse: 1.2932e-04
Epoch 4/4
6875/6875 [==============================] - 15s 2ms/step - loss: 0.0317 - mse: 0.0466 - val_loss: 0.0177 - val_mse: 3.2429e-04
Model: "sequential_11"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_24 (Dense) multiple 72
_________________________________________________________________
dense_25 (Dense) multiple 9
_________________________________________________________________
round_4 (Round) multiple 0
=================================================================
Total params: 81
Trainable params: 81
Non-trainable params: 0
预测:
model.predict([[0., 0., 0., 0., 0., 1., 1., 0.]])
数组([[5.993815]],dtype=float32)
推荐阅读
- kernel - 在 4.14 内核的 IMX6 上使用 vivante GPU
- reactjs - 用于 SharePoint 框架 SPFx 的 React Dropzone
- ios - 图像更改大小时显示 CIImage 的 MTKView 出错
- java - 在读取条形码之前清除 EditText?
- java - 无法获取 Stream 1:在 Java 11 HTTP/2 客户端中读取时达到 EOF
- ubuntu - 'sudo service apache2 start' 在 ubuntu18.04 上不起作用
- microsoft-graph-api - Graph API - 从特定网站集中获取最近的文件
- apache-spark - 在 pyspark UDF 中使用广播数据帧
- c# - 进度条进度在方法完成之前不会更新
- unity3d - 编码器的 Unity 3D 游戏