多维下numpy实现torch下的log_softmax

一维情况下,来源:link
import numpy as np
import torch
import torch.nn.functional as F

def my_softmax(x):
    exp_x = np.exp(x)
    return exp_x/np.sum(exp_x)

def my_log_softmax1(x):
    return np.log(my_softmax(x))

def my_log_softmax2(x):
    return x-np.log(np.sum(np.exp(x)))

x = np.array([1.5, 2.2, 3.1, 0.9, 1.2, 1.7])
xt = torch.from_numpy(x)

print('F.softmax:', F.log_softmax(xt))
print('my_softmax', my_log_softmax1(x))
print('my_softmax', my_log_softmax2(x))
二维情况下
import numpy as np
import torch
import torch.nn.functional as F


def my_log_softmax2(x, axis):
    return x - np.log(np.sum(np.exp(x), axis=axis))[..., np.newaxis]


x = np.array([[1.5, 2.2, 3.1, 0.9, 1.2, 1.7], [1, 2, 3, 4, 5, 6]])
xt = torch.from_numpy(x)

torch_res = F.log_softmax(xt)
np_res = my_log_softmax2(x)
np.testing.assert_equal(torch_res.numpy(), np_res)
### Pandas、NumPy、Scikit-learn、TensorFlow 和 PyTorch 的功能对比及应用场景 #### 数据操作与分析工具:Pandas 和 NumPy Pandas 是一种强大的 Python 库,主要用于数据处理和分析。它提供高性能的数据结构如 DataFrame 来存储表格型数据,并支持复杂的数据操作,例如过滤、分组汇总等。 NumPy 则专注于数值计算,提供了多维数组对象 ndarray 及大量用于数组运算的函数。对于科学计算而言,NumPy 提供的基础矩阵运算是不可或缺的一部分。由于其高效的内存管理和优化过的 C 实现底层算法,在大规模数据集上的表现尤为出色[^2]。 ```python import numpy as np array = np.array([[1, 2], [3, 4]]) print(array) import pandas as pd dataframe = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) print(dataframe) ``` #### 经典机器学习框架:Scikit-learn Scikit-learn 构建于 SciPy 生态之上,是一个简单高效的数据挖掘和数据分析工具。该库实现了多种经典的监督式和非监督式的机器学习方法,比如线性回归、决策树和支持向量机等;同时还包含了特征工程模块,可以方便地完成诸如标准化、独热编码等工作。此外,通过内置的各种评估指标来衡量模型性能也是 Scikit-learn 的一大特色之一。 ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier X, y = load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train, y_train) accuracy = knn.score(X_test, y_test) print(f'Accuracy: {accuracy:.2f}') ``` #### 深度学习平台:TensorFlow 和 PyTorch 两者都是目前最流行的两个开源深度学习框架。虽然都可用于构建复杂的神经网络架构并训练大型图像识别或自然语言处理任务中的参数,但在设计理念和发展方向上存在差异: - **TensorFlow** 起源于 Google Brain 团队的研究成果,具有丰富的官方文档和技术社区资源。除了核心 API 外,还配套有 Estimator 接口简化高层级应用开发流程,Keras 子项目进一步降低了入门门槛。更重要的是,借助 TensorBoard 工具可直观展示整个计算图及其运行状态变化过程,便于调试监控[^1]。 - **PyTorch** 凭借动态图机制(Dynamic Computational Graph),允许开发者更加灵活自由地定义前向传播路径,尤其适合科研探索阶段频繁调整试验方案的情况。近年来随着版本迭代更新不断加强分布式训练能力,使得在云端部署大规模集群成为可能。另外,Fastai 等第三方扩展包也为提高生产力做出了贡献[^4]。 ```python import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5) import torch import torchvision.transforms as transforms transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True, num_workers=2) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') class Net(torch.nn.Module): def __init__(self): super().__init__() self.fc1 = torch.nn.Linear(784, 128) self.dropout = torch.nn.Dropout(p=0.2) self.fc2 = torch.nn.Linear(128, 10) def forward(self, x): x = F.relu(self.fc1(x)) x = self.dropout(x) x = F.log_softmax(self.fc2(x), dim=-1) return x net = Net().to(device) criterion = torch.nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters()) for epoch in range(5): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data[0].view(-1, 784).to(device), data[1].to(device) optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('[%d] loss: %.3f' % (epoch + 1, running_loss / len(trainloader))) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值