引子

对于初学者来说,我相信很容易对神经网络中的各种 Shape 形式产生混乱。(事实证明,我和我的同学就做过相关讨论)
比如,神经网络中,对于一张图片的输入需要怎么样处理呢,除了把图像压缩成一个向量外,一个样本看做一行还是一列的形式输入呢,权重 WWW 的形式是什么样的,等等

下面我将对比 吴恩达的Deep Learning 中教学的知识 与 TensorFlow 中的各种 Shape 进行解释:

在我实现神经网络的时候(http://blog.csdn.net/MachineRandy/article/details/79546994),遇到这样的一个问题,对于一个第 (i,i+1)" role="presentation" style="position: relative;">(i,i+1)(i,i+1)(i,i+1) 层的网络,神经元的数量分别是 n,mn,mn ,m ,权重 WWW 的维度 shape 到底如何定义?

logistics 回归中权重的表述

在吴恩达的视频中,多以 θ" role="presentation" style="position: relative;">θθ\theta 表示,习惯是,我在里面的陈述中更多的使用 WWW 表示权重 ,两者均表示权重这一相同的含义,我们看一下神经网络的最简单形式 Logistic 回归的情况:

权重 θ" role="presentation" style="position: relative;">θθ\theta 和 输入 XXX 都是以列向量的形式给出

fac(θT⋅X+b),fac:activationfunction" role="presentation">fac(θT⋅X+b),fac:activationfunctionfac(θT⋅X+b),fac:activationfunction

f_{ac}(\theta^T \cdot X + b) , \quad f_{ac}:activation function
在李航博士的《统计学习方法》中,内积部分习惯上使用 W⋅XW⋅XW \cdot X 的形式,两种表达形式均可以。对于权重的shape 形式,这里显而易见,shape(θT)=shape(W)shape(θT)=shape(W)shape(\theta^T) = shape(W) ,具体维度之后分析。

再如下面的网络结构

假设第一层为输入 XXX ,X" role="presentation" style="position: relative;">XXX 的特征数就是 4 ,第二层为隐藏层
在计算的时候,根据公式

fac(W⋅X+b),fac:activationfunctionfac(W⋅X+b),fac:activationfunction

f_{ac}(W \cdot X + b) , \quad f_{ac}:activation function
和矩阵乘法 WWW 的列数等于 X" role="presentation" style="position: relative;">XXX 的行数,因为 W⋅XW⋅XW \cdot X 得到的一定是与样本数、第二层神经元数相关,可以容易想到,相等的部分就是 XXX 的特征数量。

即对于 X→dim_feature×dim_samples" role="presentation" style="position: relative;">X→dim_feature×dim_samplesX→dim_feature×dim_samplesX \to dim\_feature \times dim\_samples 比如有 10 个样本,每个样本有 4 个特征,那么输入为 X4×10X4×10X_{4 \times 10}

那么 W→num_units(i+1)×num_units(i)W→num_units(i+1)×num_units(i)W \to num\_units^{(i+1)} \times num\_units^{(i)} 即 ((( 后一层神经元数 ,前一层神经元数 )" role="presentation" style="position: relative;">)))对应上图的就是 W3×4W3×4W_{3 \times 4}

W3×4⋅X4×10→matrix3×10W3×4⋅X4×10→matrix3×10

W_{3 \times 4} \cdot X_{4 \times 10} \to matrix_{3 \times 10}

之后,我们会在输出层(这里是指第二层)的每个单元上加上一个偏置 bbb ,因此这里的偏置为 b3×1" role="presentation" style="position: relative;">b3×1b3×1b_{3 \times 1}

∣∣∣∣w11w21w31w12w22w32w13w23w33w14w24w34∣∣∣∣⋅∣∣∣∣∣∣∣x(1)1x(1)2x(1)3x(1)4x(2)1x(2)2x(2)3x(2)4............x(10)1x(10)2x(10)3x(10)4∣∣∣∣∣∣∣+∣∣∣∣b1b2b3∣∣∣∣|w11w12w13w14w21w22w23w24w31w32w33w34|⋅|x1(1)x1(2)...x1(10)x2(1)x2(2)...x2(10)x3(1)x3(2)...x3(10)x4(1)x4(2)...x4(10)|+|b1b2b3|

\begin{vmatrix}w_{11} & w_{12} & w_{13} & w_{14} \\w_{21} & w_{22} & w_{23} & w_{24} \\w_{31} & w_{32} & w_{33} & w_{34} \\\end{vmatrix} \cdot\begin{vmatrix}x_1^{(1)} & x_1^{(2)} & ... & x_1^{(10)} \\x_2^{(1)} & x_2^{(2)} & ... & x_2^{(10)} \\x_3^{(1)} & x_3^{(2)} & ... & x_3^{(10)} \\x_4^{(1)} & x_4^{(2)} & ... & x_4^{(10)} \\\end{vmatrix}+ \begin{vmatrix}b_1 \\b_2 \\b_3 \\\end{vmatrix}

这就是推导的形式和我按照公式以及授课内容的理解,我们看看在我们使用计算的过程中有什么问题:
首先,在以往处理结构化数据时,我们都是采用一行表示一个样本数,每一列表示数据的一个特征(或属性),而在这里正好相反,这容易造成混淆,另外,对于权重 WWW 在定义网络时,按照向前传播的趋势,我们更容易接受前后两层的神经元数与权重 W" role="presentation" style="position: relative;">WWW 的前后维度顺序一致的情况(即更倾向于理解 吴恩达的 θTθT\theta ^ T 中 θθ\theta)

我之所以辨析,就是因为我发现在 TensorFlow 中的各个变量的 shape 与之前的理解是不一样的。
在 TensorFlow 中,WWW、X" role="presentation" style="position: relative;">XXX、bbb 的形式均与之前数学推导相反。

对于输入形式 X" role="presentation" style="position: relative;">XXX ,每一行代表一个样本实例,每一列代表一个特征(属性),因此一个有 10 个样本,每个样本有 4 个特征的数据集,表示为 X10×4X10×4X_{10 \times 4};

对于权重形式 WWW , W→num_units(i)×num_units(i+1)" role="presentation" style="position: relative;">W→num_units(i)×num_units(i+1)W→num_units(i)×num_units(i+1)W \to num\_units^{(i)} \times num\_units^{(i+1)} 为 ((( 前一层神经元数 ,后一层神经元数 )" role="presentation" style="position: relative;">))) 对应上面网络图的就是 W4×3W4×3W_{4 \times 3},
因此,内积形式 W3×4⋅X4×10+b3×1W3×4⋅X4×10+b3×1W_{3 \times 4} \cdot X_{4 \times 10} + b_{3 \times 1} 变成 X10×4⋅W4×3+b1×3X10×4⋅W4×3+b1×3X_{10 \times 4} \cdot W_{4 \times 3} + b_{1 \times 3} ,并且对于最终全连接的单输出节点 YYY 得到的结果也由 Y1×10→Y10×1" role="presentation" style="position: relative;">Y1×10→Y10×1Y1×10→Y10×1Y_{1 \times 10} \to Y_{10 \times 1}。
具体,可以从下面例子中看出:

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 19 15:24:06 2018@author: lyh
"""import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets('MNIST_data',one_hot=True)def add_layer(inputs,in_size,out_size,activation_function=None):W = tf.Variable(tf.random_normal([in_size,out_size]),name="wight")b = tf.Variable(tf.zeros([1,out_size]) + 0.1,name="biase")if activation_function is None:ouput = tf.matmul(inputs,W) + belse:ouput = activation_function(tf.matmul(inputs,W) + b)return ouputdef compute_accuracy(v_xs,v_ys):global predictiony_pre = sess.run(prediction,feed_dict={xs:v_xs})correct_prediction = tf.equal(tf.argmax(y_pre,1),tf.argmax(v_ys,1))accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))result = sess.run(accuracy,feed_dict={xs:v_xs,ys:v_ys})return resultxs = tf.placeholder(tf.float32,[None,784]) #这里是28*28的照片,列数是784为特征维度
ys = tf.placeholder(tf.float32,[None,10])  #列数是10为输入的维度
#两个None 分别代表实际输入样本的个数prediction = add_layer(xs,784,10,activation_function=tf.nn.softmax)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1])) #losstrain = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)#初始化
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)for step in range(1000):batch_xs,batch_ys = mnist.train.next_batch(100)sess.run(train,feed_dict={xs:batch_xs,ys:batch_ys})if step % 50 == 0:print(compute_accuracy(mnist.test.images,mnist.test.labels))

这就是我所理解 TensorFlow 与 学习推导 之间,关于维度的不同表达形式。


初学者,有理解不对的地方欢迎大家提出纠正,谢谢。

神经网络关于输入X 权重W 和偏置biase 的Shape形式辨析相关推荐

  1. 深度学习最佳实践系列——权重w初始化

    摘要: 本文是深度学习最佳实践系列博客之权重初始化,主要介绍权重初始化的相关问题及方法,文中提及的权重初始化方法均可以应用于普通的神经网络.卷积神经网络和递归神经网络之中. 作为深度学习的初学者,我有 ...

  2. 神经网络的输出层有哪些_深度学习的数学-神经网络、输入层、隐藏层、输出层...

    前言 前文中了解到,神经网络由多个神经单元组成,而本篇博客将会了解到深度学习由多个神经网络组成,并且分为 输入层.隐藏层和输出层,隐藏层涉及到的知识点最多,是本文的重点 正文 阶层型的神经网络主要结构 ...

  3. 回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测

    回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测 ...

  4. 神经网络的输入稀疏矩阵,神经网络中的矩阵运算

    1.BP神经网络模型各个参数的选取问题 样本变量不需要那么多,因为神经网络的信息存储能力有限,过多的样本会造成一些有用的信息被丢弃.如果样本数量过多,应增加隐层节点数或隐层数目,才能增强学习能力. 一 ...

  5. 回归预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络多输入单输出回归预测

    回归预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆神经网络多输 ...

  6. python加权最小二乘_Eviews关于加权最小二乘法(WLS)中权重W的问题

    Eviews关于加权最小二乘法(WLS)中权重W的问题 使用Eviews7,多元线性模型中,怎么做进行加权最小二乘法啊?也就是WLS.权重W该怎么求呢?补充:我的变量数据有负数.请详细一点,好吗? 解 ...

  7. 回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出

    回归预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现CNN-LSTM(卷积长短期记忆神经网络)多输入单输出 基本介绍 模型背景 C ...

  8. 卷积神经网络多输入和多输出

    卷积神经网络多输入和多输出 1.多输入 #多输入通道 import d2lzh.d2lzh as d2l from mxnet import nddef corr2d_multi_in(x,k):#首 ...

  9. 回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出

    回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出 目录 回归预测 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多输入单输出 ...

  10. 回归预测 | MATLAB实现ANN神经网络多输入单输出

    回归预测 | MATLAB实现ANN神经网络多输入单输出 目录 回归预测 | MATLAB实现ANN神经网络多输入单输出 预测效果 基本介绍 模型描述 程序设计 参考资料 致谢 预测效果 基本介绍 人 ...

最新文章

  1. leetcode算法题--三角形最小路径和
  2. 如何搭建Docker私有仓库
  3. 《认知设计:提升学习体验的艺术》——小结
  4. U-Boot启动过程--详细版的完全分析
  5. static函数与普通函数区别
  6. AD 组策略应用与排错(2排错)
  7. 什么是Selenium?如何使用Selenium进行自动化测试
  8. [转载] python判断字符串中包含某个字符串_干货分享| Python中最常用的字符串方法
  9. [SCOI2005][BZOJ 1084]最大子矩阵
  10. @import ‘./common/stylus/mixins.styl‘引起的一系列错误
  11. 微信支付服务器白名单,微信测试号白名单怎么回事?如何进行微信支付测试?
  12. sub1G-CC1310的应用开发之入门
  13. “新基建”投资背景下 安防企业如何把握发展机遇?
  14. HTML和CSS基础学习
  15. 华为交换机RRPP单环配置
  16. <Python的输入、输出、注释>——《Python》
  17. IE和火狐的在js和css上的差别
  18. 江苏电信2020IT技术岗上机考试题
  19. 离散数学知识点总结(1):什么是命题;什么是复合命题;真值表
  20. xilinx cordic ip核的使用

热门文章

  1. php九九乘法表带表格,九九乘法表打印(js打印九九乘法表用表格显示)
  2. 一款全面超越ps3的国产游戏机
  3. android电话本导入iphone,如何将Android电话簿导入iPhone手机
  4. 百旺如何看是否清卡_百旺税控盘会自动清卡吗
  5. 红米html查看器,小米 红米【AC2100】一键刷BREED【30秒刷完】小白脑残专用 无需工具TELNET + 检查坏块...
  6. 【转载】Log4j配置详解之log4j.xml
  7. recv( )函数返回值说明
  8. opencv学习笔记(三)颜色转换 cvtColor
  9. Hierarchy Viewer的基本使用
  10. 机器学习面试题60~100