一、前馈神经网络
概念:前馈神经网络、网络层数、输入层、隐藏层、输出层、隐藏单元、激活函数
前馈神经网络:前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。
网络层数:一般是指设置或者搭建的模型有多少层。以上图为例,网络层为3。注:一般不包括输入层。
输入层:一般指数据输入模型的一层,如图中 Layer L1 层。
输出层:一般指模型的最后一层,即Layer L4 层;
隐藏层:指除开输入层和输出层之外的中间层,如图Layer L2 层和 L3层;
隐藏单元:一般指隐藏层中的单元结构。
激活函数:一般指加权之后的值到输出之间函数,通过激活函数将上一层的输出作为下一层输入之前进行非线性变化,使模型不再是单一的线性变换。
二、简单的神经网络(tensorflow)
前期准备
通过二层的全连接网络,实现 mnist 数据集分类任务。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist_path = '/home/jie/Jie/codes/tf/datasets/MNIST_data/'
mnist = input_data.read_data_sets(mnist_path, one_hot=True)
# 定义超参数和其他常量
n_input = 784 # 28 * 28
n_classes = 10
max_epochs = 10000
learning_rate = 0.5
batch_size = 10
seed = 0
n_hidden = 30
## Sigmoid 函数的导数
def sigmaprime(x):
return tf.multiply(tf.sigmoid(x), tf.subtract(tf.constant(1.0), tf.sigmoid(x)))
# 为训练数据创建占位符
x_in = tf.placeholder(tf.float32, [None, n_input], name='x_in')
y = tf.placeholder(tf.float32, [None, n_classes], name='y')
# 创建模型
def multilayer_perceptron(x, weight, biases):
h_layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['h1'])
out_layer_1 = tf.sigmoid(h_layer_1)
h_out = tf.add(tf.matmul(out_layer_1, weights['h2']), biases['h2'])
return tf.sigmoid(h_out), h_out, out_layer_1, h_layer_1
# 权重
weights = {
'h1':tf.Variable(tf.random_normal([n_input, n_hidden], seed=seed)),
'h2':tf.Variable(tf.random_normal([n_hidden, n_classes], seed=seed))}
# 偏置
biases = {
'h1':tf.Variable(tf.random_normal([1, n_hidden], seed=seed)),
'h2':tf.Variable(tf.random_normal([1, n_classes], seed=seed))}
# 正向传播
y_hat, h_2, o_1, h_1 = multilayer_perceptron(x_in, weights, biases)
# loss function
err = y - y_hat
loss = tf.reduce_mean(tf.square(err, name='loss'))
# 反向传播
delta_2 = tf.multiply(err, sigmaprime(h_2))
delta_w_2 = tf.matmul(tf.transpose(o_1), delta_2)
wtd_error = tf.matmul(delta_2, tf.transpose(weights['h2']))
delta_1 = tf.multiply(wtd_error, sigmaprime(h_1