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
相关产品推荐
相关产品推荐

