python - 线性分类器 Tensorflow2 未训练(1 个神经元模型)
问题描述
我目前正在研究 CIFAR-10 数据集,这是一个包含 10 个类别的图像分类问题。
我已经开始使用 Tensorflow 2 开发没有 LinearClassifier 对象的线性分类。
- X 形状对应 10 000 张 32*32 像素的图像 RBG = (10000, 3072)
- Y_one_hot 是一个热向量 = (10000, 10)
模型创建代码:
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 值始终相同。看来我的模型没有学习。
模型总结
摘要显示:
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
你知道为什么我的模型总是预测相同的值吗?
谢谢,
解决方案
备注一:
您使用的损失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,但您可以使用自己的网络进行更改。
试试那个...
祝你好运,翁贝托
推荐阅读
- python - 使用自定义 dupefilter scrapy 取消所有请求
- java - 将 Python 输出通过管道传输到 Java 程序
- python - 如何设置 post_id 来解决错误:'django.db.utils.IntegrityError: NOT NULL constraint failed:posts_comment.post_id'?
- java - 我一直收到关于最终输出的错误
- python - Beautiful Soup - 在更改的类名上访问文本
- sed - 从文件中删除文本块
- c++ - 一直困扰着我的 C++
- c# - 为两个变量读出一行,但一个是双变量,另一个是字符串
- java - 在 Kotlin 中将 ByteArray 转换为 Base64
- ios - SwiftUI,键盘后无法关闭工作表