我正在学习神经网络,并正在创建一个简单的分类神经网络。我没有经验,所以我很抱歉,这是一个愚蠢的错误。在下面的代码中,我导入我的数据集,将其格式化为一个热点矢量,然后在Tensorflow的tutorial上使用简单网络。我使用分类交叉熵是因为我的输出是一个等级,如果我没有记错的话,分类交叉熵对接近正确分类的数字的惩罚较少。无论如何,我的准确率总是2-12%,这显然是不好的。分类介于1到20之间(对于0.5到10的等级,以0.5为增量),当我在test_data上测试模型时,似乎选择了一个数字并将所有图像分类为相同的数字/类别。有趣的是,它没有给出不同的概率,而是返回了一个热向量,其中模型100%确信每个测试图像都是同一类。我知道我的数据集非常小,但我认为即使是坏数据也不应该将所有这些归类为相同且置信度为100%。代码:
from __future__ import absolute_import, division, print_function
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = np.load("dataset.npy", allow_pickle=True)
train_labels = list(map(float, train_labels))
test_labels = list(map(float, test_labels))
train_labels = [int(i * 2) for i in train_labels]
test_labels = [int(i * 2) for i in test_labels]
train_zeros = np.zeros((307, 20))
test_zeros = np.zeros((103, 20))
for i in range(len(train_zeros)):
train_zeros[i][train_labels[i] - 1] = 1
for i in range(len(test_zeros)):
test_zeros[i][test_labels[i] - 1] = 1
model = keras.Sequential([
keras.layers.Flatten(input_shape=(128, 128)),
keras.layers.Dense(512, activation=tf.nn.relu),
keras.layers.Dense(20, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_zeros, epochs=10)
predictions = model.predict(test_images)
print(predictions[0])
def plot_image(i, predictions_array, true_label, img):
predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])
plt.imshow(img, cmap=plt.cm.binary)
predicted_label = np.argmax(predictions_array) / 2
if predicted_label == true_label:
color = 'blue'
else:
color = 'red'
plt.xlabel("{} {:2.0f}% ({})".format(predicted_label,
100 * np.max(predictions_array),
true_label),
color=color)
def plot_value_array(i, predictions_array, true_label):
predictions_array, true_label = predictions_array[i], true_label[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])
thisplot = plt.bar(range(20), predictions_array, color="#777777")
plt.ylim([0, 1])
predicted_label = np.argmax(predictions_array)
thisplot[predicted_label].set_color('red')
thisplot[true_label].set_color('blue')
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
plt.subplot(num_rows, 2*num_cols, 2*i+1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(num_rows, 2*num_cols, 2*i+2)
plot_value_array(i, predictions, test_labels)
plt.show()
答案 0 :(得分:2)
您绝对应该将其视为回归问题而不是分类问题。
如果我没记错的话,则分类交叉熵对接近正确分类的数字的惩罚较少
恐怕这是不正确的。您的模型和损失将以与在0.5和20之间完全相同的方式来对待4和4.5之间的错误标签。这显然是错误的。
我强烈建议您将其视为回归问题,并针对损失函数切换到均方误差之类的方法。选择this tutorial以获得完整的示例。