UFLDL教程: Exercise:Self-Taught Learning


自我学习


Deep Learning and Unsupervised Feature Learning Tutorial Solutions

1.先训练稀疏自编码器提取特征,再把特征和label给softmax分类器进行训练,最后用test数据集进行测试。
2.由于实际应用中找到大量有标注的样本是非常困难的,所有采用先用大量无标注样本来进行无监督训练自编码器,再用自编码器来提取特征,配合有标注样本来进行有监督训练softmax分类器。
3.数据预处理方面:例如,如果对未标注数据集进行PCA预处理,就必须将得到的矩阵 U 保存起来,并且应用到有标注训练集和测试集上;而不能使用有标注训练集重新估计出一个不同的矩阵 U (也不能重新计算均值并做均值标准化),否则的话可能得到一个完全不一致的数据预处理操作,导致进入自编码器的数据分布迥异于训练自编码器时的数据分布。
4.自学习(self-taught learning) 不要求未标注数据 x_u 和已标注数据 x_l 来自同样的分布。另外一种带限制性的方式也被称为半监督学习,它要求 x_u和 x_l 服从同样的分布。


流程图


稀疏自编码器学习图像特征(实现自学习)—用到无标签的样本集
softmax回归对样本分类—用到有标签的训练样本集

这里写图片描述

这里写图片描述


步骤


第0步:设置神经网络的结构

该神经网络包括三层:
输入层的神经元个数(数字识别,则设置输入的图像大小)
输出端的神经元个数(也就是类别数)
隐藏层神经元个数
另外一些关于系数编码的参数
sparsityParam、lambda、beta
最大迭代次数:maxIter

第一步:产生无标签样本集和有标签样本集(训练数据集和测试数据集)

1)导入数据集mnistData和mnistLabels
mnistData是一个矩阵,每一列为一个输入样本(也就是一个输入的数字图像所有像素点按列排布)
mnistLabels是一个向量,它存储的数字表示mnistData中每一列样本的类别
(2)将输入的样本集mnistData进行分组
① 首先,将mnistData分为两组:一组为有标签的数据集(数字0-4的样本),另一组为无标签的数据集(数字5-9的样本)
(这两组的指标集分别为labeledSet和unlabeledSet)
② 然后,再将有标签的数据集平均分为两组,一组作为训练集、一组作为测试集;
(这两组的指标集分别为trainSet和testSet)
这里的指标,指在mnistData中的列序号
③ 分别得到上述三组指标集得到相应的数据集,并得到有标签数据集的标签
unlabeledData:无标签数据集,每一列为一个样本
trainData:有标签训练集,每一列为一个样本,相应的标签存放在trainLabels中
testData:有标签测试集,每一列为一个样本,相应的标签存放在testLabels中

用29404个无标注数据unlabeledData(手写数字数据库MNIST Dataset中数字为5-9的数据)来训练稀疏自动编码器,得到其权重参数opttheta。这一步的目的是提取这些数据的特征,虽然我们不知道它提取的究竟是哪些特征(当然,可以通过可视化结果看出来,可假设其提取的特征为Features),但是我们知道它提取到的特征实际上就是已训练好的稀疏自动编码器的隐藏层的激活值(即:第2层激活值)。注意:本节所有训练稀疏自动编码器的算法用的都L-BFGS算法。

第二步:训练稀疏自编码器

利用无标签数据集unlabeledData训练稀疏自编码器
① 初始化化自编码器的参数theta
② 调用minFunc中的最优化函数,计算得到稀疏自编码器的参数
包括设置minFunc函数的一些参数及对minFunc函数的调用,这里要用到稀疏自编码器的代价函数和梯度计算的函数sparseAutoencoderCost

第三步:利用稀疏自编码器对有标签的训练样本集和测试样本集提取特征

在得到稀疏自编码器后,可以利用它从有标签的数据集中提取图像特征,这里需要完成feedForwardAutoencoder.m函数
所谓图像的特征,其实就是指该图像在稀疏自编码器的权值矩阵W1作用下得到的隐藏层的输出
可以得到训练集的特征trainFeatures和测试集的特征testFeatures
它们的每一列分别是由稀疏自编码器提取出的特征

训练样本集提取特征

把15298个已标注数据trainData(手写数字数据库MNIST Dataset中数字为0-4的前一半数据)作为训练数据集通过这个已训练好的稀疏自动编码器(即:权重参数为opttheta的稀疏自动编码器),就可提取出跟上一步一样的相同的特征参数,这里trainData提取的特征表达假设为trainFeatures,它其实也是隐藏层的激活值。如果还不明白,这里打一个比方:假设上一步提取的是一个通信信号A(对应unlabeledData)的特征是一阶累积量,而这一步提取的就是通信信号B(对应trainData)的一阶累积量,它们提取的都是同样的特征,只是对象不同而已。同样地,unlabeledData和trainData提取的是同样的特征Features,只是对象不同而已。

测试样本集提取特征

把15298个已标注数据testData(手写数字数据库MNIST Dataset中数字为0-4的后一半数据)作为测试数据集通过这个已训练好的稀疏自动编码器(即:权重参数为opttheta的稀疏自动编码器),就可提取出跟上一步一样的相同的特征参数,这里testData提取的特征表达假设为testFeatures,它其实也是隐藏层的激活值。


注意:如果上一步对unlabeledData做了预处理,一定要把其各种数据预处理参数(比如PCA中主成份U)保存起来,因为这一步的训练数据集trainData和下一步的测试数据集testData也一定要做相同的预处理。本节练习,因为用的是手写数字数据库MNIST Dataset,已经经过了预处理,所以不用再预处理。
具体见:http://ufldl.stanford.edu/wiki/index.php/%E8%87%AA%E6%88%91%E5%AD%A6%E4%B9%A0


第四步:利用训练样本集训练softmax回归模型

利用训练集的特征集trainFeatures及其标签集trainLabels,训练softmax回归模型
注:softmaxTrain函数的输入参数(特征维数,标签数,惩罚项权值λ,训练数据集的数据,训练数据集的标签,其他参数)

把第三步提取出来的特征trainFeatures和已标注数据trainData的标签trainLabels作为输入来训练softmax分类器,得到其回归模型softmaxModel。

第五步:对测试数据集进行分类
利用得到的softmax回归模型对测试集进行分类

把第三步提取出来的特征testFeatures输入训练好的softmax回归模型softmaxModel,从而预测出已标注数据testData的类别pred,再把pred和已标注数据testData本来的标签testLabels对比,就可得出正确率。

综上,Self-taught learning是利用未标注数据,用无监督学习来提取特征参数,然后用有监督学习和提取的特征参数来训练分类器。

本次实验主要是进行0~4这5个数字的分类,虽然进行无监督训练用的是数字5~9的训练样本,这依然不会影响后面的结果。
5-9的数字进行降维的训练,训练出一般图像到低维空间的表示矩阵W和B,后用W和B,将要分类的图像0-4用低维表示.

%% CS294A/CS294W Self-taught Learning Exercise%  Instructions
%  ------------
% 
%  This file contains code that helps you get started on the
%  self-taught learning. You will need to complete code in feedForwardAutoencoder.m
%  You will also need to have implemented sparseAutoencoderCost.m and 
%  softmaxCost.m from previous exercises.
%
%% ======================================================================
%  STEP 0: Here we provide the relevant parameters values that will
%  allow your sparse autoencoder to get good filters; you do not need to 
%  change the parameters below.
% 该神经网络包括三层:
% 输入层的神经元个数(数字识别,则设置输入的图像大小)
% 输出端的神经元个数(也就是类别数)
% 隐藏层神经元个数 
% 另外一些关于系数编码的参数
% sparsityParam、lambda、beta
% 最大迭代次数:maxIter% 设置神经网络的相关参数
inputSize  = 28 * 28;%样本特征维数
numLabels  = 5;%样本类别
hiddenSize = 200;%隐藏层神经元个数
sparsityParam = 0.1; % desired average activation of the hidden units.% (This was denoted by the Greek alphabet rho, which looks like a lower-case "p",%  in the lecture notes). 
lambda = 3e-3;       % weight decay parameter       
beta = 3;            % weight of sparsity penalty term   
maxIter = 400;       %最大迭代步数%% ======================================================================% 第一步:产生无标签样本集和有标签样本集(训练数据集和测试数据集)
% (1)导入数据集mnistData和mnistLabels
% mnistData是一个矩阵,每一列为一个输入样本(也就是一个输入的数字图像所有像素点按列排布)
% mnistLabels是一个向量,它存储的数字表示mnistData中每一列样本的类别
% (2)将输入的样本集mnistData进行分组
% ① 首先,将mnistData分为两组:一组为有标签的数据集(数字0-4的样本),另一组为无标签的数据集(数字5-9的样本)
% (这两组的指标集分别为labeledSet和unlabeledSet)
% ② 然后,再将有标签的数据集平均分为两组,一组作为训练集、一组作为测试集;
% (这两组的指标集分别为trainSet和testSet)
% 这里的指标,指在mnistData中的列序号
% ③ 分别得到上述三组指标集得到相应的数据集,并得到有标签数据集的标签
% unlabeledData:无标签数据集,每一列为一个样本
% trainData:有标签训练集,每一列为一个样本,相应的标签存放在trainLabels中
% testData:有标签测试集,每一列为一个样本,相应的标签存放在testLabels中 %  STEP 1: Load data from the MNIST database
%
%  This loads our training and test data from the MNIST database files.
%  We have sorted the data for you in this so that you will not have to
%  change it.% Load MNIST database files
addpath mnist/ %MNIST数据集及其相关操作函数均在此文件夹中
mnistData   = loadMNISTImages('mnist/train-images.idx3-ubyte');
mnistLabels = loadMNISTLabels('mnist/train-labels.idx1-ubyte');% Set Unlabeled Set (All Images)% 无标签样本集和有标签样本集的指标集(将整个数据集分为无标签样本集和有标签样本集)
% Simulate a Labeled and Unlabeled set
labeledSet   = find(mnistLabels >= 0 & mnistLabels <= 4);%返回mnistLabels中元素值大于等于0且小于等于4的数字的行号
unlabeledSet = find(mnistLabels >= 5);% 训练数据集和测试数据集的指标集(有标签数据集再分为两部分:训练数据集和测试数据集)
numTrain = round(numel(labeledSet)/2);%训练样本个数
trainSet = labeledSet(1:numTrain);%训练样本集
testSet  = labeledSet(numTrain+1:end);%测试样本集% 无标记样本集的数据
unlabeledData = mnistData(:, unlabeledSet);% 训练数据集的数据和标签
trainData   = mnistData(:, trainSet);% mnistData中大于等于0且小于等于4的数字的前一半数字作为有标签的训练数据
trainLabels = mnistLabels(trainSet)' + 1; % Shift Labels to the Range 1-5% 测试数据集的数据和标签
testData   = mnistData(:, testSet);% mnistData中大于等于0且小于等于4的数字的后一半数字作为有标签的测试数据
testLabels = mnistLabels(testSet)' + 1;   % Shift Labels to the Range 1-5% Output Some Statistics
fprintf('# examples in unlabeled set: %d\n', size(unlabeledData, 2));
fprintf('# examples in supervised training set: %d\n\n', size(trainData, 2));
fprintf('# examples in supervised testing set: %d\n\n', size(testData, 2));%% ======================================================================% 第二步:训练稀疏自编码器
% 利用无标签数据集unlabeledData训练稀疏自编码器
% ① 初始化化自编码器的参数theta
% ② 调用minFunc中的最优化函数,计算得到稀疏自编码器的参数
% 包括设置minFunc函数的一些参数及对minFunc函数的调用,这里要用到稀疏自编码器的代价函数和梯度计算的函数sparseAutoencoderCost%  STEP 2: Train the sparse autoencoder
%  This trains the sparse autoencoder on the unlabeled training
%  images. % 按均匀分布随机初始化theta参数, 初始化化自编码器的参数theta
%  Randomly initialize the parameters
theta = initializeParameters(hiddenSize, inputSize);%% ----------------- YOUR CODE HERE ----------------------
%  Find opttheta by running the sparse autoencoder on
%  unlabeledTrainingImages
%  利用L-BFGS算法,用无标签数据集来训练稀疏自动编码器%  利用无标签样本集对稀疏自编码器进行学习
%(利用优化函数,这里要用到minFunc文件夹下的优化函数和sparseAutoencoder文件夹下的sparseAutoencoderCost函数)
addpath minFunc/
addpath sparseAutoencoder/
opttheta = theta; % 优化函数的一些参数设置
options.Method = 'lbfgs'; % Here, we use L-BFGS to optimize our cost% function. Generally, for minFunc to work, you% need a function pointer with two outputs: the% function value and the gradient. In our problem,% sparseAutoencoderCost.m satisfies this.
options.maxIter = 400;    % Maximum number of iterations of L-BFGS to run 
options.display = 'on';
% 调用优化函数,得到opttheta,即为稀疏自编码器的所有权值构成的向量
[opttheta, cost] = minFunc( @(p) sparseAutoencoderCost(p, ...inputSize, hiddenSize, ...lambda, sparsityParam, ...beta, unlabeledData), ...theta, options);%% -----------------------------------------------------% Visualize weights
W1 = reshape(opttheta(1:hiddenSize * inputSize), hiddenSize, inputSize);
display_network(W1');%% ======================================================================
% 第三步:利用稀疏自编码器对有标签的训练样本集和测试样本集提取特征
% 在得到稀疏自编码器后,可以利用它从有标签的数据集中提取图像特征,这里需要完成feedForwardAutoencoder.m函数
% 所谓图像的特征,其实就是指该图像在稀疏自编码器的权值矩阵W1作用下得到的隐藏层的输出
% 可以得到训练集的特征trainFeatures和测试集的特征testFeatures
% 它们的每一列分别是由稀疏自编码器提取出的特征 
%% STEP 3: Extract Features from the Supervised Dataset
%  You need to complete the code in feedForwardAutoencoder.m so that the 
%  following command will extract features from the data.
% 利用稀疏自编码器提取训练样本集中所有样本的特征
trainFeatures = feedForwardAutoencoder(opttheta, hiddenSize, inputSize, ...trainData);
% 利用稀疏自编码器提测试练样本集中所有样本的特征
testFeatures = feedForwardAutoencoder(opttheta, hiddenSize, inputSize, ...testData);%% ======================================================================
% 第四步:利用训练样本集训练softmax回归模型
% 利用训练集的特征集trainFeatures及其标签集trainLabels,训练softmax回归模型  
% 注:softmaxTrain函数的输入参数(特征维数,标签数,惩罚项权值λ,训练数据集的数据,训练数据集的标签,其他参数) 
%% STEP 4: Train the softmax classifiersoftmaxModel = struct;  
%% ----------------- YOUR CODE HERE ----------------------
%  Use softmaxTrain.m from the previous exercise to train a multi-class
%  classifier. 
%  利用L-BFGS算法,用从有标签训练数据集中提取的特征及其标签,训练softmax回归模型%  Use lambda = 1e-4 for the weight regularization for softmaxlambda = 1e-4;
inputSize = hiddenSize;
numClasses = numel(unique(trainLabels));%unique为找出向量中的非重复元素并进行排序% You need to compute softmaxModel using softmaxTrain on trainFeatures and
% trainLabelsaddpath Softmax_Regression/
options.maxIter = 100;
softmaxModel = softmaxTrain(inputSize, numLabels, lambda, ...trainData, trainLabels, options);    

function [activation] = feedForwardAutoencoder(theta, hiddenSize, visibleSize, data)
% 该函数的作用是:利用稀疏自编码器从数据中提取特征
% theta: trained weights from the autoencoder
% visibleSize: the number of input units (probably 64) 
% hiddenSize: the number of hidden units (probably 25) 
% data: Our matrix containing the training data as columns.  So, data(:,i) is the i-th training example. % We first convert theta to the (W1, W2, b1, b2) matrix/vector format, so that this 
% follows the notation convention of the lecture notes. W1 = reshape(theta(1:hiddenSize*visibleSize), hiddenSize, visibleSize);
b1 = theta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);%% ---------- YOUR CODE HERE --------------------------------------
%  Instructions: Compute the activation of the hidden layer for the Sparse Autoencoder.
activation=sigmoid(W1*data+repmat(b1,1,size(data,2)));%-------------------------------------------------------------------end%-------------------------------------------------------------------
% Here's an implementation of the sigmoid function, which you may find useful
% in your computation of the costs and the gradients.  This inputs a (row or
% column) vector (say (z1, z2, z3)) and returns (f(z1), f(z2), f(z3)). function sigm = sigmoid(x)sigm = 1 ./ (1 + exp(-x));
end

参考文献


UFLDL教程(五)之self-taught learning

Deep Learning 7_深度学习UFLDL教程:Self-Taught Learning_Exercise(斯坦福大学深度学习教程)

自我学习

Deep Learning 6_深度学习UFLDL教程:Softmax Regression_Exercise(斯坦福大学深度学习教程)

吴恩达 Andrew Ng 的公开课

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UFLDL教程: Exercise: Implement deep networks for digit classification

Deep networks Deep Learning and Unsupervised Feature Learning Tutorial Solutions 深度网络的优势 比单层神经网络能学习到更复杂的表达。不同层的网络学习到的特征是由最底层到最高层慢慢上升的。比如在图像的学习中&#xff0c;第一个隐含层网络可能学习的是边缘特征&am…

UFLDL教程: Exercise:Learning color features with Sparse Autoencoders

Linear Decoders Deep Learning and Unsupervised Feature Learning Tutorial Solutions 以三层的稀疏编码神经网络而言&#xff0c;在sparse autoencoder中的输出层满足下面的公式 从公式中可以看出&#xff0c;a3的输出值是f函数的输出&#xff0c;而在普通的sparse autoenc…

UFLDL教程:Exercise:Convolution and Pooling

Deep Learning and Unsupervised Feature Learning Tutorial Solutions CNN的基本结构包括两层 其一为特征提取层&#xff0c;每个神经元的输入与前一层的局部接受域相连&#xff0c;并提取该局部的特征。一旦该局部特征被提取后&#xff0c;它与其它特征间的位置关系也随之确…

莫凡机器学习课程笔记

怎样区分好用的特征 避免无意义的信息避免重复性的信息避免复杂的信息 激活函数的选择 浅层神经网络&#xff0c;可以随便尝试各种激活函数 深层神经网络&#xff0c;不可随机选择各种激活函数&#xff0c;这涉及到梯度爆炸和梯度消失。&#xff08;给出梯度爆炸和梯度消失的…

UFLDL教程:数据预处理

数据预处理是深度学习中非常重要的一步&#xff01;如果说原始数据的获得&#xff0c;是深度学习中最重要的一步&#xff0c;那么获得原始数据之后对它的预处理更是重要的一部分。 一般来说&#xff0c;算法的好坏一定程度上和数据是否归一化&#xff0c;是否白化有关。 数据归…

深度学习笔记(待续)

背景知识 好的特征应具有不变性&#xff08;大小、尺度和旋转等&#xff09;和可区分性&#xff09;&#xff1a;例如Sift的出现&#xff0c;是局部图像特征描述子研究领域一项里程碑式的工作。由于SIFT对尺度、旋转以及一定视角和光照变化等图像变化都具有不变性&#xff0c;并…

人工智能泰斗迈克尔·乔丹分享机器学习要义:创新视角,直面挑战

2017年6月21日至22日&#xff0c;腾讯云未来峰会在深圳举行。人工智能领域的世界级泰斗迈克尔欧文乔丹&#xff08;Michael I.Jordan&#xff09;进行了主题为“机器学习&#xff1a;创新视角&#xff0c;直面挑战”的演讲&#xff0c;与大家分享他对人工智能的未来与挑战的见解…

Tensorflow官方文档---起步 MNIST示例

Tensorflow •使用图 (graph) 来表示计算任务. • 在被称之为 会话 (Session) 的上下文 (context) 中执行图. • 使用 tensor 表示数据. • 通过 变量 (Variable) 维护状态. • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据 综述 Ten…

Git 版本管理

相关文章 版本管理 github访问太慢解决方案 Material for git workshop GitHub秘籍 安装-Git版本管理 Git官网安装说明 Linux 系统安装 # 如果你的 Linux 是 Ubuntu: $ sudo apt-get install git-all# 如果你的 Linux 是 Fedora: $ sudo yum install git-all 如果是其他…

tensorflow:Multiple GPUs

深度学习theano/tensorflow多显卡多人使用问题集 tensorflow中使用指定的GPU及GPU显存 Using GPUs petewarden/tensorflow_makefile tf_gpu_manager/manager.py 多GPU运行Deep Learning 和 并行Deep Learning&#xff08;待续&#xff09; Multiple GPUs 1. 终端执行程序…

Tensorflow一些常用基本概念与函数

参考文献 Tensorflow一些常用基本概念与函数 http://www.cnblogs.com/wuzhitj/archive/2017/03.html Tensorflow笔记&#xff1a;常用函数说明&#xff1a; http://blog.csdn.net/u014595019/article/details/52805444 Tensorflow一些常用基本概念与函数&#xff08;1&#…

ubuntu16.04 Nvidia 显卡的风扇调速及startx的后果

问题描述 #查看nvdia GPU 显卡状态 watch -n 10 nvidia-smi 发现显卡Tesla k40c的温度已经达到74&#xff0c;转速仅仅只有49%。 查看Tesla产品资料&#xff0c;Tesla K40 工作站加速卡规格 &#xff0c;可知 所以需要调整风扇速度来降温。 然而官方驱动面板里也没有了风扇调…

Python函数式编程-map()、zip()、filter()、reduce()、lambda()

三个函数比较类似&#xff0c;都是应用于序列的内置函数。常见的序列包括list、tuple、str map函数 map函数会根据提供的函数对指定序列做映射。 map函数的定义&#xff1a; map(function, sequence[, sequence, ...]) -> list map()函数接收两个参数&#xff0c;一个是函…

Kaggle : Using a Convolutional Neural Network for classifying Cats vs Dogs

数据下载 https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data Part 1 - Preprocessing #Package Requirements #!/usr/bin/python2 # -*- coding: UTF-8 -*- import cv2 # working with, mainly resizing, images import numpy as np …

李宏毅机器学习课程1~~~Introduction Regression

机器学习介绍 机器学习就是要找一个函数。 机器学习的三大要素框架&#xff1a;训练集&#xff0c;函数集&#xff08;模型集&#xff09;&#xff0c;损失函数集。 机器学习图谱 AI训练师的成长之路。 1. 梯度下降法的理解Gradient Descent 参数变化的方向就是损失函数减少的方…

李宏毅机器学习课程2~~~误差从哪里来?

Stanford机器学习—第六讲. 怎样选择机器学习方法、系统 误差来源 误差主要来自于偏差和方差。 数学上定义&#xff1a; 通过covariate X 预测 Y &#xff0c;我们假设存在如下关系&#xff1a; Y f(X) ϵ 满足正态分布均值为0 方差σϵ 模型预测错误定义为&#xff1a; …

李宏毅机器学习课程3~~~梯度下降法

梯度下降法描述 梯度下降法是为了找到最优的目标函数&#xff0c;寻找的过程就是沿着损失函数下降的方向来确定参数变化的方向。参数更新的过程就是一个不断迭代的过程&#xff0c;每次更新参数学到的函数都会使得误差损失越来越小&#xff0c;也就是说学习到的参数函数越来越逼…

李宏毅机器学习课程4~~~分类:概率生成模型

分类问题用回归来解决&#xff1f; 当有右图所示的点时&#xff0c;这些点会大幅改变分类线的位置。这时候就会导致整体的回归结果变差。当把多分类当成回归问题&#xff0c;类别分别为1&#xff0c;2,3,4……&#xff0c;因为回归的问题是预测具体的值&#xff0c;这样定义类别…

李宏毅机器学习课程5~~~分类:逻辑回归

Function Set 不同的w&#xff0c;b来确定不同的函数&#xff0c;这样就组成了函数集合&#xff0c;不同的w&#xff0c;b可以来表达不同的分布函数。 Good of a Function 变换表达形式 两个Bernoulli distribution的交叉熵。所谓交叉熵&#xff0c;是用来刻画两个分布的相似性…

李宏毅机器学习课程6~~~深度学习入门

深度学习历史 深度学习经典步骤 神经网络的符合标记含义 Wij 代表的是从神经元&#xff4a;到神经元&#xff49;&#xff0c;这样写的目的是便于表达&#xff0c;否则最后的表达式子就是Wij的转置&#xff0c;细节见下面。 每个神经元的偏执值组成一个向量&#xff42; 单个神…