准确度 val_acc 可信吗?
can the accuracy measure val_acc be trusted?
构建序列
simple_seq= [x for x in list(range(1000)) if x % 3 == 0]
重塑和拆分后
x_train, x_test shape = (159, 5, 1)
y_train, y_test shape = (159, 2)
型号
model = Sequential(name='acc_test')
model.add(Conv1D(
kernel_size = 2,
filters= 128,
strides= 1,
use_bias= True,
activation= 'relu',
padding='same',
input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(AveragePooling1D(pool_size =(2), strides= [1]))
model.add(Flatten())
model.add(Dense(2))
optimizer = Adam(lr=0.001)
model.compile( optimizer= optimizer, loss= 'mse', metrics=['accuracy'])
火车
hist = model.fit(
x=x_train,
y = y_train,
epochs=100,
validation_split=0.2)
结果:
Epoch 100/100
127/127 [==============================] - 0s 133us/sample - loss: 0.0096 - acc: 1.0000 - val_loss: 0.6305 - val_acc: 1.0000
但是如果使用这个模型来预测:
x_test[-1:] = array([[[9981],
[9984],
[9987],
[9990],
[9993]]])
model.predict(x_test[-1:])
result is: array([[10141.571, 10277.236]], dtype=float32)
如果结果与事实相去甚远,vall_acc 怎么会是 1,结果是
step 1 2
true [9996, 9999 ]
pred [10141.571, 10277.236]
准确度指标仅对分类任务有效。因此,如果您在回归任务中使用准确性作为指标,则报告的指标值可能根本无效。从你的代码来看,我感觉你在做回归任务,所以不应该使用这个。
下面列出了您可以在 Keras 中用于回归问题的指标。
Mean Squared Error: mean_squared_error, MSE or mse
Mean Absolute Error: mean_absolute_error, MAE, mae
Mean Absolute Percentage Error: mean_absolute_percentage_error, MAPE, mape
Cosine Proximity: cosine_proximity, cosine
您可以在 link and see some keras exampler code at link 阅读一些理论。
抱歉,时间有点紧,但我相信这些链接会对您有所帮助。 :)
根据您的 true/predicted 值范围和使用的损失 - 看起来您正在尝试解决回归问题,而不是分类问题。
因此,如果我对您的理解正确 - 您正在尝试根据输入预测两个数值 - 而不是预测两个 类 中的哪一个对这些输入有效。
如果是这样 - 你不应该使用准确性指标。因为它只会比较每个输入 sample/prediction 的最大输入的索引(有点简化)。例如。 9996 < 9999 和 10141.571 < 10277.236.
构建序列
simple_seq= [x for x in list(range(1000)) if x % 3 == 0]
重塑和拆分后
x_train, x_test shape = (159, 5, 1)
y_train, y_test shape = (159, 2)
型号
model = Sequential(name='acc_test')
model.add(Conv1D(
kernel_size = 2,
filters= 128,
strides= 1,
use_bias= True,
activation= 'relu',
padding='same',
input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(AveragePooling1D(pool_size =(2), strides= [1]))
model.add(Flatten())
model.add(Dense(2))
optimizer = Adam(lr=0.001)
model.compile( optimizer= optimizer, loss= 'mse', metrics=['accuracy'])
火车
hist = model.fit(
x=x_train,
y = y_train,
epochs=100,
validation_split=0.2)
结果:
Epoch 100/100
127/127 [==============================] - 0s 133us/sample - loss: 0.0096 - acc: 1.0000 - val_loss: 0.6305 - val_acc: 1.0000
但是如果使用这个模型来预测:
x_test[-1:] = array([[[9981],
[9984],
[9987],
[9990],
[9993]]])
model.predict(x_test[-1:])
result is: array([[10141.571, 10277.236]], dtype=float32)
如果结果与事实相去甚远,vall_acc 怎么会是 1,结果是
step 1 2
true [9996, 9999 ]
pred [10141.571, 10277.236]
准确度指标仅对分类任务有效。因此,如果您在回归任务中使用准确性作为指标,则报告的指标值可能根本无效。从你的代码来看,我感觉你在做回归任务,所以不应该使用这个。
下面列出了您可以在 Keras 中用于回归问题的指标。
Mean Squared Error: mean_squared_error, MSE or mse
Mean Absolute Error: mean_absolute_error, MAE, mae
Mean Absolute Percentage Error: mean_absolute_percentage_error, MAPE, mape
Cosine Proximity: cosine_proximity, cosine
您可以在 link and see some keras exampler code at link 阅读一些理论。
抱歉,时间有点紧,但我相信这些链接会对您有所帮助。 :)
根据您的 true/predicted 值范围和使用的损失 - 看起来您正在尝试解决回归问题,而不是分类问题。
因此,如果我对您的理解正确 - 您正在尝试根据输入预测两个数值 - 而不是预测两个 类 中的哪一个对这些输入有效。
如果是这样 - 你不应该使用准确性指标。因为它只会比较每个输入 sample/prediction 的最大输入的索引(有点简化)。例如。 9996 < 9999 和 10141.571 < 10277.236.