You need to enable JavaScript to run this app. TensorFlow运行MNIST代码报错:AttributeError: 'dict' object has no attribute 'train'
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow运行MNIST代码报错:AttributeError: 'dict' object has no attribute 'train'

问题修复方案

报错原因

AttributeError: 'dict' object has no attribute 'train'的触发原因是tensorflow_datasets的load接口返回值为包含train、test两个key的字典,而非旧版tensorflow.examples.tutorials.mnist返回的自带train/validation属性的数据集对象。同时你的代码还存在变量未定义、参数拼写错误、格式化语法错误等问题,需同步修正。

需要调整的核心点

  • 加载MNIST数据集时补充参数,拆分验证集、转换为独热编码格式,同时适配原代码的next_batch调用逻辑
  • 补充未定义的训练轮次变量max_epochs、早停逻辑依赖的prev_validation_loss初始值
  • 修正feed_dict中目标变量名拼写错误(target改为targets)
  • 修正字符串格式化语法错误,将(0:.3f)改为{0:.3f}
  • 调整代码缩进,保证早停判断、验证集计算逻辑在epoch循环内执行

完整可运行代码

import numpy as np
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior() 
import tensorflow_datasets as tfds

# 适配旧版mnist接口的next_batch方法
class MNISTAdapter:
    def __init__(self, ds, num_examples):
        self.ds = ds.repeat().shuffle(10000).batch(100).prefetch(tf.data.AUTOTUNE)
        self.iter = tf.compat.v1.data.make_one_shot_iterator(self.ds)
        self._num_examples = num_examples
    
    def next_batch(self, batch_size):
        x, y = self.iter.get_next()
        x = tf.reshape(x, (-1, 784)).eval() / 255.0
        y = tf.one_hot(y, depth=10).eval()
        return x, y

# 加载数据集并拆分训练、验证、测试集
(ds_train, ds_val, ds_test), ds_info = tfds.load(
    'mnist',
    split=['train[:90%]', 'train[90%:]', 'test'],
    shuffle_files=True,
    as_supervised=True,
    with_info=True,
)
mnist = type('obj', (object,), {})()
mnist.train = MNISTAdapter(ds_train, ds_info.splits['train[:90%]'].num_examples)
mnist.validation = MNISTAdapter(ds_val, ds_info.splits['train[90%:]'].num_examples)
mnist.test = MNISTAdapter(ds_test, ds_info.splits['test'].num_examples)

input_size = 784
output_size = 10
hidden_layer_size = 50
max_epochs = 50 # 补充定义最大训练轮次
prev_validation_loss = float('inf') # 初始化早停对比变量

tf.compat.v1.reset_default_graph()

# 声明占位符
inputs = tf.placeholder(tf.float32, [None, input_size])
targets = tf.placeholder(tf.float32, [None, output_size])

# 第一层参数
weights_1 = tf.get_variable("weights_1", [input_size,hidden_layer_size])
biases_1 = tf.get_variable("biases_1", [hidden_layer_size])
outputs_1 = tf.nn.relu(tf.matmul(inputs,weights_1) + biases_1)

# 第二层参数
weights_2 = tf.get_variable("weights_2", [hidden_layer_size, hidden_layer_size])
biases_2 = tf.get_variable("biases_2", [hidden_layer_size])
outputs_2 = tf.nn.relu(tf.matmul(outputs_1, weights_2) + biases_2)

# 输出层参数
weights_3 = tf.get_variable("weights_3", [hidden_layer_size,output_size])
biases_3 = tf.get_variable("biases_3", [output_size])
outputs = tf.matmul(outputs_2, weights_3) + biases_3

# 损失函数与优化器
loss = tf.nn.softmax_cross_entropy_with_logits(logits=outputs, labels=targets)
mean_loss = tf.reduce_mean(loss)
optimize = tf.train.AdamOptimizer(learning_rate=0.001).minimize(mean_loss)

# 准确率计算
out_equals_target = tf.equal(tf.argmax(outputs,1),tf.argmax(targets,1))
accuracy = tf.reduce_mean(tf.cast(out_equals_target, tf.float32))

# 训练流程
sess = tf.InteractiveSession()
initializer = tf.global_variables_initializer()
sess.run(initializer)

batch_size = 100
batches_number = mnist.train._num_examples // batch_size

for epoch_counter in range(max_epochs):
    curr_epoch_loss = 0.
    for batch_counter in range(batches_number):
        input_batch, target_batch = mnist.train.next_batch(batch_size)
        _, batch_loss = sess.run([optimize, mean_loss],
                                feed_dict = {inputs: input_batch, targets: target_batch})
        curr_epoch_loss += batch_loss
    curr_epoch_loss /= batches_number

    # 验证集计算
    input_batch, target_batch = mnist.validation.next_batch(mnist.validation._num_examples)
    validation_loss, validation_accuracy = sess.run([mean_loss,accuracy],
                                                    feed_dict={inputs: input_batch, targets: target_batch})

    # 结果打印
    print('Epoch {0} | 训练损失: {1:.3f} | 验证损失: {2:.3f} | 验证准确率: {3:.2f}%'.format(
        epoch_counter + 1, curr_epoch_loss, validation_loss, validation_accuracy * 100.
    ))
    # 早停逻辑
    if validation_loss > prev_validation_loss:
        break
    prev_validation_loss = validation_loss

print('End of training.')

内容的提问来源于stack exchange,提问作者Alusine Barrie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:39:00