【TensorFlow快速入门系列01】基础操作

1 简介

TF 是 Google 开发的 DL 开源框架,对于深度神经网络的训练助力极大。TF 使用图 graphs 表示计算任务,在会话 session 中执行图,图中的节点是 op,一个 op 获得 0个或多个张量 tensor,计算产生0个或多个张量 tensor;通过变量 variable 维护状态,使用 feed 和 fetch 赋值和取值,如下图所示。
在这里插入图片描述

2 会话

import tensorflow as tf

# 创建一个常量1x2
m1 = tf.constant([[3,3]])
# 创建一个常量2x1
m2 = tf.constant([[2],[3]])
# 矩阵乘法op
product = tf.matmul(m1, m2)

# 定义会话方式1
sess = tf.Session()
# 调用sess中的run方法来执行矩阵乘法op
result = sess.run(product)
print(result)
sess.close()

[[15]]

#定义会话方式2
with tf.Session() as sess:
    # 调用sess中的run方法来执行矩阵乘法op
    result = sess.run(product)
    print(result)

[[15]]

3 变量

import tensorflow as tf

# 定义一个变量
x = tf.Variable([1,2])
# 定义一个常量
a = tf.constant([3,3])
# 减法op
sub = tf.subtract(x, a)

# 所有变量初始化
init = tf.global_variables_initializer()

with tf.Session() as sess:
    # 执行变量初始化
    sess.run(init)
    print(sess.run(sub))

[-2 -1]

4 Feed 与 Fetch

import tensorflow as tf

# Fetch:可以在session中同时计算多个tensor或执行多个操作
# 定义三个常量
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
# 加法op
add = tf.add(input2,input3)
# 乘法op
mul = tf.multiply(input1, add)

with tf.Session() as sess:
	# 多个操作并行
    res1,res2 = sess.run([mul, add])
    print(res1,res2)

21.0 7.0

# Feed:先定义占位符,等需要的时候再传入数据
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
# 乘法op
output = tf.multiply(input1, input2)

with tf.Session() as sess:
    print(sess.run(output, feed_dict={input1:8.0,input2:2.0})) # 字典形式

16.0

5 案例

使用 TF 实现 MNIST 手写数字识别,注意激活函数,损失函数,优化器的使用。

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 = 64
# 计算一个周期一共有多少个批次
n_batch = mnist.train.num_examples // batch_size
​
# 定义两个占位符
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])# 创建一个简单的神经网络:784-10
W = tf.Variable(tf.truncated_normal([784,10], stddev=0.1)) # 权重
b = tf.Variable(tf.zeros([10]) + 0.1) # 偏置项
prediction = tf.nn.softmax(tf.matmul(x,W)+b) # softmax激活函数# MSE损失
loss = tf.losses.mean_squared_error(y, prediction)
# # 交叉熵损失
# loss = tf.losses.softmax_cross_entropy(y, prediction)
# GD优化器
train = tf.train.GradientDescentOptimizer(0.3).minimize(loss)
# # Adam优化器
# train_step = tf.train.AdamOptimizer(0.001).minimize(loss)# 结果存放在一个布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1)) # 查找one-hot最大值所在位置,即把10个值变为1个值
# 求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))with tf.Session() as sess:
    # 变量初始化
    sess.run(tf.global_variables_initializer())
    # 周期epoch:所有数据训练一次,就是一个周期
    for epoch in range(21):
        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))

Iter 0,Testing Accuracy 0.8513
Iter 1,Testing Accuracy 0.8849
Iter 2,Testing Accuracy 0.8954
Iter 3,Testing Accuracy 0.9016
Iter 4,Testing Accuracy 0.9051
Iter 5,Testing Accuracy 0.9088
Iter 6,Testing Accuracy 0.9112
Iter 7,Testing Accuracy 0.9128
Iter 8,Testing Accuracy 0.9145
Iter 9,Testing Accuracy 0.9153
Iter 10,Testing Accuracy 0.9164
Iter 11,Testing Accuracy 0.9163
Iter 12,Testing Accuracy 0.9172
Iter 13,Testing Accuracy 0.9183
Iter 14,Testing Accuracy 0.9187
Iter 15,Testing Accuracy 0.9192
Iter 16,Testing Accuracy 0.9186
Iter 17,Testing Accuracy 0.9196
Iter 18,Testing Accuracy 0.9209
Iter 19,Testing Accuracy 0.9203
Iter 20,Testing Accuracy 0.9205

6 防止过拟合

6.1 Dropout
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 = 64
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

# 定义三个占位符
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
keep_prob=tf.placeholder(tf.float32)

# NN:784-1000-500-10
W1 = tf.Variable(tf.truncated_normal([784,1000],stddev=0.1))
b1 = tf.Variable(tf.zeros([1000])+0.1)
L1 = tf.nn.tanh(tf.matmul(x,W1)+b1) # tanh激活函数
L1_drop = tf.nn.dropout(L1,keep_prob) # dropout

W2 = tf.Variable(tf.truncated_normal([1000,500],stddev=0.1))
b2 = tf.Variable(tf.zeros([500])+0.1)
L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2) # tanh激活函数
L2_drop = tf.nn.dropout(L2,keep_prob)  # dropout

W3 = tf.Variable(tf.truncated_normal([500,10],stddev=0.1))
b3 = tf.Variable(tf.zeros([10])+0.1)
prediction = tf.nn.softmax(tf.matmul(L2_drop,W3)+b3) # softmax激活函数

# 交叉熵损失
loss = tf.losses.softmax_cross_entropy(y,prediction)
# GD优化器
train_step = tf.train.GradientDescentOptimizer(0.5).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))

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(31):
        for batch in range(n_batch):
            batch_xs,batch_ys =  mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:0.5})
        
        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,y:mnist.train.labels,keep_prob:1.0})
        print("Iter " + str(epoch) + ",Testing Accuracy " + str(test_acc) +",Training Accuracy " + str(train_acc))

Iter 0,Testing Accuracy 0.9477,Training Accuracy 0.9524364
Iter 1,Testing Accuracy 0.9621,Training Accuracy 0.96927273
Iter 2,Testing Accuracy 0.9663,Training Accuracy 0.97612727
Iter 3,Testing Accuracy 0.968,Training Accuracy 0.97958183
Iter 4,Testing Accuracy 0.9696,Training Accuracy 0.9835455
Iter 5,Testing Accuracy 0.9737,Training Accuracy 0.98785454
Iter 6,Testing Accuracy 0.976,Training Accuracy 0.9895273
Iter 7,Testing Accuracy 0.9773,Training Accuracy 0.99045455
Iter 8,Testing Accuracy 0.9765,Training Accuracy 0.9915636
Iter 9,Testing Accuracy 0.9783,Training Accuracy 0.99236363
Iter 10,Testing Accuracy 0.9788,Training Accuracy 0.99274546
Iter 11,Testing Accuracy 0.9789,Training Accuracy 0.99316365
Iter 12,Testing Accuracy 0.9806,Training Accuracy 0.9935091
Iter 13,Testing Accuracy 0.9792,Training Accuracy 0.9938545
Iter 14,Testing Accuracy 0.98,Training Accuracy 0.9941818
Iter 15,Testing Accuracy 0.9809,Training Accuracy 0.99447274
Iter 16,Testing Accuracy 0.9801,Training Accuracy 0.9946727
Iter 17,Testing Accuracy 0.9797,Training Accuracy 0.9948909
Iter 18,Testing Accuracy 0.98,Training Accuracy 0.9950909
Iter 19,Testing Accuracy 0.9803,Training Accuracy 0.9952545
Iter 20,Testing Accuracy 0.9806,Training Accuracy 0.9953091
Iter 21,Testing Accuracy 0.9807,Training Accuracy 0.9954727
Iter 22,Testing Accuracy 0.9814,Training Accuracy 0.9956
Iter 23,Testing Accuracy 0.9812,Training Accuracy 0.9956545
Iter 24,Testing Accuracy 0.9808,Training Accuracy 0.99570906
Iter 25,Testing Accuracy 0.981,Training Accuracy 0.9958
Iter 26,Testing Accuracy 0.9811,Training Accuracy 0.9958364
Iter 27,Testing Accuracy 0.9809,Training Accuracy 0.99594545
Iter 28,Testing Accuracy 0.9812,Training Accuracy 0.99603635
Iter 29,Testing Accuracy 0.9812,Training Accuracy 0.9960909
Iter 30,Testing Accuracy 0.9815,Training Accuracy 0.9962

6.2 正则化
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 = 64
# 计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

# 定义三个占位符
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
keep_prob=tf.placeholder(tf.float32)

# NN:784-1000-500-10
W1 = tf.Variable(tf.truncated_normal([784,1000],stddev=0.1))
b1 = tf.Variable(tf.zeros([1000])+0.1)
L1 = tf.nn.tanh(tf.matmul(x,W1)+b1) # tanh激活函数
L1_drop = tf.nn.dropout(L1,keep_prob) # dropout

W2 = tf.Variable(tf.truncated_normal([1000,500],stddev=0.1))
b2 = tf.Variable(tf.zeros([500])+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([500,10],stddev=0.1))
b3 = tf.Variable(tf.zeros([10])+0.1)
prediction = tf.nn.softmax(tf.matmul(L2_drop,W3)+b3) # softmax激活函数

# 正则项
l2_loss = tf.nn.l2_loss(W1) + tf.nn.l2_loss(b1) + tf.nn.l2_loss(W2) + tf.nn.l2_loss(b2) + tf.nn.l2_loss(W3) + tf.nn.l2_loss(b3)

# 交叉熵损失
loss = tf.losses.softmax_cross_entropy(y,prediction) + 0.0005*l2_loss
# GD优化器
train_step = tf.train.GradientDescentOptimizer(0.5).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))

with tf.Session() as sess:
    sess.run(init)
    for epoch in range(31):
        for batch in range(n_batch):
            batch_xs,batch_ys =  mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.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,y:mnist.train.labels,keep_prob:1.0})
        print("Iter " + str(epoch) + ",Testing Accuracy " + str(test_acc) +",Training Accuracy " + str(train_acc))

Iter 0,Testing Accuracy 0.9451,Training Accuracy 0.94643635
Iter 1,Testing Accuracy 0.9529,Training Accuracy 0.9566909
Iter 2,Testing Accuracy 0.96,Training Accuracy 0.96574545
Iter 3,Testing Accuracy 0.9608,Training Accuracy 0.9655455
Iter 4,Testing Accuracy 0.9644,Training Accuracy 0.96776366
Iter 5,Testing Accuracy 0.9644,Training Accuracy 0.96772724
Iter 6,Testing Accuracy 0.9612,Training Accuracy 0.9637455
Iter 7,Testing Accuracy 0.9647,Training Accuracy 0.96952724
Iter 8,Testing Accuracy 0.9635,Training Accuracy 0.9685091
Iter 9,Testing Accuracy 0.9655,Training Accuracy 0.97016364
Iter 10,Testing Accuracy 0.9631,Training Accuracy 0.96703637
Iter 11,Testing Accuracy 0.9649,Training Accuracy 0.96965456
Iter 12,Testing Accuracy 0.9673,Training Accuracy 0.9712909
Iter 13,Testing Accuracy 0.9669,Training Accuracy 0.97174543
Iter 14,Testing Accuracy 0.9644,Training Accuracy 0.9681818
Iter 15,Testing Accuracy 0.9657,Training Accuracy 0.9709273
Iter 16,Testing Accuracy 0.9655,Training Accuracy 0.97154546
Iter 17,Testing Accuracy 0.966,Training Accuracy 0.9701818
Iter 18,Testing Accuracy 0.9635,Training Accuracy 0.96852726
Iter 19,Testing Accuracy 0.9665,Training Accuracy 0.9719818
Iter 20,Testing Accuracy 0.9679,Training Accuracy 0.9732909
Iter 21,Testing Accuracy 0.9683,Training Accuracy 0.9747273
Iter 22,Testing Accuracy 0.9664,Training Accuracy 0.9724
Iter 23,Testing Accuracy 0.9684,Training Accuracy 0.97367275
Iter 24,Testing Accuracy 0.9666,Training Accuracy 0.9719091
Iter 25,Testing Accuracy 0.9655,Training Accuracy 0.97212726
Iter 26,Testing Accuracy 0.9682,Training Accuracy 0.9728
Iter 27,Testing Accuracy 0.9676,Training Accuracy 0.97221816
Iter 28,Testing Accuracy 0.9669,Training Accuracy 0.97238183
Iter 29,Testing Accuracy 0.9675,Training Accuracy 0.97327274
Iter 30,Testing Accuracy 0.9665,Training Accuracy 0.9725091

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值