【昇思大模型平台体验篇】day2-10 张量 Tensor

张量 Tensor

张量个人理解就是矩阵,在工程上平台实现了对这个类型的各种先行计算,方便模型构建和训练


创建张量

张量的创建方式有多种,构造张量时,支持传入Tensor、float、int、bool、tuple、list和numpy.ndarray类型。


张量的属性

张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。

  1. 形状(shape):Tensor的shape,是一个tuple。
  2. 数据类型(dtype):Tensor的dtype,是MindSpore的一个数据类型。
  3. 单个元素大小(itemsize): Tensor中每一个元素占用字节数,是一个整数。
  4. 占用字节数量(nbytes): Tensor占用的总字节数,是一个整数。
  5. 维数(ndim): Tensor的秩,也就是len(tensor.shape),是一个整数。
  6. 元素个数(size): Tensor中所有元素的个数,是一个整数。
  7. 每一维步长(strides): Tensor每一维所需要的字节数,是一个tuple。

x = Tensor(np.array([[1, 2], [3, 4]]), mindspore.int32)

print("x_shape:", x.shape)
print("x_dtype:", x.dtype)
print("x_itemsize:", x.itemsize)
print("x_nbytes:", x.nbytes)
print("x_ndim:", x.ndim)
print("x_size:", x.size)
print("x_strides:", x.strides)

x_shape: (2, 2)
x_dtype: Int32
x_itemsize: 4
x_nbytes: 16
x_ndim: 2
x_size: 4
x_strides: (8, 4)


张量索引

Tensor索引与Numpy索引类似,索引从0开始编制,负索引表示按倒序编制,冒号:...用于对数据进行切片。

tensor = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))

print("First row: {}".format(tensor[0]))
print("value of bottom right corner: {}".format(tensor[1, 1]))
print("Last column: {}".format(tensor[:, -1]))
print("First column: {}".format(tensor[..., 0]))



张量运算

张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和NumPy的使用方式类似,下面介绍其中几种操作。

普通算术运算有:加(+)、减(-)、乘(*)、除(/)、取模(%)、整除(//)。

x = Tensor(np.array([1, 2, 3]), mindspore.float32)
y = Tensor(np.array([4, 5, 6]), mindspore.float32)

output_add = x + y
output_sub = x - y
output_mul = x * y
output_div = y / x
output_mod = y % x
output_floordiv = y // x

print("add:", output_add)
print("sub:", output_sub)
print("mul:", output_mul)
print("div:", output_div)
print("mod:", output_mod)
print("floordiv:", output_floordiv)

add: [5. 7. 9.]
sub: [-3. -3. -3.]
mul: [ 4. 10. 18.]
div: [4. 2.5 2. ]
mod: [0. 1. 0.]
floordiv: [4. 2. 2.]


concat将给定维度上的一系列张量连接起来。

data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
output = ops.concat((data1, data2), axis=0)

print(output)
print("shape:\n", output.shape)

stack则是从另一个维度上将两个张量合并起来。

data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
output = ops.stack([data1, data2])

print(output)
print("shape:\n", output.shape)

Tensor Numpy转换


Tensor可以和NumPy进行互相转换。

Tensor转换为NumPy
与张量创建相同,使用 Tensor.asnumpy() 将Tensor变量转换为NumPy变量。

t = Tensor([1.0, 1.0, 1.0, 1.0, 1.0])
print(f"t: {t}", type(t))
n = t.asnumpy()
print(f"n: {n}", type(n))

NumPy转换为Tensor
使用Tensor()将NumPy变量转换为Tensor变量。

n = np.ones(5)
t = Tensor.from_numpy(n)
np.add(n, 1, out=n)
print(f"n: {n}", type(n))
print(f"t: {t}", type(t))

稀疏张量

稀疏张量是一种特殊张量,其中绝大部分元素的值为零。

在某些应用场景中(比如推荐系统、分子动力学、图神经网络等),数据的特征是稀疏的,若使用普通张量表征这些数据会引入大量不必要的计算、存储和通讯开销。这时就可以使用稀疏张量来表征这些数据。

MindSpore现在已经支持最常用的CSR和COO两种稀疏数据格式。

常用稀疏张量的表达形式是<indices:Tensor, values:Tensor, shape:Tensor>。其中,indices表示非零下标元素, values表示非零元素的值,shape表示的是被压缩的稀疏张量的形状。在这个结构下,我们定义了三种稀疏张量结构:CSRTensor、COOTensor和RowTensor。


CSRTensor
CSR(Compressed Sparse Row)稀疏张量格式有着高效的存储与计算的优势。其中,非零元素的值存储在values中,非零元素的位置存储在indptr(行)和indices(列)中。各参数含义如下:

  1. indptr: 一维整数张量, 表示稀疏数据每一行的非零元素在values中的起始位置和终止位置, 索引数据类型支持int16、int32、int64。
  2. indices: 一维整数张量,表示稀疏张量非零元素在列中的位置, 与values长度相等,索引数据类型支持int16、int32、int64。
  3. values: 一维张量,表示CSRTensor相对应的非零元素的值,与indices长度相等。
  4. shape: 表示被压缩的稀疏张量的形状,数据类型为Tuple,目前仅支持二维CSRTensor。

indptr = Tensor([0, 1, 2])
indices = Tensor([0, 1])
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (2, 4)

# Make a CSRTensor
csr_tensor = CSRTensor(indptr, indices, values, shape)

print(csr_tensor.astype(mindspore.float64).dtype)

COOTensor


COO(Coordinate Format)稀疏张量格式用来表示某一张量在给定索引上非零元素的集合,若非零元素的个数为N,被压缩的张量的维数为ndims。各参数含义如下:

  1. indices: 二维整数张量,每行代表非零元素下标。形状:[N, ndims], 索引数据类型支持int16、int32、int64。
  2. values: 一维张量,表示相对应的非零元素的值。形状:[N]。
  3. shape: 表示被压缩的稀疏张量的形状,目前仅支持二维COOTensor。
indices = Tensor([[0, 1], [1, 2]], dtype=mindspore.int32)
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (3, 4)

# Make a COOTensor
coo_tensor = COOTensor(indices, values, shape)

print(coo_tensor.values)
print(coo_tensor.indices)
print(coo_tensor.shape)
print(coo_tensor.astype(mindspore.float64).dtype)  # COOTensor to float64
<think>好的,用户想找关于LSTM模型的实际应用案例或教程,特别是带有示例代码的实战内容。首先,我需要回忆一下LSTM的常见应用领域,比如时间序列预测、自然语言处理等。然后,结合用户提供的三个引用,看看有没有可以直接用上的信息。 引用[1]提到了LSTM模型在自然语言处理中的应用,并展示了一个PyTorch的模型类定义。引用[2]是Keras构建LSTM模型的代码,用于编译和拟合,可能是时间序列预测。引用[3]是PyTorch的训练和应用示例,涉及模拟数据处理。 用户需要的是实战应用案例,所以应该分不同场景给出例子。可能需要时间序列预测、文本分类、序列生成这三个方向,每个方向分别用PyTorch和Keras/TensorFlow实现,这样用户可以根据熟悉的框架选择。同时,要注意代码的格式正确,比如使用正确的缩进和语法,并解释代码的关键部分。 需要检查代码是否存在错误,比如输入输出的维度是否匹配,模型结构是否正确。比如在时间序列预测中,LSTM层的return_sequences设置是否正确,全连接层是否适配。在文本分类中,Embedding层和LSTM层的参数是否合理。 另外,用户可能需要知道这些应用的具体步骤,比如数据预处理、模型构建、训练和预测,所以在每个示例中需要简要说明流程。同时,确保引用的内容被正确标注,比如引用[1]、[2]、[3]对应的部分。 还要考虑生成相关问题,可能涉及模型调参、优化方法、应用场景比较等,这样用户能进一步深入。需要确保问题与提供的答案相关,并且有引导性。 最后,检查回答是否符合系统级指令:行内公式用$,独立公式单独成段,中文回答,正确引用标记,结构清晰。虽然用户的问题中没有数学公式,但如果有相关内容需要按规则处理。</think>### LSTM模型实战应用案例与代码示例 LSTM(长短期记忆网络)在时间序列预测、文本分类和序列生成等领域有广泛应用。以下是三个典型场景的实战案例及代码实现。 --- #### **1. 时间序列预测(基于Keras/TensorFlow)** **应用场景**:股票价格预测、气象数据预测等 ```python # 引用[2]示例代码扩展 import numpy as np from keras.models import Sequential from keras.layers import LSTM, Dense # 数据预处理(示例:生成正弦波时间序列) def generate_data(seq_length=100): x = np.linspace(0, 10*np.pi, seq_length) y = np.sin(x) X = [y[i:i+5] for i in range(len(y)-5)] # 用前5步预测下一步 y = [y[i+5] for i in range(len(y)-5)] return np.array(X).reshape(-1,5,1), np.array(y) X_train, y_train = generate_data() # 构建LSTM模型 model = Sequential() model.add(LSTM(50, return_sequences=True, input_shape=(5, 1))) # 输入形状为(时间步长, 特征数) model.add(LSTM(50)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mse') # 训练模型 model.fit(X_train, y_train, epochs=50, batch_size=32) # 预测示例 test_input = np.array([0.1, 0.2, 0.3, 0.4, 0.5]).reshape(1,5,1) prediction = model.predict(test_input) print(f"预测结果:{prediction[0][0]:.4f}") # 输出下一步的预测值 ``` **关键点**: - 数据需转换为三维张量(样本数, 时间步长, 特征数) - 最后一层全连接层输出维度与预测目标维度一致[^2] --- #### **2. 文本分类(基于PyTorch)** **应用场景**:情感分析、新闻分类 ```python # 引用[1][3]示例代码扩展 import torch import torch.nn as nn from torchtext.data import get_tokenizer from torchtext.vocab import build_vocab_from_iterator # 模拟数据(示例:情感分类文本) texts = ["I love this movie!", "This is terrible.", "Great film!"] labels = [1, 0, 1] # 1=正面, 0=负面 # 文本向量化 tokenizer = get_tokenizer("basic_english") vocab = build_vocab_from_iterator([tokenizer(text) for text in texts], specials=["<unk>"]) vocab.set_default_index(vocab["<unk>"]) # 定义LSTM模型类 class TextClassifier(nn.Module): def __init__(self, vocab_size, embed_dim=64, hidden_size=32): super().__init__() self.embedding = nn.Embedding(vocab_size, embed_dim) self.lstm = nn.LSTM(embed_dim, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, 1) def forward(self, x): x = self.embedding(x) _, (h_n, _) = self.lstm(x) return torch.sigmoid(self.fc(h_n[-1])) # 训练示例 model = TextClassifier(len(vocab)) criterion = nn.BCELoss() optimizer = torch.optim.Adam(model.parameters()) # 将文本转换为索引序列 inputs = [torch.tensor(vocab(tokenizer(text))) for text in texts] inputs = torch.nn.utils.rnn.pad_sequence(inputs, batch_first=True) # 训练循环 for epoch in range(100): outputs = model(inputs).squeeze() loss = criterion(outputs, torch.FloatTensor(labels)) optimizer.zero_grad() loss.backward() optimizer.step() if epoch % 20 == 0: print(f"Epoch {epoch}, Loss: {loss.item():.4f}") # 预测示例 test_text = "This is awesome!" test_tensor = torch.tensor(vocab(tokenizer(test_text))).unsqueeze(0) print(f"预测概率:{model(test_tensor).item():.4f}") # 输出接近1表示正面 ``` **关键点**: - 文本需通过词嵌入转换为向量[^1] - LSTM最后一层隐藏状态用于分类[^3] --- #### **3. 序列生成(基于Keras)** **应用场景**:诗歌生成、音乐创作 ```python from keras.layers import LSTM, Dense from keras.models import Sequential import numpy as np # 数据预处理(示例:生成莎士比亚风格文本) text = "shall i compare thee to a summer's day? " chars = sorted(list(set(text))) char_to_idx = {c:i for i,c in enumerate(chars)} # 创建输入-输出序列 sequence_length = 20 X = [] y = [] for i in range(len(text)-sequence_length): X.append([char_to_idx[c] for c in text[i:i+sequence_length]]) y.append(char_to_idx[text[i+sequence_length]]) X = np.reshape(X, (len(X), sequence_length, 1)) # 转换为三维张量 y = np.eye(len(chars))[y] # One-hot编码 # 构建LSTM模型 model = Sequential() model.add(LSTM(128, input_shape=(sequence_length, 1))) model.add(Dense(len(chars), activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam') # 训练模型 model.fit(X, y, epochs=100, batch_size=16) # 生成文本示例 def generate_text(seed_str, length=50): for _ in range(length): x = np.array([char_to_idx[c] for c in seed_str[-sequence_length:]]) x = x.reshape(1, sequence_length, 1) pred = model.predict(x, verbose=0) next_char = chars[np.argmax(pred)] seed_str += next_char return seed_str print(generate_text("shall i ")) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小范今天学Java了嘛?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值