哈哈哈哈哈,两年没有写博客了
本科学的硬件,现在考上研究生了,在学习计算机视觉,所以你们问我的以前我写的那些博客的问题我几乎是回答不上来了,哈哈哈哈哈哈哈,自己解决吧
现在是从头开始学习GAN
以后会好好记录现在的学习生活的
这周用tensorflow实现了一个手写minist数据集,这算是计算机视觉中基础的基础吧,但是运行出来的时候我也很开心,毕竟都是自己一步一步去解决的问题
代码参考的是
https://github.com/lzx1019056432/Tensorflow-mnist
我本来以为的是我可以直接用这里的代码运行一次,因为我只是想看一下他的实现效果,会生成哪些文件夹,但是也出现了一些问题
这是他的源码
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#获取mnist里面的数据,并返回一个DataSet实例,下载数据存储到《minist_data目录下》
mnist = input_data.read_data_sets('mnist_data',one_hot=True)
#占位符 类型是浮点型 形状是二维,这里的none表示第一个维度可以是任意长度
input_x = tf.compat.v1.placeholder(tf.float32,[None,28*28],name='input_x')
#输出的值呢 为 一个二维的,onehot形式的
output_y = tf.compat.v1.placeholder(tf.int32,[None,10],name='output_y')
#logits_output = tf.compat.v1.placeholder(tf.int32,[None,10],name='logit_output')
#-1表示不考虑输入图片的数量
image = tf.reshape(input_x,[-1,28,28,1])#改变形状之后的输入
#取测试图片和标签
test_x = mnist.test.images[:3000]
test_y = mnist.test.labels[:3000]
#第一层卷积
conv1 = tf.layers.conv2d(inputs=image,#输入
filters=32,#32个过滤器
kernel_size=[5,5],#过滤器在二维的大小是5*5
strides=1,#步长是1
padding='same',#same表示输出的大小不变,因此需要补零
activation=tf.nn.relu#激活函数
)#形状[28,28,32]
print(conv1.shape)
#第二层 池化
pool1 = tf.layers.max_pooling2d(
inputs=conv1,#第一层卷积后的值
pool_size=[2,2],#过滤器二维大小2*2
strides=2 #步长2
)#形状[14,14,32]
#第三层 卷积2
conv2 = tf.layers.conv2d(inputs=pool1,
filters=64,
kernel_size=[5,5],
strides=1,
padding='same',
activation=tf.nn.relu
)#形状[14,14,64]
#第四层 池化2
pool2 = tf.layers.max_pooling2d(
inputs=conv2,
pool_size=[2,2],
strides=2
)#形状[7,7,64]
#平坦化
print(pool2.shape,'pool2的shape')
flat = tf.reshape(pool2,[-1,7*7*64])
print(flat.shape,'flat shape')
#1024个神经元的全连接层
dense = tf.layers.dense(inputs=flat,units=1024,activation=tf.nn.relu)
print(dense.shape)
#Dropout 丢弃百分之50
#dropout = tf.layers.dropout(inputs=dense,rate=0.5)
#输出 形状是[1,1,10],10个神经元的全连接层
dense2 = tf.layers.dense(inputs=dense,units=512,name="dense2")
logits = tf.layers.dense(inputs=dense2,units=10,name="logit_1")
#计算误差,使用交叉熵(交叉熵用来衡量真实值和预测值的相似性)
loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits)
#学习率0.001 最小化loss值,adam优化器
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
#精度 计算预测值和实际标签的匹配程度
#tf.argmax:返回张量轴上具有最大值的索引,axis=0是按列来说,axis=1 是按行来
#返回(accuracy,update_op) 前者是截止到上一个batch为止的准确值,后者为更新本批次的准确度
accuracy = tf.metrics.accuracy(
labels=tf.argmax(output_y,axis=1),
predictions=tf.argmax(logits,axis=1),)[1]
tf.add_to_collection('logits',logits)
tf.add_to_collection('accuracy',accuracy)
sess = tf.compat.v1.Session()#创建一个会话
#初始化全局变量和局部变量
init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init)
#Writer = tf.summary.FileWriter('./log')
#Writer.add_graph(sess.graph)
for i in range(200):
#获取以batch_size为大小的一个元组,包含一组图片和标签
batch = mnist.train.next_batch(50)
train_loss,train_op_,logits_output = sess.run([loss,train_op,logits],{input_x:batch[0],output_y:batch[1]})
if i % 100 == 0:
test_accuracy = sess.run(accuracy,{input_x:test_x,output_y:test_y})
print(("step=%d,Train loss=%.4f,[Test accuracy=%.2f]") \
% (i, train_loss, test_accuracy))
#测试
test_output = sess.run(logits,{input_x:test_x[1:2]})
inferenced_y = np.argmax(test_output,1)
print(test_output,'test_out')
print(inferenced_y,'Inferenced numbers')#推测的数据
print(np.argmax(test_y[1:2],1),'Real numbers')
test_x[:2]
saver = tf.compat.v1.train.Saver()#保存模型方法一
saver.save(sess,"./model/model",global_step=200)#保存模型方法一
#builder = tf.saved_model.builder.SavedModelBuilder('check_path_mnist')#保存模型方法二
#builder.add_meta_graph_and_variables(sess,['predict_mnist'])#保存模型方法二
#builder.save()#保存模型方法二
说一下我遇到的问题,按道理来说这里的源码确实是可以用tensorflow1运行的,但是我安装的是tensorflow2版本,所以就遇到了问题
from tensorflow.examples.tutorials.mnist import input_data
这句代码实现的是自动下载minist数据集,但是我的报错是找不到examples文件,我是在miniconda上创建的tensorflow虚拟环境,我参考的是这一篇博客
https://blog.csdn.net/xiguangyong/article/details/114409988?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166729526016800180661745%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166729526016800180661745&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-114409988-null-null.142v62pc_search_tree,201v3control_2,213v1control&utm_term=from%20tensorflow.examples.tutorials.mnist%20import%20input_data&spm=1018.2226.3001.4187
一定要找对路径!!!!我的路径是
一定是在环境里面找!!!如果没有tensorflow_core文件也没有关系,直接将example解压到tensorflow文件夹是一样的
解压过后要重新打开python,不要直接就认为是可以了,“重启”对于程序员来说,懂的都懂!!!
遇到的第二个问题是
import tensorflow as tf
因为我用的tensorflow2,所以其实很多报错都是这个原因引起的
解决办法是,将
import tensorflow as tf
替换为
import tensorflow._api.v2.compat.v1 as tf
tf.disable_v2_behavior()
因为刚开始不知道是版本的问题,所以我是一个一个去解决的,在解决placeholder不能使用时,我在定义前面添加了一行
tf.compat.v1.disable_eager_execution()
不知道这一行代码有没有用,哈哈哈哈哈,反正加了就先记录一下,敲代码嘛,随意就好
最后我的代码是
import numpy as np
import tensorflow._api.v2.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.examples.tutorials.mnist import input_data
# 获取mnist里面的数据,并返回一个DataSet实例,下载数据存储到《minist_data目录下》
mnist = input_data.read_data_sets('mnist_data',one_hot=True)
# 占位符 类型是浮点型 形状是二维,这里的none表示第一个维度可以是任意长度
tf.compat.v1.disable_eager_execution()
input_x = tf.compat.v1.placeholder(tf.float32,[None,28*28],name='input_x')
# 输出的值呢 为 一个二维的,onehot形式的
output_y = tf.compat.v1.placeholder(tf.int32,[None,10],name='output_y')
# logits_output = tf.compat.v1.placeholder(tf.int32,[None,10],name='logit_output')
# -1表示不考虑输入图片的数量
image = tf.reshape(input_x,[-1,28,28,1])
# 改变形状之后的输入
# 取测试图片和标签
test_x = mnist.test.images[:3000]
test_y = mnist.test.labels[:3000]
# 第一层卷积
conv1 = tf.layers.conv2d(inputs=image,
filters=32,
kernel_size=[5,5],
strides=1,
padding='same',
activation=tf.nn.relu
)
# 形状[28,28,32]
print(conv1.shape)
# 第二层 池化
pool1 = tf.layers.max_pooling2d(
inputs=conv1,
pool_size=[2,2],
strides=2
)
# 形状[14,14,32]
# 第三层 卷积2
conv2 = tf.layers.conv2d(inputs=pool1,
filters=64,
kernel_size=[5,5],
strides=1,
padding='same',
activation=tf.nn.relu
)
# 形状[14,14,64]
# 第四层 池化2
pool2 = tf.layers.max_pooling2d(
inputs=conv2,
pool_size=[2,2],
strides=2
)
# 形状[7,7,64]
# 平坦化
print(pool2.shape,'pool2的shape')
flat = tf.reshape(pool2,[-1,7*7*64])
print(flat.shape,'flat shape')
# 1024个神经元的全连接层
dense = tf.layers.dense(inputs=flat,units=1024,activation=tf.nn.relu)
print(dense.shape)
# Dropout 丢弃百分之50
# dropout = tf.layers.dropout(inputs=dense,rate=0.5)
# 输出 形状是[1,1,10],10个神经元的全连接层
dense2 = tf.layers.dense(inputs=dense,units=512,name="dense2")
logits = tf.layers.dense(inputs=dense2,units=10,name="logit_1")
# 计算误差,使用交叉熵(交叉熵用来衡量真实值和预测值的相似性)
loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits)
# 学习率0.001 最小化loss值,adam优化器
train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
# 精度 计算预测值和实际标签的匹配程度
# tf.argmax:返回张量轴上具有最大值的索引,axis=0是按列来说,axis=1 是按行来
# 返回(accuracy,update_op) 前者是截止到上一个batch为止的准确值,后者为更新本批次的准确度
accuracy = tf.metrics.accuracy(
labels=tf.argmax(output_y,axis=1),
predictions=tf.argmax(logits,axis=1),)[1]
tf.add_to_collection('logits',logits)
tf.add_to_collection('accuracy',accuracy)
sess = tf.compat.v1.Session()
# 创建一个会话
# 初始化全局变量和局部变量
init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init)
# Writer = tf.summary.FileWriter('./log')
# Writer.add_graph(sess.graph)
for i in range(200):
# 获取以batch_size为大小的一个元组,包含一组图片和标签
batch = mnist.train.next_batch(50)
train_loss,train_op_,logits_output = sess.run([loss,train_op,logits],{input_x:batch[0],output_y:batch[1]})
if i % 100 == 0:
test_accuracy = sess.run(accuracy,{input_x:test_x,output_y:test_y})
print(("step=%d,Train loss=%.4f,[Test accuracy=%.2f]") \
% (i, train_loss, test_accuracy))
# 测试
test_output = sess.run(logits,{input_x:test_x[1:2]})
inferenced_y = np.argmax(test_output,1)
print(test_output,'test_out')
print(inferenced_y,'Inferenced numbers')#推测的数据
print(np.argmax(test_y[1:2],1),'Real numbers')
test_x[:2]
saver = tf.compat.v1.train.Saver()#保存模型方法一
saver.save(sess,"./model/model",global_step=200)#保存模型方法一
# builder = tf.saved_model.builder.SavedModelBuilder('check_path_mnist')#保存模型方法二
# builder.add_meta_graph_and_variables(sess,['predict_mnist'])#保存模型方法二
# builder.save()#保存模型方法二
运行效果是
文件发生的变化是
minist是代码运行后下载的数据集,model是运行后保存的文件
其实我对敲代码还挺感兴趣的,就是遇到问题然后一个一个去解决,去梳理,我喜欢这样的过程。不急,慢慢来。研究生生活,好好加油!!!!