实验原理:
逻辑回归可以看作只有一层网络的前向神经网络,并且参数连接的权重只是一个值,而非矩阵。公式为:y_predict=logistic(X*W+b),其中X为输入,W为输入与隐含层之间的权重,b为隐含层神经元的偏置,而logistic为激活函数,一般为sigmoid或者tanh,y_predict为最终预测结果。
逻辑回归是一种分类器模型,需要函数不断的优化参数,这里目标函数为y_predict与真实标签Y之间的L2距离,使用随机梯度下降算法来更新权重和偏置。
注意数据集由于时间原因会有变换,要及时更新
实现代码:
import tensorflow.compat.v1 as tf tf.disable_v2_behavior() from tensorflow.examples.tutorials.mnist import input_data # 数据导入 mnist=input_data.read_data_sets("MNIST_data",one_hot=True) import os os.environ["CUDA_VISIBLE_DEVICES"]="0" #训练参数 #Parameters learning_rate=0.01 training_epochs=25 batch_size=100 display_step=1 #构造计算图 x=tf.placeholder(tf.float32,[None,784]) y=tf.placeholder(tf.float32,[None,10]) #使用Variable函数,设置模型的初始权重 W=tf.Variable(tf.zeros([784,10])) b=tf.Variable(tf.zeros([10])) #逻辑回归模型 pred=tf.nn.softmax(tf.matmul(x,W)+b) #构造代价函数cost cost=tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1)) #梯度下降法求最小值,即最优解 optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #初始化变量 init=tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for epoch in range(training_epochs): avg_cost = 0 total_batch = int(mnist.train.num_examples / batch_size) #loop over all batches for i in range(total_batch): batch_xs, batch_ys = mnist.train.next_batch(batch_size) # Fit training using batch data _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys}) avg_cost +=c / total_batch if(epoch + 1)%display_step == 0: print("Epoch:", '%04d'% (epoch + 1), "Cost:", "{:.09f}".format(avg_cost)) print("Optimization Finished!") correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1)) # Calculate accuracy for 3000 examples accuracy =tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print("Accuracy:", accuracy.eval({x: mnist.test.images[:3000], y: mnist.test.labels[:3000]}))
运行结果: