1.# 执行计算图,首先要初始化变量
init = tf.global_variables_initializer()
batch_size = 20
train_steps = 100000 # 因为是一个神经元,所以还是挺快的
test_steps = 100 # 20 * 200 = 2000 张图片
# 对于tensorflow来说,在构建好计算图后,需要开启一个会话session
# 打开会话之后,就可以执行计算图了
with tf.Session() as sess:
sess.run(init)
for i in range(train_steps):
batch_data, batch_labels = train_data.next_batch(batch_size)
# 在会话中执行计算图使用sess.run()方法,如果加了train_op,就说明在这次run中我们就去训练了,如果没有,就是在测试模式下
# feed_dict:要喂入的数据,因为前面x和y都是placeholder,所以需要输入数据,x和y应该输入的是CIFAR-10的数据,分别是图片数据和label数据
# 需要在CIFAR-10数据集上循环遍历整个数据,使得feed_dict拿到的是不同的数据
# 为了达到这种处理模式,我们需要对CIFAR-10的数据集做一些处理
loss_val, acc_val, _ = sess.run(
[loss, accuracy, train_op],
feed_dict={x: batch_data, y: batch_labels})
# 打印log
if (i+1) % 500 == 0:
print('[Train] Step: %d, loss: %4.5f, acc: %4.5f' % (i+1, loss_val, acc_val))
if (i+1) % 5000 == 0:
# 因为test不用shuffle,所以遍历完之后抛出异常,所以需要在遍历完一次之后重新创建CifarData类
test_data = CifarData(test_filenames, False)
all_test_acc_val = [] # 需要做一个总的test上的结果,所以需要把这些结果加起来做平均
for j in range(test_steps):
test_batch_data, test_batch_labels = test_data.next_batch(batch_size)
test_acc_val = sess.run([accuracy], feed_dict={x: test_batch_data, y: test_batch_labels})
all_test_acc_val.append(test_acc_val)
test_acc = np.mean(all_test_acc_val)
print('[Test] Step: %d, acc: %4.5f' % (i+1, test_acc))
# 两次测试准确率是一样的,说明没有学习到什么东西,我们需要做一下改进——》CifarData
2.# 为什么不做归一化准确率在大约0.5呢?因为它的数值比较大,而且它的数值都在0-1之间,所以导致它的预测会偏向一方或另一方,类似于sigmoid
self._data = self._data / 127.5 - 1 # 一般来说,我们会把图像缩放到-1到1之间,所以进行缩放:归一化