Numpy Tensorflow不训练CIFAR-100数据

Numpy Tensorflow不训练CIFAR-100数据,numpy,machine-learning,tensorflow,computer-vision,classification,Numpy,Machine Learning,Tensorflow,Computer Vision,Classification,我正在尝试使用TensorFlow用CIFAR-100构建一个线性分类器。我从Martin Gorner的MNIST教程中获得了代码,并做了一些更改。当我运行这段代码时,tensorflow并没有进行训练(代码正在运行,但精度仍然为1.0,而损失(交叉熵仍然为4605.17),我不知道怎么回事,我实际上是TF的新手,非常感谢您的帮助 导入pickle 将numpy作为np导入 导入操作系统 导入tensorflow作为tf 从tensorflow.python.framework导入tenso

我正在尝试使用TensorFlow用CIFAR-100构建一个线性分类器。我从Martin Gorner的MNIST教程中获得了代码,并做了一些更改。当我运行这段代码时,tensorflow并没有进行训练(代码正在运行,但精度仍然为1.0,而损失(交叉熵仍然为4605.17),我不知道怎么回事,我实际上是TF的新手,非常感谢您的帮助

导入pickle
将numpy作为np导入
导入操作系统
导入tensorflow作为tf
从tensorflow.python.framework导入tensor\u util
输入数学
#导入数据
def取消勾选(文件):
进口泡菜
打开(文件“rb”)作为fo时:
dict=pickle.load(fo,encoding='bytes')
返回指令
cifar100_测试={}
cifar100_列车={}
labelMap={}
labelNames={}
#加载原始CIFAR-10数据。
cifar100_test=unpickle('dataset/cifar-100-python/test'))
cifar100\u train=unpickle('dataset/cifar-100-python/train'))
labelMap=unpickle('dataset/cifar-100-python/meta')
#tr表示训练数据,te表示测试数据,X表示数据,Y表示标签
Xtr=cifar100\U列[b'数据']
Yr=cifar100\u列车[b'精细标签']
Xte=cifar100_测试[b'数据']
Ye=cifar100_测试[b'精细标签']
classNames=labelMap[b'fine\u label\u names']
num_train=Xtr.shape[0]
num_test=Xte.shape[0]
num_class=len(类名)
Ytr=np.0([num\u列,num\u类])
Yte=np.零([num\u测试,num\u类])
Ytr[0:num\u列车,Yr[0:num\u列车]]=1
Yte[0:num_测试,Ye[0:num_测试]]=1
#作为健全性检查,我们打印出培训和测试数据的大小。
打印('列车数据形状:',Xtr.shape)
打印('列车标签形状:',本年度形状)
打印('测试数据形状:',Xte.shape)
打印('测试标签形状:',Yte.shape)
print('Predicted Class的名称:',classNames[0])#标签名称的标记是该类的标记。
Xtrain=Xtr#[:1000]
Xtest=Xte#[:100]
Ytrain=Ytr[1000]
Ytest=Yte#[:100]
打印('列车数据形状:',Xtrain.shape)
打印('列车标签形状:',Ytrain.shape)
打印('测试数据形状:',Xtest.shape)
打印('测试标签形状:',Y测试形状)
Xtrain=np.重塑(Xtrain,(50000,32,32,3)).转置(0,1,2,3).aType(float)
Xtest=np.重塑(Xtest,(10000,32,32,3)).转置(0,1,2,3).aType(float)
Xbatches=np.split(Xtrain,500)#第二个数字是#个批次
Ybatches=np.split(np.asarray(Ytrain),500);
XtestB=np.split(xtest100);
YtestB=np.split(ytest100);
打印('X#批:',len(Xbatches))
打印('Y#批:',len(Y批))
#输入X:28x28灰度图像,第一个维度(无)将索引小批量中的图像
X=tf.placeholder(tf.float32[100,32,32,3])
#正确答案会在这里
Y=tf.占位符(tf.float32,[100100])
#权重W[784,10]784=28*28
W=tf.变量(tf.零([3072100]))
#偏见b[10]
b=tf.变量(tf.零([100]))
#将图像展平为一行像素
#形状定义中的-1表示“保留元素数量的唯一可能尺寸”
XX=tf.重塑(X,[-13072])
#模型
Y=tf.nn.softmax(tf.matmul(XX,W)+b)
#损失函数:交叉熵=-和(Y_i*log(Yi))
#Y:计算出的输出向量
#Y:所需的输出向量
#交叉熵
#log取每个元素的log,*将张量元素乘以元素
#reduce_-mean将把张量中的所有分量相加
#因此,这里我们得到了该批中所有图像的总交叉熵
cross_熵=-tf.reduce_mean(Y_*tf.log(Y))*1000.0#对100幅图像进行归一化,
#*10,因为“平均值”包含一个不需要的除以10的除法
#训练模型的精度,介于0(最差)和1(最佳)之间
正确的预测=tf.equal(tf.argmax(Y,1),tf.argmax(Y,1))
准确度=tf.reduce_平均值(tf.cast(正确的预测,tf.float32))
#培训,学习率=0.005
训练步长=tf.训练梯度降熵器(0.01).最小化(交叉熵)
#初始化
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(初始化)
对于范围(500)内的i:
#反向传播训练步骤
t、 Loss=sess.run([train\u step,cross\u entropy],feed\u dict={X:Xbatches[i],Y:Ybatches[i]})
打印(丢失)
印刷品(一)
对于范围(100)内的i:

print('accurity:',sess.run(accurity,feed_dict={X:XtestB[i],Y:YtestB[i]}))
在训练过程完成后,您计算了100次精度。那里不会有任何变化。您应该将
print('accurity:'…)
放在执行反向传播的for循环中:

for i in range(500):
    # the backpropagation training step
    t, Loss = sess.run([train_step, cross_entropy], feed_dict={X: Xbatches[i], Y_: Ybatches[i]})
    print(Loss)
    print(i)
    print('accuracy:', sess.run(accuracy, feed_dict={X: XtestB[i], Y_: YtestB[i]}))

很抱歉,这是一个基本的错误。 我跟着改变了

Ytr[0:num_train, Yr[0:num_train]] = 1
Yte[0:num\u测试,Ye[0:num\u测试]]=1

Ytr[范围(数量列车)]、Yr\u温度[范围(数量列车)]]=1
Yte[范围(数值测试),Ye_温度[范围(数值测试)]]=1


第一个将所有值设为1,但我只想表示真正的类1和其他元素0。感谢您的时间。

您可以尝试使用随机值而不是零来初始化
W
变量吗?我已经尝试过了,但不起作用。@mrry实际上是为了测试准确性而这样做的,每次我都用不同的批处理调用它测试数据。所以它应该会有一些变化。我的问题是培训课程根本不起作用。损失也不会改变。当我运行代码时,它只是通过迭代快速完成。