【TensorFlow-windows】学习笔记八——简化网络书写

版权声明:欢迎大家一起交流,有错误谢谢指正~~~多句嘴,不要复制代码,因为CSDN排版问题,有些东西会自动加入乱糟糟的字符,最好是自己手写代码。格外注意被“踩”的博客,可能有很大问题,请自行查找大牛们的教程,以免被误导。最后,在确认博客理论正确性的前提下,随意转载,知识大家分享。 https://blog.csdn.net/zb1165048017/article/details/82189884

前言

之前写代码的时候都要预先初始化权重,还得担心变量是否会出现被重复定义的错误,但是看网上有直接用tf.layers构建网络,很简洁的方法。

这里主要尝试了不预定义权重,是否能够实现正常训练、模型保存和调用,事实证明阔以。

验证

训练与模型保存

很简洁的代码直接五十行实现了手写数字的网络训练

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("./TensorFlow-Examples-master/examples/3_NeuralNetworks/tmp",one_hot=True)

steps=5000
batch_size=100
def conv_network(x):
    x=tf.reshape(x,[-1,28,28,1])
    #第一层卷积
    conv1=tf.layers.conv2d(inputs=x,filters=32,kernel_size=[5,5],activation=tf.nn.relu)
    conv1=tf.layers.max_pooling2d(conv1,pool_size=[2,2],strides=[2,2])
    #第二层卷积
    conv2=tf.layers.conv2d(inputs=conv1,filters=64,kernel_size=[3,3],activation=tf.nn.relu)
    conv2=tf.layers.max_pooling2d(inputs=conv2,pool_size=[2,2],strides=[2,2])
    #第三层卷积
    conv3=tf.layers.conv2d(inputs=conv2,filters=32,kernel_size=[3,3],activation=tf.nn.relu)
    conv3=tf.layers.max_pooling2d(inputs=conv3,pool_size=[2,2],strides=[2,2])
    #全连接
    fc1=tf.layers.flatten(conv3)
    fc1=tf.layers.dense(fc1,500,activation=tf.nn.relu)
    #输出
    fc2=tf.layers.dense(fc1,10)
    fc2=tf.nn.softmax(fc2)
    return fc2

input_img=tf.placeholder(dtype=tf.float32,shape=[None,28*28],name='X')
input_lab=tf.placeholder(dtype=tf.int32,shape=[None,10])

#损失函数
output_lab=conv_network(input_img)
logit_loss=tf.nn.softmax_cross_entropy_with_logits_v2(labels=input_lab,logits=output_lab)
loss=tf.reduce_mean(tf.cast(logit_loss,tf.float32))
optim=tf.train.AdamOptimizer(0.001).minimize(loss)
#评估函数
pred_equal=tf.equal(tf.arg_max(output_lab,1),tf.arg_max(input_lab,1))
accuracy=tf.reduce_mean(tf.cast(pred_equal,tf.float32))

init=tf.global_variables_initializer()
saver=tf.train.Saver()
tf.add_to_collection('pred',output_lab)
with tf.Session() as sess:
    sess.run(init)
    for step in range(steps):
        data_x,data_y=mnist.train.next_batch(batch_size)
        sess.run(optim,feed_dict={input_img:data_x,input_lab:data_y})
        if step%100==0 or step==1:
            accuracy_val=sess.run(accuracy,feed_dict={input_img:data_x,input_lab:data_y})
            print('step'+str(step)+' ,loss '+'{:.4f}'.format(accuracy_val))
    print('training finished!!')
    saver.save(sess,'./layermodel/CNN_layer')

调用模型

实现单张手写数字的识别

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import cv2
saver=tf.train.import_meta_graph('./layermodel/CNN_layer.meta')
sess=tf.Session()
saver.restore(sess,'./layermodel/CNN_layer')
graph=tf.get_default_graph()
print(graph.get_all_collection_keys())
#['pred', 'train_op', 'trainable_variables', 'variables']
print(graph.get_collection('trainable_variables'))
prediction=graph.get_collection('pred')
X=graph.get_tensor_by_name('X:0')
#读取图片
image=cv2.imread('./mnist/test/2/2_2.png')
image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
plt.imshow(image)
plt.show()
#显示图片
input_img=np.reshape(image,[1,28*28])
result=sess.run(prediction,feed_dict={X:input_img})
print(result)
#[array([[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)]

后记

其实主要是为了后续使用tf.layers里面的其它结构比如BN做准备,因为代码越复杂,写起来越恶心,不如现在看看如何简化代码,第一步就是去除了权重的预定义,后续慢慢研究其它的。

训练代码:链接:https://pan.baidu.com/s/1gmX-YBkz4nNG3RpJ_rEBKQ 密码:o8u2

测试代码:链接:https://pan.baidu.com/s/1ME9pgyM9TNQadmzMeURlNg 密码:5z7k

猜你喜欢

转载自blog.csdn.net/zb1165048017/article/details/82189884