Tensorflow--全连接神经网络

Tensorflow–全连接神经网络

一.全连接神经网络

全连接神经网络就是一种变换的规则,只是这种规则比较复杂,单纯利用数学公式表示这种复杂的变换不够形象也不容易理解,一般用图的形式表示该变换,可以概括为如下两点

二.计算步骤

假设输入层神经元的值为[3 5],首先计算隐含层(第1层)的第1个神经元的值,步骤如下:

  1. 第0层的所有神经元与该神经元进行连接,且已知它们之间的权重及其偏置,根据这些值计算线性组合
  2. 将第1步得到的线性组合的值作为一个一元函数的输入,假设该函数为f(x)=2x

三.神经网络的矩阵表达

未命名文件.png

import tensorflow as tf
import numpy as np

# 输入层
x=tf.placeholder(tf.float32,[2,None])

# 第1层的权重矩阵
w1=tf.constant(
    [
        [1,4,7],
        [2,6,8]
    ]
    ,tf.float32
)

# 第1层偏置
b1=tf.constant(
    [
        [-4],
        [2],
        [1]
    ]
    ,tf.float32
)

# 计算第1层的线性组合
l1=tf.matmul(w1,x,True)+b1

# 激活2*x
sigma1=2*l1

# 第2层的权重矩阵
w2=tf.constant(
    [
        [2,3],
        [1,-2],
        [-1,1]
    ]
    ,tf.float32
)

# 第2层的偏置
b2=tf.constant(
    [
        [5],
        [-3]
    ]
    ,tf.float32
)

# 计算第2层的线性组合
l2=tf.matmul(w2,sigma1,True)+b2

# 激活2*x
sigma12=2*l2

# 创建会话
session=tf.Session()

# 令x=[[3],[5]]
print(session.run(sigma12,{x:np.array([[3],[5]],np.float32)}))

利用矩阵相乘的函数matmul时,需要对权重矩阵转置,偏置需要存储在一个二维张量中。如果将神经网络的输入按行存储,则会更方便。以下计算多个输入分别经过该神经网络时对应的输出,用矩阵管理多个输入,其中每一个输入按行存储,假设有4个输入,如:

import tensorflow as tf
import numpy as np

# 输入层:每一个输入按行存储
x=tf.placeholder(tf.float32,(None,2))

# 第1层的权重矩阵
w1=tf.constant(
    [
        [1,4,7],
        [2,6,8]
    ]
    ,tf.float32
)

# 第1层的偏置
b1=tf.constant(
    [1,4,7],tf.float32
)
# b1=tf.constant([[1,4,7]],tf.float32) 也可以这样写
# 计算第1层的线性组合
l1=tf.matmul(x,w1)+b1


# 激活2*x
sigma1=2*l1

# 第2层的权重矩阵
w2=tf.constant(
    [
        [2,3],
        [1,-2],
        [-1,1]
    ]
    ,tf.float32
)

# 第2层偏置
b2=tf.constant(
    [5,-3],tf.float32
)

# 计算第2层的线性组合
l2=tf.matmul(sigma1,w2)+b2

sigma2=2*l2

session=tf.Session()

print(session.run(sigma2,{x:np.array([
    [10,11],
    [20,21],
    [30,31],
    [40,41]
],np.float32)}))

四.激活函数

激活函数是神经网络的重要组成部分,为了保证神经网络的灵活性及其计算的复杂度,激活函数一般不会太复杂

1.sigmoid激活函数

Tensorflow通过函数tf.nn.sigmoid(x,name=None)实现sigmoid激活函数,使用示例如下:

import tensorflow as tf

# 二维张量
t=tf.constant([[1,3],[2,0]],tf.float32)

# 激活sigmod激活
result=tf.nn.sigmoid(t)

session=tf.Session()

print(session.run(result))
[[ 0.7310586   0.95257413]
 [ 0.88079703  0.5       ]]
import tensorflow as tf

# 二维张量
t=tf.constant([[1,3],[2,0]],tf.float32)

# 激活sigmod激活
result=tf.nn.tanh(t)

session=tf.Session()

print(session.run(result))
[[ 0.76159418  0.99505472]
 [ 0.96402758  0.        ]]
3.ReLU激活函数
import tensorflow as tf

# 变量
x=tf.Variable(tf.constant([[2,1,3]],tf.float32))

w=tf.constant([[2],[3],[4]],tf.float32)

g=tf.matmul(x,w)

f=tf.nn.relu(g)

# 计算f在(2,1,3)处的导数
gradient=tf.gradients(f,[g,x])

session=tf.Session()
session.run(tf.global_variables_initializer())

print(session.run(gradient))
[array([[ 1.]], dtype=float32), array([[ 2.,  3.,  4.]], dtype=float32)]
import tensorflow as tf

# 变量
x=tf.Variable(tf.constant([[2,1,3]],tf.float32))
w=tf.constant([[2],[3],[4]],tf.float32)

g=tf.matmul(x,w)

f=tf.nn.relu_layer(g,aplha=0.2)
# 牛顿梯度下降法
opti=tf.train.GradientDescentOptimizer(0.5).minimize(f)

session=tf.Session()
session.run(tf.global_variables_initializer())

for i in range(3):
    session.run(opti)
    
    print("第%d次迭代的值"%(i+1))
    print(session.run(x))
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-10-b088313b7a7f> in <module>()
      7 g=tf.matmul(x,w)
      8 
----> 9 f=tf.nn.relu_layer(g,aplha=0.2)
     10 # 牛顿梯度下降法
     11 opti=tf.train.GradientDescentOptimizer(0.5).minimize(f)


TypeError: relu_layer() got an unexpected keyword argument 'aplha'
elu激活函数
import tensorflow as tf

t=tf.constant([-2,0,1],tf.float32)

r=tf.nn.crelu(t)

session=tf.Session()

print(session.run(r))
[ 0.  0.  1.  2. -0.  0.]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
simclr-in-tensorflow-2是一个在TensorFlow 2中实现SimCLR(https://arxiv.org/abs/2002.05709)算法的项目。SimCLR是一种自监督学习方法,用于无标签图像数据的表示学习。 实现SimCLR在TensorFlow 2中的方法如下: 首先,我们导入必要的库和模块。其中包括TensorFlow 2、TensorFlow Datasets(用于加载图像数据集)和其他辅助函数。 然后,我们定义一个数据预处理函数,用于对图像数据进行预处理。这包括图像的随机裁剪、随机水平翻转、归一化和调整大小等操作。 接下来,我们构建模型。SimCLR模型由一个特征提取器和一个投影头组成。特征提取器通常是一个预训练的卷积神经网络,如ResNet。投影头是一个连接层,将特征映射到一个较低维度的向量空间。 然后,我们定义损失函数。SimCLR使用对比损失函数,它衡量正样本对和负样本对之间的相似性。在训练过程中,我们从数据集中选择两个样本,将它们通过特征提取器和投影头得到两个特征向量。然后,我们计算这两个向量之间的相似性,并用一个交叉熵损失函数最小化它。 在训练过程中,我们使用随机梯度下降(SGD)或Adam优化器进行参数优化。我们还定义了一些训练的超参数,如学习率、批量大小和训练迭代次数。 最后,我们对模型进行训练。我们从数据集中加载图像数据,并将其送入模型进行前向计算和反向传播。在训练过程中,我们监视损失函数的变化,并在训练结束后评估模型的性能。 通过以上步骤,我们就可以在TensorFlow 2中实现SimCLR算法。这个实现能够利用无标签的图像数据进行自监督学习,从而得到有用的图像表示。这些表示可以用于各种计算机视觉任务,如图像分类、物体检测和图像生成等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值