TensorFlow笔记


TensorFlow:2015年谷歌,支持python、C++,底层是C++,主要用python。支持CNN、RNN等算法,分CPU TensorFlow/GPU TensorFlow。
TensorBoard:训练中的可视化。
快捷键:shift+enter执行命令,Tab键进行补全,ctrl+b隐藏导航栏,shift+tab显示函数的详细描述

基础知识

创建图,启动图

#创建一个常量op
m1 = tf.constant([[3,3]]) #两行一列
m2 = tf.constant([[2],[3]]) #一行两列
# 创建一个矩阵乘法op
product = tf.matmul(m1,m2)
print(product) #结果返回一个tensor
# Tensor("MatMul:0", shape=(1, 1), dtype=int32)
#定义一个会话,启动默认的图
sess = tf.Session()
# run(product)触发了图中三个op
result = sess.run(product)
print(result)
sess.close()
# [[15]]
# 另外一种写法
with tf.Session() as sess:
    result = sess.run(product)
    print(result)
    # 不需要关闭操作

变量的使用

x = tf.Variable([1,2])
a = tf.constant([3,3])
# 增加一个减法op
sub = tf.subtract(x,a)
# 增加一个加法op
add= tf.add(x,sub)
init  = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(sub))
    print(sess.run(add))
    #Attempting to use uninitialized value Variable_1

for循环

# 变量和操作其实是可以起名字的
status = tf.Variable(0,name = 'counter')
new_value = tf.add(status,1)
# 赋值op new_value赋值给status
update = tf.assign(status,new_value)
init  = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(status))
    for _ in range(5):
        sess.run(update)
        print(sess.run(status))

fetch、feed的使用

# fetch 同时执行多个op
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)

add = tf.add(input2, input3)
mul = tf.multiply(input1,add)
with tf.Session() as sess:
    result = sess.run([mul,add])
    print(result)
# feed
input1 = tf.placeholder(tf.float32)#创建占位符
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)
with tf.Session() as sess:
    # feed的数据以字典的形式传入
    print(sess.run(output, feed_dict = {input1:[7.],input2:[2.0]}))

线性规划

# 线性规划
x_data = np.random.rand(100)
y_data = x_data*0.1 + 0.2

b = tf.Variable(0.)
k = tf.Variable(0.)
y = k*x_data + b

# 二次代价函数
loss = tf.reduce_mean(tf.square(y_data-y)) #误差平方均值
# 定义一个梯度下降法来进行训练的优化器
optimizer = tf.train.GradientDescentOptimizer(0.2) # 随机梯度下降法,学习率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]))
'''
0 [0.053777255, 0.10018825]
20 [0.10350733, 0.19811046]
40 [0.102103, 0.19886708]
60 [0.10126095, 0.1993207]
80 [0.10075606, 0.1995927]
100 [0.10045333, 0.19975579]
120 [0.10027182, 0.19985357]
140 [0.100162975, 0.1999122]
160 [0.10009772, 0.19994736]
180 [0.10005858, 0.19996844]
200 [0.10003512, 0.1999811]
'''

损失函数比较

二次代价函数
合理的是:在离目标远的地方更新的比较快,离目标近的地方更新的比较慢。之所以要慢,就是怕太快了,跳过最优解。
二次代价函数问题:w和b的梯度跟激活函数的梯度成正比。如果最终的结果由0更新到4,更新的速度由快到慢。如果最终的结果由4更新到-4,更新的速度由慢到快到慢,不合理。
在这里插入图片描述
在这里插入图片描述
交叉熵损失
w和b的梯度跟激活函数的梯度无关。梯度公式sigma-y表示预测值与实际值的误差,所以当误差较大时,梯度就越大,参数w和b调整的就快,训练的速度也会越来越快,符合预期。
在这里插入图片描述
二次代价函数与交叉熵代价函数的比较:如果输出神经元是线性的,那么二次代价函数就是一种合适的选择,如果输出神经元是S型函数,那就比较适合交叉熵代价函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验

minist数据库,二次代价函数,迭代7次就到达90%,14次91%。
在这里插入图片描述
minist数据库,交叉熵函数(softmax_cross_entropy_with_logits),迭代2次就到达90%,5次91%,收敛速度显比二次代价小很多明。
在这里插入图片描述
提高准确度:
1、每个批次的大小,50-300
2、更改初始化方法
3、尝试不同的激活函数
4、尝试dropout(参数)、不同正则
5、网络的深度、网络的宽度,五六万张,三层神经网络比较匹配。
6、尝试不同的损失函数
7、改变学习率
8、尝试不同的优化器
9、迭代次数epoch

过拟合

为什么正则能够防止过拟合?
L1正则,会使一些w等于0。
L2正则,也会使一些w变得非常小,接近0。
实验:增加层数,初始化方法
在这里插入图片描述
实验:增加层数,初始化方法,增加dropout 0.7 在这里插入图片描述
过拟合有所改正,但收敛速度会变慢。当网络非常复杂的时候,如imagenet比赛那种,dropout会更明显。

优化器

在这里插入图片描述
在这里插入图片描述
注:Adagrad适用于数据不平衡的数据集。优点:不需要人为的调解学习率。缺点:随着迭代的次数增加,学习率会越来越小,最终趋近于0。
针对Adagrad的缺点如何改进? RMSprop,学习率不会趋近于0。
有没有不需要学习率的优化器?Adadelta。
SGC缺点:收敛速度慢,无法解决“鞍点”的问题。
SGD这么多缺点是不是就被抛弃掉:SGD虽然速度慢,但在确准率上不一定。为了提高准确率,最好每种优化器都要试一下。
Momentum特点:模型收敛速度很快,经常会走一些无效的路径。
AdamOptimizer:学习率一般比10^-2还要小,一般设置的很小,0.001或者0.0001,一般比SGD要小。速度比SGD要快。
在这里插入图片描述

tensorboard

CNN

神经网络训练样本数经验:训练集数量是参数5-30倍。
卷积核就是滤波器
max-pooling
mean-poolong
随机pooling:随机找一个值
卷积:same padding 和 valid padding。
池化:same padding 和 valid padding。

tf.nn.embedding_lookup()

格式:
tf.nn.embedding_lookup(
params,
ids,
partition_strategy=‘mod’,
name=None,
validate_indices=True,
max_norm=None
)
参数
params: 表示完整的嵌入张量,或者除了第一维度之外具有相同形状的P个张量的列表,表示经分割的嵌入张量
ids: 一个类型为int32或int64的Tensor,包含要在params中查找的id
partition_strategy: 指定分区策略的字符串,如果len(params)> 1,则相关。当前支持“div”和“mod”, 默认为“mod”。
name: 操作名称(可选)
validate_indices: 是否验证收集索引
max_norm: 如果不是None,嵌入值将被l2归一化为max_norm的值
在Word2vec中会用到这个函数。
例子

#coding:utf-8
import tensorflow as tf
import numpy as np

c = np.random.random([5,1])  ##随机生成一个5*1的数组
b = tf.nn.embedding_lookup(c, [1, 3]) ##查找数组中的序号为1和3的

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    print(sess.run(b))
    print(c)
# 结果:
#b:[[0.27341454]
#    [0.96676304]]
#c:[[0.66141005]
#    [0.27341454]
#    [0.68577857]
#    [0.96676304]
#    [0.46089145]]

tf.nn.nce_loss()

格式:
def nce_loss(weights, biases, inputs, labels, num_sampled, num_classes,
num_true=1,
sampled_values=None,
remove_accidental_hits=False,
partition_strategy=“mod”,
name=“nce_loss”)
功能:计算并返回噪声对比估计(NCE, Noise Contrastive Estimation)训练损失。
参数
weights:一个Tensor,shape为[num_classes, dim],或者是Tensor对象列表,其沿着维度0的连接具有shape [num_classes,dim]。
biases:一个Tensor,shape为[num_classes],类偏差。
labels:一个Tensor,类型为int64和shape [batch_size, num_true],目标类。
inputs:一个Tensor,shape [batch_size, dim]。输入网络的正向激活。
num_sampled:int,每批随机抽样的类数。
num_classes:int,可能的类数。
num_true:int,每个训练示例的目标类数。

tf.train.GradientDescentOptimizer()

格式:tf.train.GradientDescentOptimizer(learning_rate, use_locking=False,name=’GradientDescent’)
功能:优化器。
参数
learning_rate: A Tensor or a floating point value,要使用的学习率。
use_locking: 要是True的话,就对于更新操作(update operations.)使用锁。
name: 名字,可选,默认是”GradientDescent”。
例子

import tensorflow as tf

x = tf.Variable(2, name='x', dtype=tf.float32)
log_x = tf.log(x)
log_x_squared = tf.square(log_x)

optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(log_x_squared)

init = tf.initialize_all_variables()

def optimize():
	with tf.Session() as session:
		session.run(init)
		print("starting at", "x:", session.run(x), "log(x)^2:", session.run(log_x_squared))
		for step in range(10):  
			session.run(train)
			print("step", step, "x:", session.run(x), "log(x)^2:", session.run(log_x_squared))

optimize()
#结果:
#starting at x: 2.0 log(x)^2: 0.480453
#step 0 x: 1.6534264 log(x)^2: 0.25285786
#step 1 x: 1.3493005 log(x)^2: 0.08975195
#step 2 x: 1.1272697 log(x)^2: 0.014351694
#step 3 x: 1.0209966 log(x)^2: 0.0004317743
#step 4 x: 1.0006447 log(x)^2: 4.1534943e-07
#step 5 x: 1.0000006 log(x)^2: 3.5527118e-13
#step 6 x: 1.0 log(x)^2: 0.0
#step 7 x: 1.0 log(x)^2: 0.0
#step 8 x: 1.0 log(x)^2: 0.0
#step 9 x: 1.0 log(x)^2: 0.0

minimize() :梯度计算和参数更新两个操作
compute_gradients() :函数用于获取梯度
apply_gradients(): 用于更新参数

tf.random_uniform()

格式
random_uniform(
shape,
minval=0,
maxval=None,
dtype=tf.float32,
seed=None,
name=None
)
功能:从均匀分布中输出随机值。生成的值在该 [minval, maxval) 范围内遵循均匀分布,下限 minval 包含在范围内,而上限 maxval 被排除在外。对于浮点数,默认范围是 [0, 1)。用来做初始化。
参数
shape:一维整数张量或 Python 数组,输出张量的形状。
minval:dtype 类型的 0-D 张量或 Python 值;生成的随机值范围的下限;默认为0.
maxval:dtype 类型的 0-D 张量或 Python 值.要生成的随机值范围的上限,如果 dtype 是浮点,则默认为1。
dtype:输出的类型:float16、float32、float64、int32、orint64。
seed:一个 Python 整数,用于为分布创建一个随机种子。查看 tf.set_random_seed 行为。
name:操作的名称(可选)。
例子

import tensorflow as tf
with tf.Session() as sess:
    print(sess.run(tf.random_uniform(
        (6,6), minval=-0.5,
        maxval=0.5, dtype=tf.float32)))
# 结果:
#[[ 0.22067761 -0.23697007 -0.27792156 -0.19219089 -0.04778063 -0.09754169]
# [ 0.3165928  -0.3930397  -0.411559   -0.47160363 -0.3989321   0.05053937]
# [-0.36394072 -0.3138739   0.16599143  0.48196137  0.47544062 -0.22295702]
# [ 0.49236917 -0.42440557 -0.29696238  0.03384793 -0.24676847  0.23208869]
# [ 0.1420126   0.2645086  -0.43570924  0.25621068  0.17929697  0.01833749]
# [-0.3911531  -0.41240644 -0.49978328 -0.30677032  0.04667234 -0.05241919]]

tf.truncated_normal()

格式
truncated_normal(
shape,
mean=0.0,
stddev=1.0,
dtype=tf.float32,
seed=None,
name=None
)
功能:产生截断正态分布随机数,取值范围为 [ mean - 2 * stddev, mean + 2 * stddev ]。
参数
shape:必选,1维整形张量或array,输出张量的维度。
mean:0维张量或数值,均值。
stddev:0维张量或数值,标准差。
dtype:输出类型。
seed:随机种子,若seed赋值,每次产生相同随机数。
name:运算名称。
例子

import tensorflow as tf
import matplotlib.pyplot as plt
 
tn = tf.truncated_normal([20],mean=5,stddev=1)
 
sess = tf.Session()
ov = sess.run(tn)
# 结果:
#[4.761795  4.879238  5.512024  4.0696497 3.7318196 4.775479  3.6837173
# 6.296341  3.9887147 5.108976  4.6989813 4.742924  4.693607  5.911699
# 3.5907323 4.1943345 6.249139  3.7722433 4.8389206 5.9726944]

tf.multiply()

格式: tf.multiply(x, y, name=None)
功能:两个矩阵中对应元素各自相乘
参数:
x: 一个类型为:half, float32, float64, uint8, int8, uint16, int16, int32, int64, complex64, complex128的张量。
y: 一个类型跟张量x相同的张量。
返回值: x * y element-wise.
注意
(1)multiply这个函数实现的是元素级别的相乘,也就是两个相乘的数元素各自相乘,而不是矩阵乘法,注意和tf.matmul区别。
(2)两个相乘的数必须有相同的数据类型,不然就会报错。
例子

import tensorflow as tf
 
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2]) 
c = tf.matmul(a, b)
d = tf.multiply(a, a)
with tf.Session() as sess:
    print(sess.run([a]))
    print(sess.run([b]))
    print(sess.run([c]))
    print(sess.run([d]))
 #a:[array([[1, 2, 3],
#           [4, 5, 6]], dtype=int32)]
#b:[array([[ 7,  8],
#          [ 9, 10],
#          [11, 12]], dtype=int32)]
#c:[array([[ 58,  64],
#          [139, 154]], dtype=int32)]
#d:[array([[ 1,  4,  9],
#          [16, 25, 36]], dtype=int32)]

tf.matmul()

格式: tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b=False, a_is_sparse=False, b_is_sparse=False, name=None)
功能:矩阵相乘。
参数:
a: 一个类型为 float16, float32, float64, int32, complex64, complex128 且张量秩 > 1 的张量。
b: 一个类型跟张量a相同的张量。
transpose_a: 如果为真, a则在进行乘法计算前进行转置。
transpose_b: 如果为真, b则在进行乘法计算前进行转置。
adjoint_a: 如果为真, a则在进行乘法计算前进行共轭和转置。
adjoint_b: 如果为真, b则在进行乘法计算前进行共轭和转置。
a_is_sparse: 如果为真, a会被处理为稀疏矩阵。
b_is_sparse: 如果为真, b会被处理为稀疏矩阵。
name: 操作的名字(可选参数)
返回值: 一个跟张量a和张量b类型一样的张量且最内部矩阵是a和b中的相应矩阵的乘积。
注意
(1)输入必须是矩阵(或者是张量秩 >2的张量,表示成批的矩阵),并且其在转置之后有相匹配的矩阵尺寸。
(2)两个矩阵必须都是同样的类型,支持的类型如下:float16, float32, float64, int32, complex64, complex128。

tf.reduce_sum()

格式:tf.reduce_sum(input_tensor,axis=None,keep_dims=False,name=None)
功能:对tensor x求和。
参数
input_tensor :是要求和的 tensor
axis:是要求和的列或行,axis=0表示列,1表示行,默认所有维度都要求和。
keep_dims:求和后是否保持维度,否则就降维。
例子

x = tf.constant([[1, 1, 1], [1, 1, 1]])

a=  tf.reduce_sum(x)
b = tf.reduce_sum(x, 0)
c = tf.reduce_sum(x, axis=0) 
d = tf.reduce_sum(x, 1)
e = tf.reduce_sum(x, 1, keep_dims=True)
f = tf.reduce_sum(x, [0, 1])

with tf.Session() as sess:
    print(sess.run([a]))
    print(sess.run([b]))
    print(sess.run([c]))
    print(sess.run([d]))
    print(sess.run([e]))
    print(sess.run([f]))
# 结果:
#a:[6]
#b:[array([2, 2, 2], dtype=int32)]
#c:[array([2, 2, 2], dtype=int32)]
#d:[array([3, 3], dtype=int32)]
#[e:array([[3],
#           [3]], dtype=int32)]
#f:[6]

tf.reduce_mean()

tf.reduce_mean(
input_tensor,
axis=None,
keep_dims=False,
name=None,
reduction_indices=None
)
功能:计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值。,主要用作降维或者计算tensor的平均值。
参数
input_tensor: 输入的待降维的tensor
axis: 指定的轴,如果不指定,则计算所有元素的均值
keep_dims:是否降维度,默认False。设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度
name: 操作的名称
reduction_indices:在以前版本中用来指定轴,已弃用
例子

import tensorflow as tf

x = [[1,2,3],
     [4,5,6]]
y = tf.cast(x, tf.float32) # tensor

mean_all = tf.reduce_mean(y)
mean_0 = tf.reduce_mean(y, axis=0)
mean_1 = tf.reduce_mean(y, axis=1)

with tf.Session() as sess:
    m_all,m_0,m_1 = sess.run([mean_all, mean_0, mean_1])
    
print(m_all)
print(m_0)
print(m_1)
# 结果:3.5
#      [2.5 3.5 4.5]
#      [2. 5.]

tf.square()

tf.square(x, name=None)
功能:对x内的所有元素进行平方操作。

import tensorflow as tf
x = [3,5,1]
with tf.Session() as sess:
    print(sess.run(tf.square(x))) 
# 结果:[ 9 25  1]
# tf.sqrt()

tf.cast()

格式
cast(
x,
dtype,
name=None
)
功能:将x的数据格式转化成dtype数据类型
例子

import sys
import tensorflow as tf

a = tf.Variable([1.0,1.3,2.1,3.41,4.51])
b = tf.cast(a>3,dtype=tf.bool)
c = tf.cast(a>3,dtype=tf.int8)
e = tf.cast(a<2,dtype=tf.float32)
d = tf.cast(a,dtype=tf.int8)

sess = tf.Session()
sess.run(tf.initialize_all_variables())
print(sess.run(a))
print(sess.run(b))
print(sess.run(c))
print(sess.run(e))
print(sess.run(d))
# 结果:[1.   1.3  2.1  3.41 4.51]
#      [False False False  True  True]
#      [0 0 0 1 1]
#      [1. 1. 0. 0. 0.]
#      [1 1 2 3 4]

参考:
https://www.cnblogs.com/harvey888/p/6930726.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值