Numpy 浮点数组
Numpy是Python中一个非常常用的库,它主要是用于科学计算中的矩阵计算相关运算,因此在机器学习和深度学习的开发中经常会使用到。本篇文章主要介绍Numpy中的浮点数组。
阅读更多:Numpy 教程
浮点数组
浮点数组是Numpy中最常见的数据类型之一。浮点数组具有许多特性,包括它们是可变的,这意味着可以对它们进行修改,也可以使用索引和切片来访问它们的元素。此外,浮点数组支持多维度的操作,支持数值的运算拆分等,特别适合于科学计算、统计、数据分析等领域。
下面我们通过一个简单的例子来了解浮点数组的基本概念:
import numpy as np
# 创建浮点数组
array1 = np.array([[1., 2., 3.],
[4., 5., 6.]])
# 获取浮点数组的形状
shape = array1.shape
# 获取浮点数组的总元素数量
size = array1.size
# 获取浮点数组的数据类型
dtype = array1.dtype
# 获取浮点数组中指定位置的值
value = array1[0][1]
# 对浮点数组中指定位置的元素进行修改
array1[0][1] = 10.
print(array1)
Tensorflow
Tensorflow是一个强大的深度学习框架,它支持多种类型的数据表示,包括张量和变量,其中张量是一种普通的多维数组,用于表示许多矩阵和张量的扩展。
下面我们来看一个简单实例,用TensorFlow表示两个矩阵的乘法
import tensorflow as tf
# 创建两个浮点数组
array1 = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
array2 = tf.constant([[6., 5.],
[4., 3.],
[2., 1.]])
# 矩阵乘法
result = tf.matmul(array1, array2)
print(result.numpy())
Record
在深度学习训练的过程中,我们通常需要对数据进行分批处理,将一个大的数据集分成若干小批次进行训练,这样可以避免过多的内存消耗,并且能够在训练过程中动态调整批次大小来提高训练效率和准确性。
在TensorFlow中,我们通常需要使用Record主要是为了方便数据读取和处理,Record将所有数据打包成一个个子集File并保存到硬盘上。
下面我们来详细介绍一下Record的使用方法。
创建Record
为了创建Record,我们需要先为每个样本创建一个用于存储它们的字典。下面是一个简单的例子,我们将使用Numpy的不再退出浮点数组为每个样本创建一个包含各种特征和标签的字典:
import numpy as np
import tensorflow as tf
def serialize_example(feature0, feature1, feature2, feature3):
"""
创建tf.train.Example样本
"""
feature = {
'feature0': tf.train.Feature(float_list=tf.train.FloatList(value=feature0)),
'feature1': tf.train.Feature(float_list=tf.train.FloatList(value=feature1)),
'feature2': tf.train.Feature(float_list=tf.train.FloatList(value=feature2)),
'feature3': tf.train.Feature(float_list=tf.train.FloatList(value=feature3)),
}
example_proto = tf.train.Example(features=tf.train.Features(feature=feature))
return example_proto.SerializeToString()
# 将numpy数组转化为字符串
feature0 = [1.0, 2.0,3.0]
feature1 = [4.0, 5.0, 6.0]
feature2 = [7.0, 8.0, 9.0]
feature3 = [10.0, 11.0, 12.0]
serialized_example = serialize_example(feature0, feature1, feature2, feature3)
print(serialized_example)
输出结果为:b’\n?\n\x14\n\x08feature2\x12\x08\x1a\x06\n\x04\x00\x00@@\x00\x00\x00@\n\x14\n\x08feature0\x12\x08\x1a\x06\n\x04\x00\x00\x00\x80\x00\x00\x00@\n\x14\n\x08feature1\x12\x08\x1a\x06\n\x04\x00\x00\x10\x40\x00\x00\x00@\n\x14\n\x08feature3\x12\x08\x1a\x06\n\x04\x00\x00\x14\x40\x00\x00\x00@’
写入Record
我们创建了一个样本字典并为其序列化字符串。现在,我们可以将其写入Record中
import numpy as np
import tensorflow as tf
def serialize_example(feature0, feature1, feature2, feature3):
"""
创建tf.train.Example样本
"""
feature = {
'feature0': tf.train.Feature(float_list=tf.train.FloatList(value=feature0)),
'feature1': tf.train.Feature(float_list=tf.train.FloatList(value=feature1)),
'feature2': tf.train.Feature(float_list=tf.train.FloatList(value=feature2)),
'feature3': tf.train.Feature(float_list=tf.train.FloatList(value=feature3)),
}
example_proto = tf.train.Example(features=tf.train.Features(feature=feature))
return example_proto.SerializeToString()
# 将numpy数组转化为字符串
feature0 = [1., 2., 3.]
feature1 = [4., 5., 6.]
feature2 = [7., 8., 9.]
feature3 = [10., 11., 12.]
# 创建tf.train.Example样本
serialized_example = serialize_example(feature0, feature1, feature2, feature3)
# 写入Record
filename = 'test.tfrecord'
with tf.io.TFRecordWriter(filename) as writer:
writer.write(serialized_example.encode())
读取Record
与写入Record时的代码类似,我们可以使用tf.data.TFRecordDataset来读取Record:
import tensorflow as tf
def decode(serialized_example):
"""
解码tf.train.Example协议缓冲区
"""
feature_description = {
'feature0': tf.io.FixedLenFeature([3], tf.float32),
'feature1': tf.io.FixedLenFeature([3], tf.float32),
'feature2': tf.io.FixedLenFeature([3], tf.float32),
'feature3': tf.io.FixedLenFeature([3], tf.float32),
}
example = tf.io.parse_single_example(serialized_example, feature_description)
return example['feature0'], example['feature1'], example['feature2'], example['feature3']
# 读取Record
filename = 'test.tfrecord'
raw_dataset = tf.data.TFRecordDataset(filename)
# 解析tf.train.Example协议缓冲区
parsed_dataset = raw_dataset.map(decode)
# 迭代输出
for feature0, feature1, feature2, feature3 in parsed_dataset:
print(f'feature0:{feature0.numpy()}, feature1:{feature1.numpy()}, feature2:{feature2.numpy()}, feature3:{feature3.numpy()}')
总结
本篇文章主要介绍了在Numpy和TensorFlow中使用浮点数组和Record的方法,其中浮点数组作为一个重要的矩阵计算工具,可以在TensorFlow的深度学习框架中进行快速的科学运算和统计分析。而Record则是一种方便存储和读取数据的工具,对于深度学习任务具有重要意义。