项目实训第二周工作总结---tensorflow学习笔记

原创 2018年04月16日 21:35:02

     这周我主要学习了一下tensorflow的用法,并做了几个实践的小项目

第一部分

1.1 创建图,启动图

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 19:34:29 2018


@author: sduhao

"""


#创建图 启动图

import tensorflow as tf


m1=tf.constant([[3,3]])

m2=tf.constant([[2],[3]])


product=tf.matmul(m1,m2)


with tf.Session()as sess:

    result=sess.run(product)

    print(result)

1.2变量

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 19:37:35 2018


@author: sduhao

"""


#tensorflow中的变量

import tensorflow as tf


x=tf.Variable([1,2])

a=tf.constant([3,3])

sub=tf.subtract(x,a)

add=tf.add(x,a)


init=tf.global_variables_initializer()  #变量必须初始化


with tf.Session() as sess:

    sess.run(init)

    print sess.run(sub)

    print sess.run(add)


1.3赋值操作

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 19:40:48 2018


@author: sduhao

"""


import tensorflow as tf


state=tf.Variable(0,name="counter")

new_value=tf.add(state,1)

update=tf.assign(state,new_value)  #赋值操作

init=tf.global_variables_initializer()


with tf.Session() as sess:

    sess.run(init)

    print sess.run(state)

    for _ in range(5):

        sess.run(update)

        print sess.run(state)

        

1.4 Fetch And Feed

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 19:44:14 2018


@author: sduhao

"""


#Fetch 同时运行多个运算符

import tensorflow as tf


input1=tf.constant(2.0)

input2=tf.constant(3.0)

input3=tf.constant(5.0)


add=tf.add(input1,input2)

mul=tf.multiply(input3,add)


with tf.Session() as sess:

    res=sess.run([mul,add])

    print res


#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 19:47:21 2018


@author: sduhao

"""


#Feed 创建占位符

import tensorflow as tf


input1=tf.placeholder(tf.float32)

input2=tf.placeholder(tf.float32)

mul=tf.multiply(input1,input2)


with tf.Session() as sess:

    res=sess.run(mul,feed_dict={input1:[8.],input2:[2.]}) #Feed 数据以字典的形式传入

    print res

1.5小例子:线性逼近

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 19:50:46 2018


@author: sduhao

"""


#tensorflow 简单示例

import tensorflow as tf

import numpy as np


x_data=np.random.rand(100)   #生成100个随机数

y_data=x_data*0.1+0.2    #构造一条直线


#构造一个线性模型 逼近上述直线

b=tf.Variable(1.1)

k=tf.Variable(0.5)

y=k*x_data+b


#定义均方误差

loss=tf.reduce_mean(tf.square(y-y_data))

#用梯度下降法训练优化

optimizer=tf.train.GradientDescentOptimizer(0.2)#学习率

train=optimizer.minimize(loss)


init=tf.global_variables_initializer()


with tf.Session() as sess:

    sess.run(init)

    for step in range(201):

        sess.run(train)

        if(step%20==0):

            print step,sess.run([k,b])

            

第二部分

2.1非线性回归

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 19:58:47 2018


@author: sduhao

"""


#非线性回归

import tensorflow as tf

import numpy as np

import matplotlib.pyplot as plt


#生成200个随机样本点

x_data=np.linspace(-0.5,0.5,200)[:,np.newaxis] #并转换为列向量

noise=np.random.normal(0,0.02,x_data.shape) #生成同维度的噪声点

y_data=np.square(x_data)+noise


#定义两个占位符

x=tf.placeholder(tf.float32,[None,1]) #行根据具体情况确定 

y=tf.placeholder(tf.float32,[None,1])


#定义神经网络中间层

Weights_L1=tf.Variable(tf.random_normal([1,10])) #输入层1个神经元 中间层10个神经元

biases_L1=tf.Variable(tf.zeros([10]))

Wx_plus_b_L1=tf.matmul(x,Weights_L1)+biases_L1

L1=tf.nn.tanh(Wx_plus_b_L1)  #中间层输出 经过tanh激活函数


#定义神经网络输出层

Weights_L2=tf.Variable(tf.random_normal([10,1]))

biases_L2=tf.zeros([1])

Wx_plus_b_L2=tf.matmul(L1,Weights_L2)+biases_L2

prediction=tf.nn.tanh(Wx_plus_b_L2)


#定义均方误差

loss=tf.reduce_mean(tf.square(prediction-y))


#使用梯度下降发进行优化

train=tf.train.GradientDescentOptimizer(0.2).minimize(loss)


init=tf.global_variables_initializer()


with tf.Session() as sess:

    sess.run(init)

    for _ in range(2000):

        sess.run(train,feed_dict={x:x_data,y:y_data})

    predict_value=sess.run(prediction,feed_dict={x:x_data})

    

    plt.figure()

    plt.scatter(x_data,y_data)

    plt.plot(x_data,predict_value,'r-',lw=5)

    plt.show()

2.2手写数字识别v1(准备率91%)

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 20:16:25 2018


@author: sduhao

"""


'''

MNIST手写数字识别

MNIST数据集:

60000个训练样本,10000个测试样本

每张图片像素28*28  784*1

训练集  60000*784,测试集 10000*784

标签用one-hot vector表示  eg. 1:[0,1,0,0,0,0,0,0,0,0]

训练集标签 60000*10,测试集标签 10000*10


接下来搭建简单神经网络 只有输入层(784个神经元)和输出层(10个神经元)

使用softmax多分类器(将得分转换为概率)


'''


import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data


#载入数据

mnist=input_data.read_data_sets("MNIST_data",one_hot=True)


batch_size=100

n_batch=mnist.train.num_examples//batch_size


#定义placeholder

x=tf.placeholder(tf.float32,[None,784])  #Nonebatch_size对应

y=tf.placeholder(tf.float32,[None,10])


W=tf.Variable(tf.zeros([784,10]))

b=tf.Variable(tf.zeros([10]))

prediction=tf.nn.softmax(tf.matmul(x,W)+b)


#均方误差

loss=tf.reduce_mean(tf.square(y-prediction))


#梯度下降法

train=tf.train.GradientDescentOptimizer(0.2).minimize(loss)


init=tf.global_variables_initializer()


#计算准确率

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1)) #argmax找到值最大的分量所在的位置

accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


with tf.Session() as sess:

    sess.run(init)

    for epoch in range(21):   #21

        for bacth in range(n_batch):

            batch_xs,batch_ys=mnist.train.next_batch(batch_size)

            sess.run(train,feed_dict={x:batch_xs,y:batch_ys})

        acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})

        print "Iter"+str(epoch)+",Testing Accuracy"+str(acc)


'''

该程序是最简单的版本  准确率在91%左右,其有一下地方可以优化改进

1.batch_size的大小

2.神经网络的结构 加一些隐层(隐层的数量和内部神经元的数量)

3.神经网络权重参数和偏置参数的初始化方式

4.误差定义的方式  如可采用交叉熵

5.优化器的选择 以及学习率的设置

6.训练的轮数

第三部分

3.1手写数字识别v2(准确率96%,演示dropout)

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 20:45:59 2018


@author: sduhao

"""


'''

误差函数的定义:

若输出神经元是线性的,适合用均方误差

若输出神经元是S型的,适合用交叉熵


若最后一层使用了softmax多分类器,常用对数似然代价函数,训练快,收敛快

'''


'''

改进简单版本的手写数字识别,并演示dropout防止过拟合的效果

过拟合:在训练集上准确率非常高,测试集准确率低;训练集和测试集的准确率曲线差别较大

'''


'''tt

常用的优化器:

tf.train.GradientDescentOptimizer

tf.train.AdadeltaOptimizer

tf.train.MomentumOptimizer

tf.train.AdamOptimizer

...

'''


import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data


#载入数据

mnist=input_data.read_data_sets("MNIST_data",one_hot=True)


batch_size=100

n_batch=mnist.train.num_examples//batch_size


#定义placeholder

x=tf.placeholder(tf.float32,[None,784])  #Nonebatch_size对应

y=tf.placeholder(tf.float32,[None,10])

keep_prob=tf.placeholder(tf.float32) #dropout参数  训练时中间层神经层神经元的工作比例



#增加3个隐层,来演示dropout防过拟合的效果(实际上并不需要这么多隐层和神经元)


#隐层1

W1=tf.Variable(tf.truncated_normal([784,2000],stddev=0.1)) #权值参数一般用截断正态分布初始化

b1=tf.Variable(tf.zeros([2000])+0.1)   #偏置参数一般用zeros+0.1

L1=tf.nn.tanh(tf.matmul(x,W1)+b1)

L1_drop=tf.nn.dropout(L1,keep_prob)


#隐层2

W2=tf.Variable(tf.truncated_normal([2000,2000],stddev=0.1)) #权值参数一般用截断正态分布初始化

b2=tf.Variable(tf.zeros([2000])+0.1)   #偏置参数一般用zeros+0.1

L2=tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)

L2_drop=tf.nn.dropout(L2,keep_prob)


#隐层3

W3=tf.Variable(tf.truncated_normal([2000,1000],stddev=0.1)) #权值参数一般用截断正态分布初始化

b3=tf.Variable(tf.zeros([1000])+0.1)   #偏置参数一般用zeros+0.1

L3=tf.nn.tanh(tf.matmul(L2_drop,W3)+b3)

L3_drop=tf.nn.dropout(L3,keep_prob)


#输出层

W4=tf.Variable(tf.truncated_normal([1000,10],stddev=0.1)) #权值参数一般用截断正态分布初始化

b4=tf.Variable(tf.zeros([10])+0.1)   #偏置参数一般用zeros+0.1

prediction=tf.nn.softmax(tf.matmul(L3_drop,W4)+b4)


#对数似然代价函数

loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))


#使用Adam优化器

train=tf.train.AdamOptimizer(1e-3).minimize(loss)  #学习率一般很小


init=tf.global_variables_initializer()


#计算准确率

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1)) #argmax找到值最大的分量所在的位置

accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


with tf.Session() as sess:

    sess.run(init)

    for epoch in range(31):   #31

        for bacth in range(n_batch):

            batch_xs,batch_ys=mnist.train.next_batch(batch_size)

            sess.run(train,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.7}) #训练时隐层每层有70%的神经元工作

        

        train_acc=sess.run(accuracy,feed_dict={x:mnist.train.images,y:mnist.train.labels,keep_prob:1.0})#测试时所有神经元都工作

        test_acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})#测试时所有神经元都工作

        print "Iter"+str(epoch)+",Testing Accuracy"+str(test_acc)+",Training Accuracy"+str(train_acc)


3.2手写数字识别v3(准确率98%)

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Mon Apr 16 21:14:29 2018


@author: sduhao

"""


'''

优化以上各版本的程序,使手写数字识别能达到98%以上的准确率

'''


import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data


#载入数据

mnist=input_data.read_data_sets("MNIST_data",one_hot=True)


batch_size=100

n_batch=mnist.train.num_examples//batch_size


#定义placeholder

x=tf.placeholder(tf.float32,[None,784])  #Nonebatch_size对应

y=tf.placeholder(tf.float32,[None,10])

keep_prob=tf.placeholder(tf.float32) #dropout参数  训练时中间层神经层神经元的工作比例

lr=tf.Variable(0.001,dtype=tf.float32) #定义学习率为变量 使其能随着训练的深入动态变化 初始时较大,慢慢变小



#增加2个隐层


#隐层1

W1=tf.Variable(tf.truncated_normal([784,500],stddev=0.1)) #权值参数一般用截断正态分布初始化

b1=tf.Variable(tf.zeros([500])+0.1)   #偏置参数一般用zeros+0.1

L1=tf.nn.tanh(tf.matmul(x,W1)+b1)

L1_drop=tf.nn.dropout(L1,keep_prob)


#隐层2

W2=tf.Variable(tf.truncated_normal([500,300],stddev=0.1)) #权值参数一般用截断正态分布初始化

b2=tf.Variable(tf.zeros([300])+0.1)   #偏置参数一般用zeros+0.1

L2=tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)

L2_drop=tf.nn.dropout(L2,keep_prob)



#输出层

W3=tf.Variable(tf.truncated_normal([300,10],stddev=0.1)) #权值参数一般用截断正态分布初始化

b3=tf.Variable(tf.zeros([10])+0.1)   #偏置参数一般用zeros+0.1

prediction=tf.nn.softmax(tf.matmul(L2_drop,W3)+b3)


#对数似然代价函数

loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))


#使用Adam优化器

train=tf.train.AdamOptimizer(lr).minimize(loss)  #学习率一般很小


init=tf.global_variables_initializer()


#计算准确率

correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1)) #argmax找到值最大的分量所在的位置

accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


with tf.Session() as sess:

    sess.run(init)

    for epoch in range(51):   #51

        sess.run(tf.assign(lr,0.001*(0.95**epoch)))

        for bacth in range(n_batch):

            batch_xs,batch_ys=mnist.train.next_batch(batch_size)

            sess.run(train,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0}) #没有必要使用dropout 设置为1.0

        

        test_acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})#测试时所有神经元都工作

        print "Iter"+str(epoch)+",Testing Accuracy"+str(test_acc)


第四部分

4.1 使用 tensorboard

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Tue Apr 17 18:05:20 2018


@author: sduhao

"""


#使用tensorboard可视化网络结构和张量的计算流动过程以及监控各指标的变化情况

#使用手写数字识别v1程序进行演示

#再次运行时重启一下Kernel 清除缓存


import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data


mnist=input_data.read_data_sets("MNIST_data",one_hot=True)


batch_size=100

n_batch=mnist.train.num_examples//batch_size


#定义参数概要函数

def variable_summaries(var):

    with tf.name_scope('summaries'):

        mean=tf.reduce_mean(var)   #计算变量的均值

        tf.summary.scalar('mean',mean) #监控均值

        with tf.name_scope('stddev'):

            stddev=tf.sqrt(tf.reduce_mean(tf.square(var-mean))) #计算标准差

        tf.summary.scalar('stddev',stddev) #监控标准差

        tf.summary.scalar('max',tf.reduce_max(var)) #监控最大值

        tf.summary.scalar('min',tf.reduce_min(var)) #监控最小值

        tf.summary.histogram('histogram',var)       #直方图


#命名空间  输入层

with tf.name_scope('input'):

    x=tf.placeholder(tf.float32,[None,784],name='x-input')

    y=tf.placeholder(tf.float32,[None,10],name='y-input')

    

#输出层

with tf.name_scope('layer'):

    with tf.name_scope('weight'):

        W=tf.Variable(tf.zeros([784,10]),name='w')

        variable_summaries(W)  #监控权值参数各属性变化情况

    with tf.name_scope('biase'):

        b=tf.Variable(tf.zeros([10]),name='b')

        variable_summaries(b)

    with tf.name_scope('Wx_plus_b'):

        wx_plus_b=tf.matmul(x,W)+b

    with tf.name_scope('softmax'):

        prediction=tf.nn.softmax(wx_plus_b)

    

with tf.name_scope('loss'):

    loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))

    tf.summary.scalar('loss',loss)  #只需关注loss本身的变化情况即可  不需要关注上述属性


with tf.name_scope('train'):

    train=tf.train.GradientDescentOptimizer(0.2).minimize(loss)

    

init=tf.global_variables_initializer()


with tf.name_scope('accuracy'):

    with tf.name_scope('correct_prediction'):

        correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))

    with tf.name_scope('accuracy'):

        accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

        tf.summary.scalar('accuracy',accuracy)


#合并所有的summary

merged=tf.summary.merge_all()


with tf.Session() as sess:

    sess.run(init)

    writer=tf.summary.FileWriter('logs/',sess.graph)  #在当前目录下新建logs目录,在其下写入图文件

    for epoch in range(21):

        for batch in range(n_batch):

            batch_xs,batch_ys=mnist.train.next_batch(batch_size)

            summary,_=sess.run([merged,train],feed_dict={x:batch_xs,y:batch_ys})

        #每过一个epoch统计一次

        writer.add_summary(summary,epoch)

        acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})

        print "Iter"+str(epoch)+",Testing Accuracy:"+str(acc)

'''

打开命令行执行生成图文件(再次运行时需把上一次生成的图文件删除)

tensorboard --logdir=图文件路径(绝对路径)

生成网址后在Chrome浏览器打开

在graph中可查看网络结构和张量的流动情况

在scalars,distribution,histograms查看上述指标的变化情况

'''


'''

上述程序每隔一个epoch统计一次,也可以更加细粒度

每隔一个batch_size统计一次,而不管经过了多少了epoch

for i in range(2001):  

    batch_xs,batch_ys=mnist.train.next_batch(batch_size)

    summary,_=sess.run([merged,train],feed_dict={x:batch_xs,y:batch_ys})

    writer.add_summary(summary,i)

    if i%500==0:

        print sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})

'''

第五部分

5.1 使用CNN实现手写数字 (准确率达99%以上)

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Tue Apr 17 19:01:44 2018


@author: sduhao

"""


#使用CNN实现手写数字识别

#再次运行时重启一下kernel

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data


mnist=input_data.read_data_sets("MNIST_data",one_hot=True)


batch_size=100

n_batch=mnist.train.num_examples//batch_size


#参数概要

def variable_summaries(var):

    with tf.name_scope('summaries'):

        mean=tf.reduce_mean(var)

        tf.summary.scalar('mean',mean)

        with tf.name_scope('stddev'):

            stddev=tf.sqrt(tf.reduce_mean(tf.square(var-mean)))

        tf.summary.scalar('stddev',stddev)

        tf.summary.scalar('max',tf.reduce_max(var))

        tf.summary.scalar('min',tf.reduce_min(var))

        tf.summary.histogram('histogram',var)


#权值初始化函数

def weight_variable(shape,name):

    initial=tf.truncated_normal(shape,stddev=0.1)

    return tf.Variable(initial,name=name)


#偏置值初始化函数

def bias_variable(shape,name):

    initial=tf.constant(0.1,shape=shape)

    return tf.Variable(initial,name=name)


#卷积层

def conv2d(x,w):

    '''

    x为四维张量[batch_size,height,width,channels]

    w为filter的参数 [fileter_height,filter_width,in_channels,out_channels]

    '''

    '''

    步长第0,3位默认为1 第1位:x方向上的步长 第2位:y方向上的步长 

    SAME在外围填充0

    VALID不填充0

    '''

    return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')


#池化层

def max_pool_2x2(x):

    '''

    ksize第0,3位默认为1,中间两位为窗口大小

    '''

    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')


#输入层

with tf.name_scope('input'):

    x=tf.placeholder(tf.float32,[None,784],name='x-input')

    y=tf.placeholder(tf.float32,[None,10],name='y-input')

    with tf.name_scope('x_image'): #把x转换为四维张量的形式 (列向量-》平面)

        x_image=tf.reshape(x,[-1,28,28,1],name='x_image')

        

#第一层卷积

with tf.name_scope('Conv1'):

    with tf.name_scope('W_conv1'):

        W_conv1=weight_variable([5,5,1,32],name='W_conv1')

    with tf.name_scope('b_conv1'):

        b_conv1=bias_variable([32],name='b_conv1')

    with tf.name_scope('conv2d_1'):  #  卷积提取特征

        conv2d_1=conv2d(x_image,W_conv1)+b_conv1

    with tf.name_scope('relu'):

        h_conv1=tf.nn.relu(conv2d_1)

    with tf.name_scope('h_pool1'):  #池化压缩特征

        h_pool1=max_pool_2x2(h_conv1)

'''

28*28*1-(conv1)->28*28*32-(maxpool)->14*14*32

'''

#第二层卷积

with tf.name_scope('Conv2'):

    with tf.name_scope('W_conv2'):

        W_conv2=weight_variable([5,5,32,64],name='W_conv2')

    with tf.name_scope('b_conv2'):

        b_conv2=bias_variable([64],name='b_conv2')

    with tf.name_scope('conv2d_2'):  #  卷积提取特征

        conv2d_2=conv2d(h_pool1,W_conv2)+b_conv2

    with tf.name_scope('relu'):

        h_conv2=tf.nn.relu(conv2d_2)

    with tf.name_scope('h_pool2'):  #池化压缩特征

        h_pool2=max_pool_2x2(h_conv2)

'''

14*14*32-(conv2)->14*14*64-(maxpool)->7*7*64

'''

#第一个全联接层

with tf.name_scope('fc1'):

    with tf.name_scope('W_fc1'):

       W_fc1=weight_variable([7*7*64,1024],name='W_fc1')

    with tf.name_scope('b_fc1'):

        b_fc1=bias_variable([1024],name='b_fc1')

    #把第二层池化后的结果扁平化(平面-》列向量

    with tf.name_scope('h_pool2_flat'):

        h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64],name='h_pool2_flat')

    with tf.name_scope('wx_plus_b1'):

        wx_plus_b1=tf.matmul(h_pool2_flat,W_fc1)+b_fc1

    with tf.name_scope('relu'):

        h_fc1=tf.nn.relu(wx_plus_b1)

    with tf.name_scope('keep_prob'):

        keep_prob=tf.placeholder(tf.float32,name='keep_prob')

    with tf.name_scope('h_fc1_dropout'):

        h_fc1_dropout=tf.nn.dropout(h_fc1,keep_prob,name='h_fc1_dropout')

    

#第二个全联接层

with tf.name_scope('fc2'):

    with tf.name_scope('W_fc2'):

       W_fc2=weight_variable([1024,10],name='W_fc2')

    with tf.name_scope('b_fc2'):

        b_fc2=bias_variable([10],name='b_fc2')

    with tf.name_scope('wx_plus_b2'):

        wx_plus_b2=tf.matmul(h_fc1_dropout,W_fc2)+b_fc2

    with tf.name_scope('softmax'):

        prediction=tf.nn.softmax(wx_plus_b2)

        

#交叉熵代价函数

with tf.name_scope('cross_entrogy'):

    cross_entrogy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))

    tf.summary.scalar('cross_entrogy',cross_entrogy)



#训练

with tf.name_scope('train'):

    train=tf.train.AdamOptimizer(1e-4).minimize(cross_entrogy)


#求准确率

with tf.name_scope('accuracy'):

    with tf.name_scope('correct_prediction'):

        correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))

    with tf.name_scope('accuracy'):

        accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

        tf.summary.scalar('accuracy',accuracy)


merged=tf.summary.merge_all()


with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    train_writer=tf.summary.FileWriter('logs/train',sess.graph)

    test_writer=tf.summary.FileWriter('logs/test',sess.graph)

    

    for i in range(12001): 

        batch_xs,batch_ys=mnist.train.next_batch(batch_size)

        sess.run(train,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.5})

        summary=sess.run(merged,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})

        train_writer.add_summary(summary,i)

        

        batch_xs,batch_ys=mnist.test.next_batch(batch_size)

        summary=sess.run(merged,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.0})

        test_writer.add_summary(summary,i)

        if i%100==0:

            test_acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels,keep_prob:1.0})

            train_acc=sess.run(accuracy,feed_dict={x:mnist.train.images[:10000],y:mnist.train.labels[:10000],keep_prob:1.0})

            print "Iter"+str(i)+",Testing Accuracy:"+str(test_acc)+",Training Accuracy"+str(train_acc)

        

    

            


    

第六部分

6.1 使用LSTM实现手写数字识别

#!/usr/bin/env python2

# -*- coding: utf-8 -*-

"""

Created on Tue Apr 17 20:21:10 2018


@author: sduhao

"""


#使用LSTM实现手写数字识别

#RNN/LSTM适合处理文本、声音等序列化信息,也可用做图片的分类

#再次运行时 重启kernel


import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data


mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)


#输入图片是28*28

n_inputs=28  #每次输入一张图片的一行 输入层28个神经元(把一张图片序列化)

max_time=28 #一张图片有28次输入

lstm_size=100 #隐层单元

n_classes=10 #10分类

batch_size=50

n_batch=mnist.train.num_examples//batch_size


x=tf.placeholder(tf.float32,[None,784])

y=tf.placeholder(tf.float32,[None,10])


#初始化权值

weights=tf.Variable(tf.truncated_normal([lstm_size,n_classes],stddev=0.1))

#初始化偏置值

biases=tf.Variable(tf.constant(0.1,shape=[n_classes]))


#定义RNN网络

def RNN(X,weights,biases):

    #inputs=[batch_size,max_time,n_input]

    inputs=tf.reshape(X,[-1,max_time,n_inputs])

    #定义LSTM基本cell

    lstm_cell=tf.contrib.rnn.BasicLSTMCell(lstm_size)#隐藏单元个数

    '''

    final_state[0]:cell_state 一个隐藏单元的中间结果

    final_state[1]:hidden_state 一个隐藏单元的最终输出

    

    '''

    outputs,final_state=tf.nn.dynamic_rnn(lstm_cell,inputs,dtype=tf.float32)

    results=tf.nn.softmax(tf.matmul(final_state[1],weights)+biases)

    return results


#计算RNN的返回结果

prediction=RNN(x,weights,biases)


#损失函数

cross_entrogy=tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction)


train=tf.train.AdamOptimizer(1e-4).minimize(cross_entrogy)


correct_accuracy=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))

accuracy=tf.reduce_mean(tf.cast(correct_accuracy,tf.float32))


init=tf.global_variables_initializer()


with tf.Session() as sess:

    sess.run(init)

    for epoch in range (6):

        for batch in range(n_batch):

            batch_xs,batch_ys=mnist.train.next_batch(batch_size)

            sess.run(train,feed_dict={x:batch_xs,y:batch_ys})

        acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})

        print "Iter"+str(epoch)+",Testing Accuracy:"+str(acc)



第七部分

7.1 保存训练好的模型的参数和结构

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 20 18:01:22 2018


@author: sduhao
"""


#保存训练好的模型的结构和参数
#使用手写数字V1版本演示
#再次运行重启kernal
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


mnist=input_data.read_data_sets("MNIST_data",one_hot=True)


batch_size=100
n_batch=mnist.train.num_examples//batch_size


x=tf.placeholder(tf.float32,[None,784])
y=tf.placeholder(tf.float32,[None,10])


W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([10]))
prediction=tf.nn.softmax(tf.matmul(x,W)+b)


loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))


train=tf.train.GradientDescentOptimizer(0.2).minimize(loss)


init=tf.global_variables_initializer()


correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


saver=tf.train.Saver()
 
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(11):
        for batch in range(n_batch):
            batch_xs,batch_ys=mnist.train.next_batch(batch_size)
            sess.run(train,feed_dict={x:batch_xs,y:batch_ys})
        acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print "Iter"+str(epoch)+",Testing Accuracy"+str(acc)
    saver.save(sess,'net/my_net.ckpt') #把训练好的模型的结构和参数保存在net目录下     


        

7.2 测试时载入之前训练好的模型

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 20 18:22:20 2018


@author: sduhao
"""


#调用之前训练好的模型做测试
#使用手写数字V1版本演示
#再次运行重启kernal
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


mnist=input_data.read_data_sets("MNIST_data",one_hot=True)


batch_size=100
n_batch=mnist.train.num_examples//batch_size


x=tf.placeholder(tf.float32,[None,784])
y=tf.placeholder(tf.float32,[None,10])


W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([10]))
prediction=tf.nn.softmax(tf.matmul(x,W)+b)


loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))


train=tf.train.GradientDescentOptimizer(0.2).minimize(loss)


init=tf.global_variables_initializer()


correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))


saver=tf.train.Saver()


with tf.Session() as sess:
    sess.run(init)
    saver.restore(sess,'net/my_net.ckpt') #直接调用之前保存的训练好的模型
    print sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})  



7.3 下载GoolgleNet-V3并查看结构

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 20 18:30:15 2018


@author: sduhao
"""


import tensorflow as tf
import os
import tarfile
import requests


#下载google图像识别网络Inception V3(GoogleNet 的第三个版本),并用tensorboard查看网络结构


#inception模型下载地址
inception_pretrain_model_url='http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz'


#模型存放地址
inception_pretrain_model_dir="inception_model"
if not os.path.exists(inception_pretrain_model_dir): #没有该路径 则在当前路径下新建
    os.makedirs(inception_pretrain_model_dir)
    
#获取文件名,以及文件路径
filename=inception_pretrain_model_url.split('/')[-1]
filepath=os.path.join(inception_pretrain_model_dir,filename)


#下载模型
if not os.path.exists(filepath):
    print "download: ",filename
    r=requests.get(inception_pretrain_model_url,stream=True)
    with open(filepath,'wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)
print "finish: ",filename


#解压文件
tarfile.open(filepath,'r:gz').extractall(inception_pretrain_model_dir)


#模型结构存放文件
log_dir='inception_log'
if not os.path.exists(log_dir):
    os.makedirs(log_dir)


#classify_image_graph_def.pb为google训练好的模型
inception_graph_def_file=os.path.join(inception_pretrain_model_dir,'classify_image_graph_def.pb')


with tf.Session() as sess:
    #创建一个图来存放google训练好的模型
    with tf.gfile.FastGFile(inception_graph_def_file,'rb') as f:
        graph_def=tf.GraphDef()
        graph_def.ParseFromString(f.read())
        tf.import_graph_def(graph_def,name='')
    #保存图的结构
    writer=tf.summary.FileWriter(log_dir,sess.graph)
    writer.close()

    

7.4 使用google-v3实现各种图像识别

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 20 18:58:18 2018


@author: sduhao
"""


#使用inception-V3做各种图像识别


import tensorflow as tf
import os
import numpy as np
import re
from PIL import Image
import matplotlib.pyplot as plt


class NodeLookup(object):
    def __init__(self):
        #存放<类别编号,字符串编号>对  1000个类别
        label_lookup_path='inception_model/imagenet_2012_challenge_label_map_proto.pbtxt'
        #存放<字符串编号,类别描述>对
        uid_lookup_path='inception_model/imagenet_synset_to_human_label_map.txt'
        self.node_lookup=self.load(label_lookup_path,uid_lookup_path)
        
    def load(self,label_lookup_path,uid_lookup_path): #联立两个表 形成<类别编号,类别描述>对
        #加载字符串******分类描述文件
        proto_as_ascii_lines=tf.gfile.GFile(uid_lookup_path).readlines()
        uid_to_human={}
        
        #按行读取数据
        for line in proto_as_ascii_lines:
            #去掉换行符
            line=line.strip('\n')
            #按照\t分割
            parsed_items=line.split('\t')
            #获取分类字符串编号
            uid=parsed_items[0]
            #获取分类名称
            human_string=parsed_items[1]
            #保存字符串编号到分类描述的映射关系
            uid_to_human[uid]=human_string
            
        #加载分类字符串编号******分类编号(1-1000)文件
        proto_as_ascii=tf.gfile.GFile(label_lookup_path).readlines()
        node_id_to_uid={}
        for line in proto_as_ascii:
            if line.startswith('  target_class:'):
                #获取分类编号1-1000
                target_class=int(line.split(': ')[1])
            if line.startswith('  target_class_string:'):
                #获取编号字符串
                target_class_string=line.split(': ')[1]
                #保存分类编号和字符串编号的映射关系
                node_id_to_uid[target_class]=target_class_string[1:-2]
            
        #建立分类编号到分类名称的映射关系
        node_id_to_name={}
        for key,val in node_id_to_uid.items():
            #获取分类名称
            name=uid_to_human[val]
            #建立分类编号到分类名称的映射
            node_id_to_name[key]=name
        return node_id_to_name
    
    def id_to_string(self, node_id):
        if node_id not in self.node_lookup:
            return ''
        return self.node_lookup[node_id]
    
#创建一个图存放google训练好的模型
with tf.gfile.FastGFile('inception_model/classify_image_graph_def.pb','rb') as f:
    graph_def=tf.GraphDef()
    graph_def.ParseFromString(f.read())
    tf.import_graph_def(graph_def,name='')
    
with tf.Session() as sess:
    softmax_tensor=sess.graph.get_tensor_by_name('softmax:0')
    #遍历目录
    for root,dirs,files in os.walk('images/'):
        for f in files:
            #载入图片
            image_data=tf.gfile.FastGFile(os.path.join(root,f),'rb').read()
            predictions=sess.run(softmax_tensor,{'DecodeJpeg/contents:0':image_data})#.jpg格式
            
            #打印图片路径和名称
            image_path=os.path.join(root,f)
            print image_path
            
            #显示图片
            img=Image.open(image_path)
            plt.imshow(img)
            plt.axis('off')
            plt.show()
            
            #排序 取出概率最大的五个类别编号(从大到小)
            top_k=predictions.argsort()[-5:][::-1]
            node_lookup=NodeLookup()
            
            for node_id in top_k:
                #获取分类名称
                human_string=node_lookup.id_to_string(node_id)
                #获得该分类的置信度
                score=predictions[node_id]
                print '%s (score=%.5f)' % (human_string,score)
            print()
    




 

        





        

    




实习两星期工作总结

现在是早上十点半,从九点开始上班到现在也就一个半小时的时间,但是今天的感觉就是有点烦了,因为连续不断地看了好几天的书,我一直以来的看书习惯就是一本书能在多块解决就多快解决,就想当初《计算机网络》,就是...
  • u012247462
  • u012247462
  • 2014-12-11 15:48:15
  • 1131

记录实习第二周所学到的知识

这一周项目经理给我安排了修改BUG的任务,这是一个我没有动手参与过的项目,刚开始接到这个任务,我是懵的,这怎么改,我才刚来,这个也不是我参与的,看不懂啊。那又能怎么办呢,任务下来了就要完成嘛,之后就开...
  • wxp906257269
  • wxp906257269
  • 2018-03-30 09:12:56
  • 4

实习一周总结

第一天 早上来到公司,经手几个领导,带我来到研发部,然后询问我学习什么方向,当时给了java和C#方向,突然发现大学前两年做的acm和开发确实不搭边,但是acm确实锻炼人的思维。实话,大实话。建...
  • u013076044
  • u013076044
  • 2015-08-14 17:11:32
  • 749

JavaWeb实训项目

  • 2015年06月17日 15:42
  • 36.5MB
  • 下载

HTML5+CSS3项目总结

经过一个月的学习,我基本掌握了HTML5的一些标签的用法和特性,以及一些CSS3的属性的特点和用法。 在本周安排的为期四天的第一阶段的课程的项目实训中,我基本能够熟练运用学到的知识,完成页面的速度和...
  • zhaohuansir
  • zhaohuansir
  • 2016-07-10 17:40:57
  • 1356

Android - 实训项目总结

Android 1.简介 1.1项目简介 Coolweather是一款基于Android的天气查询软件,实现了省市县的遍历、县级地区天气的查询、手动更新天气、8小时的自动更新天气信息; 1.2...
  • CL18652469346
  • CL18652469346
  • 2016-12-21 17:07:01
  • 963

Java Web----实训项目第一阶段

开始做实训项目的第一阶段,主要是在学习java基础,整理了一些笔记
  • Func0ra
  • Func0ra
  • 2017-05-28 10:00:45
  • 660

项目实训总结报告

项目背景 随着大家生活质量的不断提高,人们也更加关注自己的身体健康状况,也想要保持一个健康的体质度过每天的生活。尤其对于工作繁忙的上班族来说,更有可能出现各种健康问题,但是他们由于工作原因,没有过多...
  • llyy0609
  • llyy0609
  • 2017-09-01 10:32:59
  • 318

javaweb项目实训

  • 2016年01月19日 11:23
  • 9.98MB
  • 下载

Java项目实训源代码

  • 2014年03月02日 04:15
  • 17.56MB
  • 下载
收藏助手
不良信息举报
您举报文章:项目实训第二周工作总结---tensorflow学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)