我正在尝试学习神经网络,这是我正在做 MNIST 的第一个建议练习。 创建模型并自行运行后,我决定检查我的模型是否真的可以对我自己创建的数字图像进行分类。所有分类黑客马拉松,我什至没有说实际工作,无论如何都需要它。
现在,我想提前说一下,我确实有后端编程和 C# 与 Java 的经验,但没有 Python 和神经网络的经验。如果我的问题看起来太琐碎,我深表歉意,但我没有办法不问问题就学习。
代码在这里:
import tensorflow as tf
from keras.datasets import mnist
import keras
import numpy as np
import matplotlib.pyplot as plt
import csv
from PIL import Image
import glob
epochs = 10
learning_rate = 0.001
batch_size=16
def CreateAndTrainModel(epochs, learning_rate, batch_size):
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = tf.cast(x_train/255.0, tf.float32), tf.cast(x_test/255.0, tf.float32)
x_train = np.array(x_train).reshape(-1,784)
x_test = np.array(x_test).reshape(-1,784)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(784,input_dim=784))
model.add(tf.keras.layers.Dense(256, activation="relu"))
model.add(tf.keras.layers.Dense(128, activation="relu"))
model.add(tf.keras.layers.Dense(128, activation="relu"))
model.add(tf.keras.layers.Dense(10, activation="softmax"))
optimizer = keras.optimizers.SGD(learning_rate)
model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs)
model.evaluate(x_test, y_test)
return model
def GetData():
file = open("CSV\data.csv", "r")
data = list(csv.reader(file, delimiter=","))
file.close()
return data
def getImageList():
image_list = []
for filename in glob.glob('Images/*.png'): # assuming gif
im = Image.open(filename)
image_list.append(im)
return image_list
def GetFileNameOnly(path):
return path.filename.split('\\')[1].split('.')[0]
def GetCorrectAnswerByFilePath(path):
key = GetFileNameOnly(path)
answer = -1
for dataValues in data:
if (dataValues[0] == key):
answer = dataValues[1]
return answer
def ShowAllImages(image_list_length):
for i in range(image_list_length):
print(GetFileNameOnly(image_list[i]), GetCorrectAnswerByFilePath(image_list[i]))
plt.imshow(image_list[i])
plt.show()
def PredictImage(image):
image = tf.image.rgb_to_grayscale(image)
image = np.array(image).reshape(-1, 784)
predicted_answer = np.argmax(model.predict(image.reshape(-1, 784)), 1)
return predicted_answer
#Main
data = GetData()
model = CreateAndTrainModel(epochs, learning_rate, batch_size)
print(data)
image_list = getImageList()
image_list_length = (len(image_list))
for image in image_list:
correct_answer = GetCorrectAnswerByFilePath(image)
fileName = GetFileNameOnly(image)
predicted_answer = PredictImage(image)
print("File Name: ", fileName, "Predicted Answer", predicted_answer, "Actual answer", correct_answer)
我在 Paint 中自己创建的四张图像,如下所示:
[][b.png]
图片命名为:a.png(持有4个),b.png(持有8个),c.png(持有1个),d.png(持有2个)。
还有一个 excel 文件保存每个文件名的实际值。
现在,准确率和损失值:
纪元 10/10
3750/3750 [==============================] - 9 秒 2 毫秒/步 - 损失:0.1733 - 精度:0.9500
313/313 [==============================] - 1s 2ms/step - loss: 0.1688 - accuracy: 0.9506
然而,至少可以说,实际的预测很奇怪。
我尝试了批量大小、时期、层数、层中神经元数等的许多变化。 然而,在大多数情况下,要么所有四种情况的结果相同,要么其中三种情况相同,要么二对二,但都不正确。
文件名:a 预测答案 [3] 实际答案 4
文件名:b 预测答案 [2] 实际答案 8
文件名:c 预测答案[3] 实际答案1
文件名:d 预测答案 [3] 实际答案 2
我认为问题可能出在哪里:
我知道有一种东西叫过拟合,难道是这样吗? 现在,我几乎是在“照章办事”,我知道为模型找到正确的参数是至关重要的,但我没有正确设置这些参数的经验。
也许代码有问题,它不会用任何参数给出正确的结果?
或者也许 MNIST 并不是为了以这种方式使用而设计的?
提前谢谢你,
Evgenie
我对包含纪元数据感到困惑。我读到这意味着您将手工生成的图像包含在训练集中以重新训练模型。那是你做的吗?
我不会建议你用你手工生成的图像重新运行模型。我会采用您使用 MNIST 图像训练的模型,并查看它对这些图像的预测结果。
我必须查看 曲线 来评估您如何管理偏差方差权衡。