#一个完整的神经网络实例
在一个模拟数据及上训练神经网络来训练二分类问题
import tensorflow as tf
from numpy.random import RandomState # 虽然报错并不影响使用,这在random中是私有
batch_size = 8
w1 = tf.Variable(tf.random_normal((2, 3), stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal((3, 1), stddev=1, seed=1))
x = tf.placeholder(tf.float32, shape=[None, 2], name="x-input")
y_ = tf.placeholder(tf.float32, shape=[None, 1], name="y-input")
# None表示使用不同的batch大小,训练时候采取较小的batch,测试时可一次使用全部的数据,但当数据集较大时候可能会导致内存溢出
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
# 前向传播
y = tf.sigmoid(y) # 激活函数
cross_entropy = -tf.reduce_mean(
y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)) + (1 - y)*tf.log(tf.clip_by_value(1 - y, 1e-10, 1.0))) # 交叉熵
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy) # Adam优化方法
rdm = RandomState(1) # 随机一个模拟数据集
dataset_size = 128
X = rdm.rand(dataset_size, 2)
# 数据集的大小为128*2
Y = [[int(x1+x2 < 1)] for (x1, x2) in X] # !!注意这里Y是一个[:1]维的张量
# 定义规则给样本做标签,可看作是一个二分类任务,用0 1表示,定义判断方法
with tf.Session() as sess: # 开始创建会话
init_op = tf.global_variables_initializer() # 全局变量变量初始化
sess.run(init_op)
print(sess.run(w1))
print(sess.run(w2)) # 打印初始变量
# 设定训练的轮数
STEPS = 5000
for i in range(STEPS):
# 每次选取batch个样本进行训练
start = (i * batch_size) % dataset_size
end = min(start + batch_size, dataset_size)
# 通过选取的样本训练神经网络并更新参数
sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
if i % 1000 == 0:
# 每隔一段时间计算所在数据上的交叉熵并输出
total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y})
print("After %d training steps(s), cross entropy on all data is %g" %
(i, total_cross_entropy))
print(sess.run(w1))
print(sess.run(w2))
第四章部分笔记
a = tf.nn.relu(tf.matmul(x, w1) + biases1)
y = tf.nn.relu(tf.matmul(a, w2) + biases2) # 类似的tf.nn.sigmod(),tf.tanh()
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, le-10, 1.0))) # y_代表正确结果,y代表预期结果/
# tf.clip_by_value(t,clip_valuemin,clip_valuemax,name)讲一个张量t限制在一个范围内(valuemin,valuemax),
# tf.log 求对数,对所有张量求
# tf.matmul 是矩阵乘法和‘*’是矩阵对应元素的乘法的区别
# tf.reduce_mean() 对整个矩阵做平均并不改变计算结果的意义
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, labels=y) # 使用了softmax回归之后的交叉熵
mse = tf.resuce_mean(tf.square(y_ - y)) # 均方误差
# 也可以根据实际情况自定义损失函数
loss = tf.reduce_mean(tf.where(tf.greater(v1, v2), (v1 - v2) * a, (v2 - v1) * b))
# tf.greater()输入是两个张量返回较大的一个。
# tf.where()输入是三个条件,第一个是判断条件,判断选择条件为True则选择第二个输入,否则选第三个,而且tf.where都是在元素级别上进行