Tensorflow常用API

tf.layers.dense()

全连接层。tf.layers.dense( input, units=k )会在内部自动生成一个权矩阵kernel和偏移项bias,各变量具体尺寸如下:对于尺寸为[m, n]的二维张量input, tf.layers.dense()会生成:尺寸为[n, k]的权矩阵kernel,和尺寸为[m, k]的偏移项bias。内部的计算过程为y = input * kernel + bias,输出值y的维度为[m, k]。

tf.layers.dense(
    inputs,   # 该层的输入数据
    units,   # 输出的大小(维数),整数或long
    activation=None,   # 选用的激活函数(神经网络的非线性层),默认None,不用激活函数
    use_bias=True,   # 使用bias为True(默认使用)
    kernel_initializer=None,   # 权重矩阵的初始化函数。如果为None(默认值),则使用tf.get_variable的默认初始化程序初始化权重
    bias_initializer=tf.zeros_initializer(),   # bias的初始化函数
    kernel_regularizer=None,   # 权重矩阵的正则函数
    bias_regularizer=None,   # bias的的正则函数
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    trainable=True,
    name=None,
    reuse=None
)
import tensorflow as tf

# 1. 调用tf.layers.dense计算
input = tf.reshape(tf.constant([[1., 2.], [2., 3.]]), shape=[4, 1])    
b1 = tf.layers.dense(input,
                     units=2,
                     kernel_initializer=tf.constant_initializer([2,2]),   # 初始化shape为1*2,值为2的权值矩阵
                     bias_initializer=tf.constant_initializer(value=1))     # 初始化shape为4*1,值为1的偏置向量


# 2. 采用矩阵相乘的方式计算
kernel = tf.reshape(tf.constant([2., 2.]), shape=[1, 2])
bias = tf.reshape(tf.constant([1., 1., 1., 1., 1., 1., 1., 1.]), shape=[4, 2])
b2 = tf.add(tf.matmul(input, kernel), bias)


with tf.Session()as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(b1))
    print(sess.run(b2)) 

# [[3. 3.]
#  [5. 5.]
#  [5. 5.]
#  [7. 7.]]
# [[3. 3.]
#  [5. 5.]
#  [5. 5.]
#  [7. 7.]]

tf.nn.dropout()

该函数机制是为了防止或减轻过拟合,一般用在全连接层。在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。

tf.nn.dropout(
	x,   # 输入数据
	keep_prob,   # 决定每个元素被保留的几率
	noise_shape=None,
	seed=None,
	name=None
)

# 该函数使x的一部分(概率大约为keep_prob)变为0,其余变为x/keep_prob,
# noise_shape可以使得矩阵x一部分行全为0或者部分列全为0
with tf.Session() as sess:
    d = tf.to_float(tf.reshape(tf.range(1,17),[4,4]))
    sess.run(tf.global_variables_initializer())
    print(d.get_shape(), sess.run(tf.shape(d)))
    print(sess.run(d))
    
    # 矩阵有一半左右的元素变为element/0.5,其余为0
    dropout_a44 = tf.nn.dropout(d, 0.5, seed = 2020, noise_shape = None)
    result_dropout_a44 = sess.run(dropout_a44)
    print(result_dropout_a44)

# (4, 4) [4 4]
# [[ 1.  2.  3.  4.]
#  [ 5.  6.  7.  8.]
#  [ 9. 10. 11. 12.]
#  [13. 14. 15. 16.]]
# [[ 0.  4.  6.  0.]
#  [ 0. 12.  0.  0.]
#  [18.  0. 22. 24.]
#  [26.  0.  0.  0.]]

tf.nn.embedding_lookup()

选取一个张量里面索引对应的元素。

tf.nn.embedding_lookup(
     params,   # 完整的嵌入张量
     ids,   # 要在params中查找的id
     partition_strategy='mod',
     name=None,
     validate_indices=True,
     max_norm=None
)
p = tf.Variable(tf.random_normal([5,1]))
b = tf.nn.embedding_lookup(p, [1, 3])   # 查找张量中的序号为1和3的

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(p))
    print(sess.run(b))

# [[ 1.7974318 ]
#  [-1.5761899 ]
#  [ 0.2596668 ]
#  [ 0.21228862]
#  [ 1.9865903 ]]
# [[-1.5761899 ]
#  [ 0.21228862]]
import numpy as np
a = np.array([[0.1, 0.2, 0.3], [1.1, 1.2, 1.3], [2.1, 2.2, 2.3]])
idx1 = tf.Variable([0, 2], tf.int32)
out1 = tf.nn.embedding_lookup(a, idx1)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(a)
    print(sess.run(out1))

# [[0.1 0.2 0.3]
#  [1.1 1.2 1.3]
#  [2.1 2.2 2.3]]
# [[0.1 0.2 0.3]
#  [2.1 2.2 2.3]]

tf.one_hot()

one_hot(
    indices,   # 指示on_value的位置,就是onehot给值1的位置
    depth,   # onehot编码矩阵维度
    on_value=None,   # 输出矩阵 起作用位置的值 默认1
    off_value=None,   # 输出矩阵 不起作用位置的值 默认0
    axis=None,
    dtype=None,
    name=None
)
indices = [0,2,3,5]
depth1 = 6   # indices没有元素超过(depth-1)
depth2 = 4   # indices有元素超过(depth-1)
a = tf.one_hot(indices,depth1)
b = tf.one_hot(indices,depth2)

with tf.Session() as sess:
    print('a = \n',sess.run(a))
    print('b = \n',sess.run(b))

# a = 
#  [[1. 0. 0. 0. 0. 0.]
#  [0. 0. 1. 0. 0. 0.]
#  [0. 0. 0. 1. 0. 0.]
#  [0. 0. 0. 0. 0. 1.]]
# b = 
#  [[1. 0. 0. 0.]
#  [0. 0. 1. 0.]
#  [0. 0. 0. 1.]
#  [0. 0. 0. 0.]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值