1. 占位符(tf.placeholder)和变量(tf.Variable)
- tf.placeholder,用于传递真实的样本
- 创建时不必指定初始值,可在运行时,通过Session.run函数的feed_dict的参数指定
- tf.Variable,用于可变的训练变量,如模型的权重或者偏置
- 创建时必须提供初始值,变量的值会随模型的训练而改变
示例:
stddev = 0.1
weights = {
'w1': tf.Variable(tf.random_normal([n_input, n_hidden_1], stddev=stddev)),
'w2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2], stddev=stddev)),
'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes], stddev=stddev))
}
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])
2. tf.random_normal使用方法
从正态分布中输出随机值,默认均值μ = 0, 标准差σ = 1。
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
- shape: 输出张量的形状,必选
- mean: 正态分布的均值,默认为0
- stddev: 正态分布的标准差,默认为1.0
- dtype: 输出的类型,默认为tf.float32
- seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样
- name: 操作的名称
3. 一些函数:
- tf.matmul() 求内积,矩阵乘
- tf.multiply(a, b, name='dot_product') 对应位置元素相乘
- b = tf.constant(3) 定义常量3并赋给b
- tf.random_uniform((6, 6), minval=low,maxval=high,dtype=tf.float32))) 返回6*6的矩阵,产生于low和high之间,产生的值是均匀分布的, maxval默认值为1.
- # tf.add(a, b) a,b都为张量,并且类型必须一致
- # tf.nn.bias_add(a, b) 将偏差bias加到对应value上面
- # tf.add_n(inputs,name=None) 将inputs列表元素相加
- tf.nn.sigmoid() sigmoid激活
- tf.reduce_mean() 求平均
- tf.nn.softmax_cross_entropy_with_logits(pred, y) 损失函数之---交叉熵函数
- tf.equal() 对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的。
- tf.argmax(pred, 1) 返回最大的那个数值所在的下标, 1横着来。
- tf.nn.embedding_lookup(tensor, ids) 将一个张量与索引对应起来.
4. 建模流程:
参数定义:
inputs and outputs(x, y) -- network Parameter setting(w, b)
计算定义:
predictions(nn传播计算定义) -- loss and optimizer(cost, optm, corr accr) -- init
开始计算:
每一个epoch(迭代次数)再每一个batchsize(样本大小)的进行计算
示例:
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
# NETWORK TOPOLOGIES
n_hidden_1 = 256
n_hidden_2 = 128
n_input = 784
n_classes = 10
# INPUTS AND OUTPUTS
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_classes])
# NETWORK PARAMETERS
stddev = 0.1
weights = {
'w1': tf.Variable(tf.random_normal([n_input, n_hidden_1], stddev=stddev)),
'w2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2], stddev=stddev)),
'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes], stddev=stddev))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'b2': tf.Variable(tf.random_normal([n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_classes]))
}
print("NETWORK READY")
def multilayer_perceptron(_X, _weights, _biases):
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(_X, _weights['w1']), _biases['b1']))
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, _weights['w2']), _biases['b2']))
return (tf.matmul(layer_2, _weights['out']) + _biases['out'])
# PREDICTION
pred = multilayer_perceptron(x, weights, biases)
# LOSS AND OPTIMIZER
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optm = tf.train.GradientDescentOptimizer(learning_rate=0.001).minimize(cost)
corr = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accr = tf.reduce_mean(tf.cast(corr, "float"))
# INITIALIZER
init = tf.global_variables_initializer()
print ("FUNCTIONS READY")
training_epochs = 20
batch_size = 100
display_step = 4
# LAUNCH THE GRAPH
sess = tf.Session()
sess.run(init)
# OPTIMIZE
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(mnist.train.num_examples/batch_size)
# ITERATION
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
feeds = {x: batch_xs, y: batch_ys}
sess.run(optm, feed_dict=feeds)
avg_cost += sess.run(cost, feed_dict=feeds)
avg_cost = avg_cost / total_batch
# DISPLAY
if (epoch+1) % display_step == 0:
print("Epoch: %03d/%03d cost: %.9f" % (epoch, training_epochs, avg_cost))
feeds = {x: batch_xs, y: batch_ys}
train_acc = sess.run(accr, feed_dict=feeds)
print("TRAIN ACCURACY: %.3f" % (train_acc))
feeds = {x: mnist.test.images, y: mnist.test.labels}
test_acc = sess.run(accr, feed_dict=feeds)
print("TEST ACCURACY: %.3f" % (test_acc))
print("OPTIMIZATION FINISHED")
5. 卷积神经网络(多了卷积层和池化层)
feature_map尺寸计算公式:[ (原图片尺寸 -卷积核尺寸 + 2*Padding)/ 步长 ] + 1
tf.nn.conv2d() 是TensorFlow里面实现卷积的函数,它是搭建卷积神经网络比较核心的一个方法,非常重要。
6. 循环神经网络
tf.nn.rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0, state_istuple=True) 是最简单的一个LSTM类
还有其它rnn实现类,几种lstm对比