我目前正在研究CIFAR-10数据集,这是一个具有10个类别的图像分类问题。
我已经开始使用Tensorflow 2开发没有LinearClassifier对象的线性分类。
模型创建代码:
model = tf.keras.Sequential()
model.add(Dense(1, activation="linear", input_dim=32*32*3))
model.add(Dense(10, activation="softmax", input_dim=1))
model.compile(optimizer="adam", loss="mean_squared_error", metrics=["accuracy"])
培训代码:
model.fit(X, Y_one_hot, batch_size=10000, verbose=1, epochs=100)
预测代码:
img = X[0].reshape(1, 3072) # Select image 0
res = np.argmax((model.predict(img))) # select the max in output
问题:
res值始终相同。看来我的模型没有学习。
Model.summary
摘要显示:
dense (Dense) (None, 1) 3073
dense_1 (Dense) (None, 10) 20
Total params: 3,093
Trainable params: 3,093
Non-trainable params: 0
准确度和损失:
Epoch 1/100
10000/10000 [==============================] - 2s 184us/sample - loss: 0.0949 - accuracy: 0.1005
Epoch 50/100
10000/10000 [==============================] - 0s 10us/sample - loss: 0.0901 - accuracy: 0.1000
Epoch 100/100
10000/10000 [==============================] - 0s 8us/sample - loss: 0.0901 - accuracy: 0.1027
您知道为什么我的模型总是预测相同的值吗?
谢谢
答案 0 :(得分:1)
一句话:
您使用的损失loss="mean_squared_error"
并非用于分类。是为了回归。两个非常不同的问题。尝试交叉熵。例如
`model.compile(optimizer=AdamOpt,
loss='categorical_crossentropy', metrics=['accuracy'])`
您可以在此处找到示例:https://github.com/michelucci/oreilly-london-ai/blob/master/day1/Beginner%20friendly%20networks/First_Example_of_a_CNN_(CIFAR10).ipynb。是我用于培训的笔记本。该网络是CNN,但您可以随自己的网络进行更改。
尝试...
祝你好运,翁贝托