嘿,小伙伴们!我是捉迷,今天咱们来聊聊TensorFlow这个深度学习的大杀器。TensorFlow,谷歌出品,深度学习界的扛把子,它提供了强大的计算图和会话机制,让咱们能轻松搭建和训练复杂的神经网络模型。别墨迹了,咱们这就开整!
初识TensorFlowTensorFlow是个开源的机器学习库,它用计算图来表示计算任务,图中的节点代表数学运算,线代表在这些节点之间传递的多维数组(张量)。咱们可以用TensorFlow来设计和训练各种深度学习模型,比如卷积神经网络(CNN)、循环神经网络(RNN)等。
搭建计算图在TensorFlow中,咱们得先搭建好计算图,然后再通过会话来执行图中的计算。
import tensorflow as tf# 搭建计算图a = tf.constant(2)b = tf.constant(3)c = tf.add(a, b)# 创建会话并执行计算图with tf.Session() as sess: result = sess.run(c) print(result) # 输出: 5
温馨提示:在TensorFlow 2.x版本中,默认启用了Eager Execution模式,这种模式下不需要显式创建会话,代码会更简洁。但为了兼容旧代码和深入理解TensorFlow,咱们还是学一下这种方式。
变量与张量在TensorFlow中,变量和张量可是核心概念。变量就是可以更新的张量,张量就是多维数组。
# 定义一个变量v = tf.Variable(0)# 定义一个张量(常量)t = tf.constant([1, 2, 3, 4, 5])# 在会话中更新变量with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 初始化变量 v_val = sess.run(v) print(v_val) # 输出: 0 # 更新变量值 v_update = v.assign(10) v_new_val = sess.run(v_update) print(v_new_val) # 输出: 10
温馨提示:别忘了初始化变量哦,不然会得到未初始化的错误。
构建神经网络TensorFlow最牛的地方之一就是能轻松构建各种神经网络。咱们以简单的全连接神经网络为例。
# 构建一个简单的全连接神经网络# 输入层(1个神经元),隐藏层(2个神经元),输出层(1个神经元)# 输入数据x = tf.placeholder(tf.float32, shape=(1, 1))# 权重和偏置W1 = tf.Variable(tf.random_normal([1, 2]))b1 = tf.Variable(tf.random_normal([2]))W2 = tf.Variable(tf.random_normal([2, 1]))b2 = tf.Variable(tf.random_normal([1]))# 前向传播y1 = tf.matmul(x, W1) + b1y1 = tf.nn.relu(y1) # 激活函数y = tf.matmul(y1, W2) + b2# 损失函数(均方误差)loss = tf.reduce_mean(tf.square(y - tf.constant([1])))# 优化器(梯度下降)optimizer = tf.train.GradientDescentOptimizer(0.01)train = optimizer.minimize(loss)# 训练网络with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): sess.run(train, feed_dict={x: [[0.5]]}) # 测试网络 current_loss = sess.run(loss, feed_dict={x: [[0.5]]}) print(current_loss) # 输出一个很小的损失值 # 获取预测结果 current_y = sess.run(y, feed_dict={x: [[0.5]]}) print(current_y) # 输出接近[1]的预测结果
温馨提示:在TensorFlow 2.x中,咱们可以用tf.keras高层API来更简洁地构建和训练神经网络。
TensorFlow实战:手写数字识别好啦,咱们来点实战的!用TensorFlow来实现一个手写数字识别的模型。
from tensorflow.examples.tutorials.mnist import input_data# 加载MNIST数据集mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)# 构建神经网络模型x = tf.placeholder(tf.float32, [None, 784]) # 输入层(784个神经元)W = tf.Variable(tf.zeros([784, 10])) # 权重(784x10)b = tf.Variable(tf.zeros([10])) # 偏置(10个)# 前向传播y = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax激活函数# 损失函数(交叉熵)loss = -tf.reduce_sum(mnist.train_labels * tf.log(y), reduction_indices=[1])# 优化器(梯度下降)optimizer = tf.train.GradientDescentOptimizer(0.05)train = optimizer.minimize(loss)# 评估模型correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(mnist.train_labels, 1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# 训练模型with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train, feed_dict={x: batch_xs, y: batch_ys}) if i % 100 == 0: print("Step %d, Loss %f, Accuracy %f" % (i, sess.run(loss, feed_dict={x: batch_xs, y: batch_ys}), sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}))) # 最终测试集上的准确率 test_accuracy = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}) print("Test Accuracy: %f" % test_accuracy)
温馨提示:这个模型虽然简单,但已经能识别手写数字啦!当然,你可以尝试更复杂的网络结构和优化器来提升性能。
总结好啦,今天咱们就聊到这里啦!TensorFlow这个深度学习引擎真的是太强大了,它提供了丰富的API和高效的计算性能,让咱们能轻松搭建和训练复杂的神经网络模型。记得多动手实践哦,这样才能真正掌握TensorFlow的精髓!