之前在softmax多分类中讲到多用交叉熵作为损失函数,这里顺便写个例子,tensorlflow练手。

# encoding:utf-8
import tensorflow as tf
import input_data

### softmax 回归

# 自动下载安装数据集
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)


# 图片    28 * 28 = 784
x=tf.placeholder('float',[None,784])    # 特征数 784
# 初始化参数
w=tf.Variable(tf.zeros([784,10]))       # 10是输出维度,0-9数字的独热编码
b=tf.Variable(tf.zeros([10]))

# 模型
y=tf.nn.softmax(tf.matmul(x,w)+b)


### 训练模型
y_=tf.placeholder('float',[None,10])     # 10维

# 损失函数  交叉熵
cross_entropy=-tf.reduce_sum(y_*tf.log(y))      # reduce_sum 计算张量的所有元素之和    所有图片的交叉熵综合

# 优化算法 梯度下降
train_step=tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)      # 0.01 学习率  最小化 损失函数

# 初始化变量
init=tf.initialize_all_variables()

# 启动图  会话
sess=tf.Session()
sess.run(init)      # 初始化变量

# 迭代,训练参数
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)            # 训练集
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})


# 模型评估 准确率
correct_predict = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))       # 输出布尔值,即预测与真实是否一样
accuracy = tf.reduce_mean(tf.cast(correct_predict, 'float'))        # 将布尔值转化成浮点数,然后求平均, 正确/总数
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))      # 测试集   0.9194