在TensorFlow中训练MNIST手写数字分类模型时,如果训练集的准确率极低,可能是由以下几个原因导致的。以下是一些常见的排查步骤和解决方案:
python
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
python
train_images = train_images / 255.0
test_images = test_images / 255.0
(28, 28, 1)
:
python
train_images = train_images.reshape(-1, 28, 28, 1)
test_images = test_images.reshape(-1, 28, 28, 1)
sparse_categorical_crossentropy
或 categorical_crossentropy
):
python
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
adam
优化器通常效果较好,但如果需要调整学习率,可以显式设置:
python
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
python
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
python
model.add(tf.keras.layers.Dropout(0.5))
sparse_categorical_crossentropy
,标签应为整数;如果使用 categorical_crossentropy
,标签应为独热编码。python
print(train_labels.shape) # 应为 (60000,)
print(train_labels[:10]) # 应为 [5, 0, 4, 1, 9, ...]
python
print("GPU available:", tf.config.list_physical_devices('GPU'))
glorot_uniform
),或尝试其他初始化方法:
python
tf.keras.layers.Dense(128, activation='relu', kernel_initializer='he_normal')
python
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
print
或 tf.debugging
)检查中间结果。以下是一个完整的MNIST分类示例:
import tensorflow as tf
# 加载数据
mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 数据预处理
train_images = train_images / 255.0
test_images = test_images / 255.0
train_images = train_images.reshape(-1, 28, 28, 1)
test_images = test_images.reshape(-1, 28, 28, 1)
# 定义模型
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D((2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
通过以上步骤逐一排查,应该可以找到训练集准确率低的原因并解决问题。如果问题仍然存在,可以提供更多细节(如代码片段、错误信息等),我可以进一步帮助你分析。