(1)非计算机专业的小可爱,最近在学习《深度学习 入门与实践》这本书,感受:对新手来讲是比较友好的入门级教材。
(2)书中给的数据集和代码下载的链接失效了,就自己整理了一部分呐~
https://code.google.com/archive/p/supplement-of-the-mnist-database-of-handwritten-digits/downloads
下面是我根据书中要求整理好的数据集:
根据博客:
https://blog.csdn.net/xrinosvip/article/details/105916857
代码1如下(示例):
from PIL import Image
import numpy as np
import os
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.customxml.networkwriter import NetworkWriter
net=buildNetwork(784,30,10,bias=True)
ds=SupervisedDataSet(784,10)
for i in range(0,3):# 0-9共10个文件夹
for f in os.listdir('D:\\ucas_homework\\deep_learning\\t10k-images\\% s'% i):#每个文件夹里的图片
if f.endswith('.bmp'):
print(f)
im=Image.open('D:\\ucas_homework\\deep_learning\\t10k-images\\% s\\% s'%(i,f))
mtr=np.array(im)
s=mtr.reshape(1,784)
for j in range(0,784):#图像二值化
if s[0][j]!=0:
s[0][j]=1
c=[0,0,0,0,0,0,0,0,0,0]
c[i]=1
ds.addSample(s[0],c)
print(mtr);
print('end of folder %s' % i)
trainer=BackpropTrainer(net,ds)
trainer.trainUntilConvergence()
NetworkWriter.writeToFile(net,'Model.xml')#考察整个测试集的正确率,可将训练好的模型加入到model.xml文件中。通过model.xml可以测试全部测试集的正确率
print("training end")
print("first begin test 0_977.bmp")
im=Image.open('D:\\ucas_homework\\deep_learning\\t10k-images\\0\\0_977.bmp')
mtr=np.array(im)
s=mtr.reshape(1,784)
for j in range(0,784):# 图像二值化
if s[0][j]!=0:
s[0][j]=1
prediction=net.activate(s[0])
print("output is"+str(prediction)+"end test 0_977.bmp")
print("second begin test 1_1108.bmp")
im1=Image.open('D:\\ucas_homework\\deep_learning\\t10k-images\\1\\1_1108.bmp')
mtr1=np.array(im1)
s1=mtr1.reshape(1,784)
for j in range(0,784): #图像二值化
if s1[0][j]!=0:
s1[0][j]=1
prediction1=net.activate(s1[0])
print("output is "+str(prediction1)+"end test 1_1108.bmp")
print("third begin test 2_1026.bmp")
im2=Image.open('D:\\ucas_homework\\deep_learning\\t10k-images\\2\\2_1026.bmp')
mtr2=np.array(im2)
s2=mtr2.reshape(1,784)
for j in range(0,784): #图像二值化
if s2[0][j]!=0:
s2[0][j]=1
prediction1=net.activate(s2[0])
print("output is "+str(prediction1)+"end test 2_1026.bmp")
代码2如下(示例):
from PIL import Image
import numpy as np
import os
from pybrain.tools.customxml.networkreader import NetworkReader
newnet=NetworkReader.readFrom('Model.xml')
print("start load model")
for i in range(0,3):
right=0
filecount=0
for f in os.listdir('D:\\ucas_homework\\deep_learning\\t10k-images\\% s'% i):
if f.endswith('.bmp'):
filecount+=1
im=Image.open('D:\\ucas_homework\\deep_learning\\t10k-images\\% s\\% s'%(i,f))
mtr=np.array(im)
s=mtr.reshape(1,784)
for j in range(0,784):
if s[0][j]!=0:
s[0][j]=1
prediction=newnet.activate(s[0])
if prediction.argmax()==i:
right+=1
rate=float(right)/filecount
print("the testing number is "+str(i)+":"+str(filecount)+"image are tested,"+str(right)+"images are right,"+"the accuracy is"+str(rate))
一个有趣的网站(书里有网址的相关介绍哦~):https://www.cs.ryerson.ca/~aharley/vis/conv/flat.html
根据博客:
使用Anaconda3 5.2.0安装tensorflow
https://blog.csdn.net/dongcjava/article/details/109524981
在pycharm中使用刚才安装好的tensorflow:
https://blog.csdn.net/dream_summer/article/details/107394039
注意:
⭐1.本书用的是tensorflow1.0版,如果安装tensorflow2.0,后续实例运行自然会出错啦。
下面是一个介绍tensorflow1.0和tensorflow2.0区别的博客咯:
https://blog.csdn.net/zhouchen1998/article/details/101108777#:~:text=TensorFl,%EF%BC%89%E6%96%B9%E9%9D%A2%E5%A4%87%E5%8F%97%E5%A5%BD%E8%AF%84%E3%80%82
⭐2.下载同上篇博文里一样版本的Anaconda(Anaconda3 5.2.0),应该会默认配置python3.6(就我的理解,tensorflow对python3.6兼容好一点吧,应该是不会出错的哦~)
⭐3. 在安装tensorflow的时候注意版本问题,根据这本书,选择tensorflow1.15.0是应该没问题的。(就是修改下面那行代码啦~)
pip install tensorflow-cpu==1.15.0 -i https://pypi.mirrors.ustc.edu.cn/simple
代码如下(示例):
import tensorflow as tf
#加下面这行命令是因为一个warning,具体参考这个博客:https://blog.csdn.net/jemary_/article/details/104197308
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
from scipy import stats
import matplotlib.pyplot as pyplot
#之所以加下面两行命令,是因为一些报错问题,具体参考这个博客解决:https://blog.csdn.net/hq86937375/article/details/79696023
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
#这本书给定的tensorflow是1.0版本,因此如果安装的是tensorflow2,可能不适用。
data=[]
for l in open('D:\\ucas_homework\\deep_learning\\deep_learning_python\\height.txt'):
row=[float(x) for x in l.split()]
if len(row)>0:
data.append(row)
x_data=[l[0] for l in data]
y_data=[l[1] for l in data]
pyplot.plot(x_data,y_data,'bo',label='height data')
pyplot.legend()
pyplot.show()
w=tf.Variable(-1.0,name="weights")
b=tf.Variable(75.4,name="bias")
y=w*x_data+b
loss=tf.reduce_mean(tf.square(y-y_data))
optimizer=tf.train.GradientDescentOptimizer(0.00001)
train=optimizer.minimize(loss)
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
for step in range(1000):
#如果你用的是python2,就用 for step in xrange(1000):
sess.run(train)
print(step,sess.run(w),sess.run(b),sess.run(loss))
和上面mnist数据集下载的地方一样啦,当然,下面给出我根据书中内容整理好的数据集:
代码如下(示例):
import tensorflow as tf
#加下面这行命令是因为一个warning,具体参考这个博客:https://blog.csdn.net/jemary_/article/details/104197308
tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)
import numpy as np
import os
#之所以加下面一行命令,是因为一些报错问题,具体参考这个博客解决:https://blog.csdn.net/hq86937375/article/details/79696023
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
from PIL import Image
#加载测试集数据
x_data_train=[]
y_label_train=[]
for i in range(0,10):# 数字0-9共10个文件夹
for f in os.listdir('D:/ucas_homework/deep_learning/t10k-images/training_set/%s'%i):#每个文件夹里的图片
if f.endswith('.bmp'):
im=Image.open('D:/ucas_homework/deep_learning/t10k-images/training_set/% s/% s'%(i,f))
mtr=np.array(im)
s=mtr.reshape(1,784)
for j in range(0,784):#图像二值化
if s[0][j]!=0:
s[0][j]=1
c=[0,0,0,0,0,0,0,0,0,0]
c[i]=1
x_data_train.append(s[0])
y_label_train.append(c)
print("end of training folder %s" % i)
x_data_test=[]
x_data_num=[]
#读入测试数据
for i in range(0,10):#数字0-9共10个文件夹
count=0
for f in os.listdir('D:\\ucas_homework\\deep_learning\\t10k-images\\testing_set/%s'%i):
if f.endswith('.bmp'):
im=Image.open('D:\\ucas_homework\\deep_learning\\t10k-images\\testing_set/%s/%s'%(i,f))
mtr=np.array(im)
s=mtr.reshape(1,784)
for j in range(0,784):
if s[0][j]!=0:
s[0][j]=1
x_data_test.append(s[0])
count+=1
x_data_num.append(count)
print('end of testing folder % s'% i)
#定义神经网络层
def Layer(input,inSize,outSize,phi=None):
with tf.name_scope('layer'):
with tf.name_scope('weight'):
w=tf.Variable(tf.random_normal([inSize,outSize]))
with tf.name_scope('basis'):
b=tf.Variable(tf.zeros([1,outSize])+0.1)
with tf.name_scope('z'):
z=tf.matmul(input,w)+b
if phi is None:
output=z
else:
output=phi(z)
return output
x_data_train=np.array(x_data_train)
y_label_train=np.array(y_label_train)
x_data_test=np.array(x_data_test)
with tf.name_scope('inputs'):
xs=tf.placeholder(tf.float32,[None,784])
ys=tf.placeholder(tf.float32,[None,10])
l1=Layer(xs,784,30,phi=tf.nn.relu)
l2=Layer(l1,30,10,phi=None)
with tf.name_scope('loss'):
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=l2,labels=ys)) # 进行了报错修改,参考博客:https://www.cnblogs.com/bob-coder/p/11750871.html
with tf.name_scope('train'):
train=tf.train.GradientDescentOptimizer(0.5).minimize(loss)
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
for i in range(20000):
sess.run(train,feed_dict={
xs:x_data_train,ys:y_label_train})
print('step %s'% i,'loss is ',sess.run(loss,feed_dict={
xs:x_data_train,ys:y_label_train}))
writer=tf.train.SummaryWriter('logs/',sess.graph)
x_test=x_data_test[0:4,:]
np.set_printoptions(threshold='nan')
result=sess.run(12,feed_dict={
xs:x_test})
print('character 0 testing output :')
print(result)
flag=0
for i in range(10):
num=x_data_num[i]
x_test=x_data_test[flag:(flag+num),:]
result=sess.run(l2,feed_dict={
xs:x_test})
corr_num=0
for j in range(num):
if np.argmax(result[j])==i:
corr_num+=1
rate=float(corr_num)/float(num)
print('character %s has %s,testing images,correct number is %s,accuracy is %s'%(i,num,corr_num,rate))
flag+=num