import tensorflow as tf
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=(1, 2), name="input")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
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)))
learning_rate = 0.001
train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
tf.sigmoid()函数是将y转换为0~1之间的值,转换后的y代表预测是正样本概率,1-y代表与预测是负样本概率,这是神经网络中常用的激活函数之一。激活函数作用之一就是去线性化,使得层与层结点间不在是简单的加权求和,在加权和的基础上还做了一个非线性变化。
常用的激活函数还有:
ReLU
sigmoid
tanh
cross_entropy定义了真实值和预测值之间的交叉熵,是分类问题中一个常用的损失函数(推荐吴恩达的机器学习的课里面讲的比较透彻)。
损失函数(交叉熵)H(p, q)刻画的是通过概率分布q来表达概率分布p的困难程度。因为正确答案是希望的结果,p代表的是正确结果,q代表的是预测值,交叉熵的值越小两个概率分布越接近。
tf.clip_by_value函数可以将一个张量中的数值限制在一个范围内,可以避免一些运算错误(如log0)
tf.log即是log函数不过参数传入的是tf的变量(矩阵)
tf.reduce_mean函数对整个矩阵做平均(所有元素之和取平均)
learning_rate定义学习率
train_step定义反向传播的优化方法,tf支持10种不同的优化方法,其中较常用的3种为:
tf.train.GradientDescentOptimizer
tf.train.AdamOptimizer
tf.train.MomentumOptimizer
最后通过sess.run(train_step)就可以对所有训练数据集中的变量进行优化,使得在当前batch下损失函数更小。