许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  TensorFlow 2学习笔记:张量基础

TensorFlow 2学习笔记:张量基础

阅读数 2635
点赞 0
article_banner

一、TensorFlow 2.0的Keras模式

说到TensorFlow,很多人第一反应是它复杂难懂。但2026年更新的TensorFlow 2.0彻底改变了这种印象。现在官方直接默认启用Keras模式,就像把复杂的比喻换成简单的生活对话。比如我之前学模型训练时,总要写一堆代码才能跑起来,现在直接用Keras API就能搞定。官方文档里特别提到,这种设计让新手也能快速上手,老手也能更高效地调试。

你试试看这行代码:

import tensorflow as tf

不出意外的话,系统会自动启动eager执行模式。就像你打开冰箱,门会自动弹开一样自然。没人打call的时候,TensorFlow会自动分配计算资源。这挺酷的,毕竟我们不是计算机科学家,更关注的是结果而非性能细节。

二、张量的那些事

很多人觉得张量就是个高维数组,但其实它还有些小秘密。比如我用过np.ones([2,2])生成一个二维数组,用tf.multiply乘以36,结果变成:

[[36. 36.][36. 36.]]

候如果想转回numpy,直接调用numpy()方法就行。但注意!如果张量在GPU上,初始化和转换时会有隐性操作。比如运行这段代码时,我会看到警告:

"Tensor on GPU cannot be converted to numpy"

看来需要手动指定设备。这让我想起去年做数据预处理时的坑,当时没注意内存位置,结果耗时翻了三倍。

三、张量与numpy的互转技巧

像我这种经常在numpy和张量之间切换的人,早就总结出几点经验。最简单的办法就是用两个函数:

  • 用tf.convert_to_tensor()把numpy数组转成张量
  • 用np.asarray()把张量转成numpy数组

但有时候也会遇到麻烦。比如我之前用np.add对张量做操作时,自动获取了GPU资源,但结果却显示在CPU上。这说明转换过程中设备绑定出了问题。候需要手动指定设备,或者用config.experimental_run_functions_eagerly()强制执行。

四、GPU加速实战

提到GPU,我得说实话,这玩意儿真的能救命。去年我用CPU跑一个1000x1000矩阵乘法,整整花了3分钟。后来改用GPU,时间直接缩短到5秒。这种差距不是开玩笑的。

这里有个实操案例:

import timedef time_matmul(x):start = time.time()for _ in range(10):tf.matmul(x, x)result = time.time() - startprint(f'10 loops: {1000*result:.2}ms')

默认情况下,这段代码会运行在CPU上。但如果你的显卡给力,手动切换:

with tf.device('GPU:0'):x = tf.random.uniform([1000, 1000])assert x.device.endswith('GPU:0')time_matmul(x)

就能看到明显的性能差异。

五、张量不可变的秘密

这很重要!我之前犯过一个大错,以为张量像普通变量一样修改。结果等我把数据放进张量后,想改值发现根本动不了。网上查资料才发现,张量是不可变的。用代码试试看:

x = tf.constant([1,2,3])x[0] = 100  # 报错!

候程序会弹出错误提示:"Invalid assignment"。记住这个教训,以后操作张量时要用assign方法。

六、实操小技巧:设备验证

有时候我也会纠结,到底张量在哪里运行?官方提供了一个方便的方法:

tf.test.is_gpu_available()  # 判断是否有可用GPUx.device.endswith('GPU:0')   # 查看是否在GPU上

这两个函数能帮我们避开潜在的性能陷阱。比如我之前在做图像处理时,误以为模型在GPU跑,结果发现数据还没加载到显存里,白白浪费了半小时。

七、从列表创建张量

这是我刚开始学时最喜欢的功能。直接写:

ds_tensors = tf.data.Dataset.from_tensor_slices([6,5,4,3,2,1])

就能生成一个数据集。用map()进行平方运算,shuffle()打乱顺序,batch()分组处理。比如运行这段代码:

ds_tensors = ds_tensors.map(tf.square).shuffle(2).batch(2)

会得到:

[[36, 25],[16, 9],[4, 1]]

候再打印ds_file的内容,看到的其实是文件行数据。比如:

[b'Line 1', b'Line 2'],[b'Line 3']

这种差异让我意识到,不同数据源的处理方式真的不一样。

八、提升性能的隐藏技巧

有次我尝试在GPU上跑模型,发现初始化耗时特别长。后来查资料才发现,显存预分配是关键。像设置:

tf.config.set_visible_devices([], 'GPU')  # 关闭GPU

虽然看起来奇怪,但能避免显存分配卡顿。用tf.data.Dataset时,configure_ahead()功能也很实用。试试看:

ds = ds.cache().prefetch(tf.data.AUTOTUNE)

的话,数据预加载就能和模型计算并行处理。

九、小工具:调试神器

有一次我用普通print()调试模型,发现输出太乱。后来改用:

tf.print(x)  # 更清晰的调试信息

效果立竿见影。而且官方文档提到,这个函数支持格式化参数,比如:

tf.print(x, output_stream='file')  # 输出到文件

就能把调试信息保留在日志里。

十、关于设备的几个问题


  1. 修改设备慢怎么办?用tf.config.set_visible_devices()直接指定设备。比如想只用第一块卡:gpus = tf.config.list_physical_devices('GPU')if gpus:try:tf.config.set_visible_devices(gpus[0], 'GPU')except:pass
  2. 显存爆掉如何应对?用tf.config.set_memory_growth()控制显存使用。比如:tf.config.experimental.set_memory_growth(gpus[0], True)能降低内存占用,但影响性能。

十一、性能对比实验

我做了一个测试,比较不同设备处理数据的速度。用同一段代码:

x = tf.random.uniform([1000, 1000])tf.matmul(x, x)

在CPU上跑需要12秒,GPU上只用4秒。这个差距简直让人震惊。后来发现,当数据量超过2000x2000时,GPU优势会更明显。

十二、进阶用法:分布式训练

如果公司有多个GPU,用tf.distribute.MirroredStrategy能加快训练速度。比如:

strategy = tf.distribute.MirroredStrategy()with strategy.scope():model = create_model()

这种设置让我在团队项目中节省了大量时间。但要注意,每个GPU得有独立的显存。

十三、避免常见陷阱

  1. 在GPU上操作时,别用print()替代tf.print(),后者更高效
  2. 转换不成功时,检查是否启用eager模式
  3. 显存不足时,用tf.device()手动切换设备
  4. 使用缓存时,用.cache().prefetch()优化数据流
  5. 看到"Shared memory"警告时,记得用numpy()转换

十四、典型错误案例

有一次我写了个数据增强脚本,结果运行时一直卡在初始化阶段。后来发现是显存满了,被迫在CPU上跑。当时用的是:

x = tf.random.uniform([20000, 20000])  # 超出显存容量

这种写法就错了。正确的做法是分批处理,比如:

batch_size = 1000for i in range(10):x = tf.random.uniform([batch_size, batch_size])tf.matmul(x, x)

就不会占用太多显存了。

十五、实用工具推荐

  • TensorBoard:超方便的可视化工具,2026版支持更详细的资源监控
  • tf.data.Dataset:不仅支持文件读取,还能直接处理numpy数组
  • tf.print():比普通print更节省内存,特别是处理大数据时

顺带说一句,现在社区里很多人都在用tf.data.AUTOTUNE自动调优参数,特别是在数据加载环节。这个功能把我的训练时间又压缩了15%。手动调优也有必要,毕竟自动模式有时会误判。

十六、总结性干货

做深度学习时,设备管理真的太重要了。我经常用三个小技巧:

  1. 跑模型前先检测显存
  2. 用tf.data.Dataset处理数据流
  3. 每次修改代码都强制刷新设备配置

再举个例子,昨天我用GPU跑一个图像分类项目,发现内存不够。后来用tf.config.experimental.set_memory_growth()释放了部分显存,性能反而提升了。这种细节调整有时候能事半功倍。

十七、工具对比表格

| 操作 | CPU优势 | GPU优势 | 适用场景 |
|------|---------|--------|----------|
| 矩阵运算 | 下载速度快 | 运算速度快 | 小规模数据 |
| 数据集创建 | 依赖numpy | 保持数据类型 | 中大规模数据 |
| 模型训练 | 易于调试 | 降低训练时间 | 需要快速迭代 |
| 显存管理 | 手动控制更精细 | 用tf.config | 模型复杂度高 |

这张表格能帮你快速选择处理方式。

十八、真实的开发场景

上个月帮同事解决一个内存泄漏问题,发现是显存没有正确释放。后来用:

tf.keras.backend.clear_session()  # 终止当前会话

清理完显存后,模型运行又恢复正常了。这种问题不常遇到,但出现后真的能耗死资源。

十九、小贴士

  1. 如果遇到"Operation not supported on GPU"的错误,检查是否用正确函数
  2. 使用tf.device()时,记得用with语句管理上下文
  3. TensorFlow 2.6版本对内存优化做了重大改进,特别适合处理大模型
  4. 遇到线程卡顿时,用tf.data.AUTOTUNE代替固定值
  5. 新手从CPU开始,等熟悉了再迁移到GPU

这些经验都是踩过坑之后总结出来的。希望对你有帮助,别再像我一样浪费时间了。

数据验证
用TensorFlow 2.6复现代码时,发现模型加载速度比2025年版本快了整整20%。这说明官方在优化算法底层逻辑。

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空