当前位置: 首页 > news >正文

‌机器学习快速入门--0算力起步实践篇

在学习人工智能的过程中,显卡是必不可少的工具,但它的成本较高且更新换代速度很快。那么,没有GPU的情况下如何学习人工智能呢?以下是针对普通电脑与有算力环境分离的学习规划方案,尤其适合前期无GPU/云计算资源的学习者:


一、普通电脑学习阶段(0算力需求)

1. 基础知识与轻量级实践
  • 数学基础
    • 线性代数:矩阵乘法(手工计算 + NumPy实现)

例1:NumPy数据处理

import numpy as np
# 创建一个NumPy数组
numpy_array = np.array([1, 2, 3, 4, 5])
# 使用NumPy函数对数组进行操作
squared = np.square(numpy_array)
print("NumPy Array Squared:", squared)

例2:Python原生数据处理

# 创建一个Python原生列表
python_list = [1, 2, 3, 4, 5]
# 使用Python循环对列表进行操作
squared_list = []
for num in python_list:squared_list.append(num ** 2)
print("Python List Squared:", squared_list)

例3:用NumPy库做矩阵运算

import numpy as np  # 创建两个二维矩阵  
matrix_a = np.array([[1, 2], [3, 4]])  
matrix_b = np.array([[5, 6], [7, 8]])  # 矩阵乘法  
result_multiply = np.dot(matrix_a, matrix_b)  
print("Matrix Multiplication:")  
print(result_multiply)  # 矩阵转置  
result_transpose_a = matrix_a.T  
result_transpose_b = np.transpose(matrix_b)  
print("\nMatrix A Transpose:")  
print(result_transpose_a)  
print("\nMatrix B Transpose:")  
print(result_transpose_b)  # 矩阵求逆(需要矩阵是可逆的)  
result_inverse_a = np.linalg.inv(matrix_a)  
print("\nMatrix A Inverse:")  
print(result_inverse_a)  

例4:用NumPy库对二维数组进行重组

import numpy as np  # 创建一个一维数组  
original_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])  # 将一维数组重组为二维数组(3x3矩阵)  
reshaped_array = original_array.reshape(3, 3)  
print("Reshaped Array (3x3 matrix):")  
print(reshaped_array)  # 将二维数组重组为一维数组,并指定新数组的顺序(C顺序或F顺序)  
# C顺序是按行读取元素,F顺序是按列读取元素  
c_order_flattened = reshaped_array.flatten('C')  
f_order_flattened = reshaped_array.flatten('F')  print("\nFlattened Array (C Order):")  
print(c_order_flattened)  print("\nFlattened Array (F Order):")  
print(f_order_flattened)  # 使用transpose()函数交换数组的轴  
transposed_array = reshaped_array.transpose()  
print("\nTransposed Array:")  
print(transposed_array)  
  • 概率统计:贝叶斯公式推导(Python实现朴素贝叶斯分类器)
  • 编程核心
    • Python基础语法:函数、类、文件操作
    • 数据处理库:Pandas(数据清洗)、Matplotlib(可视化)

以下是 Pandas 库的一些主要特点和功能:

  1. 数据结构:
    1. DataFrame:类似于电子表格的二维数据结构,包含了多行多列的数据,可以方便地对数据进行操作和分析。
    2. Series:一维标记数组,常用于表示一列数据。
  2. 数据读取和写入:支持多种数据格式的读取和写入,如 CSV、Excel、SQL 数据库等。提供了方便的函数和方法来加载、保存和处理数据。
  3. 数据选择和过滤:使用索引和标签来选择数据的特定行和列。支持基于条件的过滤和筛选操作。
  4. 数据清洗和预处理:提供了对缺失值、重复值的处理方法。可以进行数据类型转换、填充缺失值等操作。
  5. 数据聚合和分组:能够对数据进行聚合计算,如求和、平均值、计数等。支持根据特定列进行分组,并对每个组进行聚合操作。
  6. 数据连接和合并:可以将多个数据结构进行连接或合并,如按列或行进行合并。
  7. 时间序列处理:提供了专门的时间序列功能,如日期和时间的处理、时间间隔的计算等。
  8. 数据可视化:与其他可视化库(如 Matplotlib、Seaborn)集成,方便进行数据可视化。
  9. 数据分析和统计:提供了各种统计函数和指标的计算,如描述性统计、相关性分析等。

例5:假设我们有一个名为data.csv的CSV文件,内容如下:

Name,Age,City  
Alice,25,New York  
Bob,30,Los Angeles  
Charlie,35,Chicago  
David,40,San Francisco

用Pandas库来读取、处理数据

import pandas as pd  # 读取CSV文件到DataFrame  
df = pd.read_csv('data.csv')  # 查看前几行数据  
print(df.head())  # 数据清洗:将'Age'列中的字符串转换为整数  
df['Age'] = df['Age'].astype(int)  # 数据转换:添加一列'Is_Adult',判断年龄是否大于等于18  
df['Is_Adult'] = df['Age'] >= 18  # 数据分析:计算每个城市的成年人数  
adult_counts = df.groupby('City')['Is_Adult'].sum()  
print(adult_counts)  # 数据分析:找出年龄最大的人  
oldest_person = df.loc[df['Age'].idxmax()]  
print(oldest_person)  # 数据分析:按年龄从大到小排序  
sorted_df = df.sort_values('Age', ascending=False)  
print(sorted_df)

例6:用Pandas库做数据聚合和分组

import pandas as pd
# 创建一个扩展后的学生成绩DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Henry'],'Gender': ['F', 'M', 'M', 'M', 'F', 'M', 'F', 'M'],'Subject': ['Math', 'Math', 'Math', 'Math', 'Science', 'Science', 'Science', 'Science'],'Score': [85, 90, 78, 92, 88, 76, 95, 89]
}df = pd.DataFrame(data)
print("原始数据:")
print(df)# 按姓名和科目分组,计算每个组的平均分
grouped = df.groupby(['Name', 'Subject'])['Score'].mean()# 将结果转换为DataFrame以便更好地显示
result = grouped.reset_index()
print("按姓名和科目分组后的平均分:")
print(result)# 进一步分析:计算每个学生的平均成绩
student_avg_scores = df.groupby('Name')['Score'].mean()
print("\n每个学生的平均成绩:")
print(student_avg_scores)# 进一步分析:计算每个科目的平均成绩
subject_avg_scores = df.groupby('Subject')['Score'].mean()
print("\n每个科目的平均成绩:")
print(subject_avg_scores)

‌输出结果

按姓名和科目分组后的平均分:
      Name  Subject  Score
0    Alice     Math   85.0
1      Bob     Math   90.0
2  Charlie     Math   78.0
3    David     Math   92.0
4      Eve  Science   88.0
5    Frank  Science   76.0
6    Grace  Science   95.0
7    Henry  Science   89.0
 
 
每个学生的平均成绩:
Name
Alice      85.0
Bob        90.0
Charlie    78.0
David      92.0
Eve        88.0
Frank      76.0
Grace      95.0
Henry      89.0
Name: Score, dtype: float64
 
 
每个科目的平均成绩:
Subject
Math       86.25
Science    87.00
Name: Score, dtype: float64

用Pandas库做数据可视化

这个例子中,我们构造了一个数据集,然后用Pandas库生成柱状图和折线图,然后用matplotlib库完成画图。

import pandas as pd
import matplotlib.pyplot as plt
# 创建一个简单的数据集
data = {'Year': [2015, 2016, 2017, 2018, 2019, 2020],'Sales': [100, 150, 70, 200, 180, 220],'Profits': [50, 60, 40, 80, 70, 90]
}# 将数据转换为Pandas DataFrame
df = pd.DataFrame(data)# 绘制柱状图
df.plot(kind='bar', x='Year', y=['Sales', 'Profits'], legend=True, title='Sales and Profits Over Years')
plt.xlabel('Year')
plt.ylabel('Amount')
plt.show()# 绘制折线图
df.plot(kind='line', x='Year', y=['Sales', 'Profits'], legend=True, title='Sales and Profits Over Years (Line Chart)')
plt.xlabel('Year')
plt.ylabel('Amount')
plt.show()

输出结果

 

Matplotlib 是一个用于创建数据可视化的 Python 库。它提供了广泛的绘图选项,包括线图、散点图、柱状图、饼图、直方图等等,可以用于数据分析、科学计算和统计可视化等领域。

以下是 Matplotlib 的一些主要特点和功能:

  1. 多样化的绘图类型:Matplotlib 支持多种类型的图形,如二维和三维图形,以及各种图表样式,使得用户可以根据数据特点选择合适的可视化方式。
  2. 灵活的坐标轴和刻度控制:用户可以自定义坐标轴范围、刻度标签、网格线等,以满足具体的可视化需求。
  3. 数据标注和图例:Matpltolib 允许用户添加文本标注、图例、标题等元素,以便更好地解释和说明图形。
  4. 颜色和样式设置:可以通过设置颜色、线条样式、标记等来美化图形,使其更具吸引力和可读性。
  5. 子图和布局:Matplotlib 支持在同一图形中创建多个子图,并可以灵活地控制子图的布局和排列方式。
  6. 数据交互:可以通过鼠标点击、悬停等交互方式获取图形上的数据信息,增强数据探索的能力。
  7. 导出图形:图形可以以多种格式导出,如 PNG、JPEG、SVG 等,方便与其他文档或报告进行集成。

例1:用Matplotlib库画二维、三维图

这个例子中,我们简单画了一个二维正弦曲线,和一个三维散点图。

import matplotlib.pyplot as plt
import numpy as np# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)# 使用Matplotlib绘制线形图
plt.plot(x, y)# 设置图表标题和坐标轴标签
plt.title('2D Line Plot')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
# 显示图表
plt.show()# 创建数据
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)# 创建一个3D坐标轴
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 使用Matplotlib绘制三维散点图
ax.scatter(x, y, z, c='r', marker='o')# 设置图表标题和坐标轴标签
ax.set_title('3D Scatter Plot')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
ax.set_zlabel('Z Axis')
# 显示图表
plt.show()

例2:用Matplotlib库画图、添加标注、设置颜色样式

这个例子中,我们画了两条直线,一条是普通直线,一条设置了颜色和线条样式,然后在线条上标注了五个点。

import matplotlib.pyplot as plt# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
labels = ['A', 'B', 'C', 'D', 'E']# 绘制线图
plt.plot(x, y, label='Line')
# 设置颜色和线条样式
plt.plot(x, y, color='blue', linewidth=3, linestyle='--', label='Dashed Line')# 添加数据标注
for i in range(len(x)):plt.annotate(labels[i], (x[i], y[i]), fontsize=12)# 添加图例
plt.legend()
# 添加标题和坐标轴标签
plt.title('Data Annotation and Color Style Example')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
# 显示图形
plt.show()

  • 本地工具‌:Jupyter Notebook/VSCode
2. 经典机器学习算法
  • Scikit-learn全流程

Scikit-learn是一个基于Python的开源机器学习库,它建立在NumPy、SciPy和matplotlib等基础工具包之上。Scikit-learn最初是由David Cournapeau在Google Summer of Code项目中开发的,后来由其他开发人员进行了重写和扩展。

Scikit-learn库提供了简单高效的数据挖掘和数据分析工具,可以在各种环境中重复使用。它包含众多顶级机器学习算法,主要有六大基本功能,分别是分类、回归、聚类、数据降维、模型选择和数据预处理。Scikit-learn具有非常活跃的用户社区,基本上其所有的功能都有非常详尽的文档供用户查阅。

以下是对 Scikit-learn 库的一些介绍:

  1. 丰富的算法和模型:Scikit-learn 包含了各种常见的机器学习算法,如线性回归、逻辑回归、决策树、随机森林、支持向量机、聚类、朴素贝叶斯等。这些算法可以用于分类、回归、聚类、异常检测等不同的任务。
  2. 数据预处理:Scikit-learn 提供了一系列的数据预处理功能,例如特征缩放、标准化、缺失值处理、特征选择等。这些工具可以帮助你对数据进行清洗和准备,以便更好地适应不同的机器学习算法。
  3. 模型评估和选择:该库包含了多种模型评估指标和方法,如准确率、召回率、F1 分数等。它还提供了交叉验证等技术来对模型进行评估和调优,帮助你选择最佳的模型和超参数。
  4. 易于使用的接口:Scikit-learn 的 API 设计简洁直观,使得使用各种算法变得相对容易。它的模型通常具有一致的接口和参数,方便进行快速实验和比较不同算法的效果。
  5. 扩展性和兼容性:Scikit-learn 可以与其他数据分析库和框架很好地集成,如 Pandas、NumPy 和 Matplotlib。它也支持多种编程语言,如 Python。
  6. 广泛的应用和社区支持:Scikit-learn 在学术界和工业界都得到了广泛的应用,有大量的文档、教程和案例可供参考。同时,社区也非常活跃,你可以在网上找到许多关于 Scikit-learn 的讨论和解决方案。

例1:用Scikit-learn库训练线性回归模型

在这个例子中,我们首先加载了一个乳腺癌数据集。然后,我们将数据集划分为训练集和测试集。接下来,我们创建了一个线性回归模型,并使用训练集数据对模型进行拟合。最后,我们使用模型对测试集进行预测,并计算预测结果与真实结果之间的均方误差。

from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error# 加载数据集
breast_cancer = load_breast_cancer()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(breast_cancer.data, breast_cancer.target, test_size=0.2, random_state=42)# 创建线性回归模型
regression_model = LinearRegression()
# 拟合训练数据
regression_model.fit(X_train, y_train)# 在测试集上进行预测
y_pred = regression_model.predict(X_test)
# 计算均方误差(MSE)作为评估指标
mse = mean_squared_error(y_test, y_pred)
print("均方误差:", mse)

输出结果:

均方误差: 0.0641088624702944

例2:用Scikit-learn库做数据预处理

import numpy as np
from sklearn.preprocessing import OneHotEncoder,StandardScalerdata = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
category_feature = ['A', 'B', 'C']# 进行特征标准化和独热编码
scaler = StandardScaler()
encoder = OneHotEncoder(sparse=False)data_scaled = scaler.fit_transform(data)
category_feature = np.array(category_feature)
encoded_category_feature = encoder.fit_transform(category_feature.reshape(-1, 1))# 组合标准化和独热编码的结果
preprocessed_data = np.hstack((data_scaled, encoded_category_feature))
print(preprocessed_data)

输出结果:

[[-1.22474487 -1.22474487 -1.22474487  1.          0.          0.        ]
 [ 0.                  0.                  0.                  0.          1.          0.        ]
 [ 1.22474487  1.22474487  1.22474487  0.          0.          1.        ]]

例3:用Scikit-learn库训练模型并评估模型

在这个例子中,我们首先加载了鸢尾花数据集,并将其划分为训练集和测试集。然后,我们对数据进行了标准化处理,以消除特征之间的量纲差异。接下来,我们创建了一个SVM分类器,并用训练数据对其进行训练。

训练完成后,我们使用测试集对模型进行评估。评估指标包括准确率(accuracy)、混淆矩阵(confusion matrix)和分类报告(classification report)。这些指标提供了关于模型性能的不同方面的信息。

最后,我们使用交叉验证(cross-validation)来进一步评估模型的性能。交叉验证将数据集划分为多个子集,并在这些子集上多次训练和测试模型,以得到更可靠的评估结果。在这个例子中,我们使用了5折交叉验证(cv=5),并输出了每次迭代的分数以及平均分数。

通过不同维度的模型评估,我们可以看出Scikit-learn库有多么强大!

import numpy as np  
from sklearn import datasets  
from sklearn.model_selection import train_test_split, cross_val_score  
from sklearn.preprocessing import StandardScaler  
from sklearn.svm import SVC  
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report  # 加载鸢尾花数据集  
iris = datasets.load_iris()  
X = iris.data  
y = iris.target  # 划分数据集为训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  # 数据标准化  
scaler = StandardScaler()  
X_train = scaler.fit_transform(X_train)  
X_test = scaler.transform(X_test)  # 创建SVM分类器  
clf = SVC(kernel='linear', C=1, random_state=42)  # 训练模型  
clf.fit(X_train, y_train)  # 预测测试集  
y_pred = clf.predict(X_test)  # 评估模型  
accuracy = accuracy_score(y_test, y_pred)  
print(f"Accuracy: {accuracy}")  # 输出混淆矩阵  
cm = confusion_matrix(y_test, y_pred)  
print(f"Confusion Matrix:\n{cm}")  # 输出分类报告  
report = classification_report(y_test, y_pred)  
print(f"Classification Report:\n{report}")  # 交叉验证评估模型  
scores = cross_val_score(clf, X, y, cv=5)  
print(f"Cross-validation scores: {scores}")  
print(f"Cross-validation mean score: {np.mean(scores)}")

Accuracy: 0.9777777777777777
Confusion Matrix:
[[19  0  0]
 [ 0 12  1]
 [ 0  0 13]]
Classification Report:
              precision    recall  f1-score   support
 
 
           0       1.00      1.00      1.00        19
           1       1.00      0.92      0.96        13
           2       0.93      1.00      0.96        13
 
 
    accuracy                           0.98        45
   macro avg       0.98      0.97      0.97        45
weighted avg       0.98      0.98      0.98        45
 
 
Cross-validation scores: [0.96666667 1.         0.96666667 0.96666667 1.        ]
Cross-validation mean score: 0.9800000000000001

  • 使用CPU友好的算法:
    python Code

    # 逻辑回归示例(无需GPU) from sklearn.linear_model import LogisticRegression model = LogisticRegression(max_iter=1000) # 控制迭代次数 model.fit(X_train, y_train)

  • 推荐数据集:
    • 鸢尾花分类(150条数据)
    • 波士顿房价预测(506条数据)
3. 轻量级深度学习体验
  • 小模型训练技巧
    • 使用TensorFlow/PyTorch的CPTensorFlow是由Google Brain团队开发的一个开源软件库,主要用于机器学习和深度学习任务。TensorFlow的名字来自于张量(Tensor)和流(Flow),代表了一个数据流图中的数学运算操作,以及数据在这些操作之间的流动。

TensorFlow的基本概念包括:

  • 张量(Tensor):TensorFlow的基本数据类型,类似于多维数组。在TensorFlow中,所有的数据都通过张量来表示,包括输入、输出、权重等。
  • 计算图(Graph):定义了数据流图中的所有操作和数据依赖关系。它包括节点(Node)和边(Edge),节点代表了一种操作(如加法、乘法),边代表了数据流(如张量)。
  • 会话(Session):是TensorFlow执行计算图的环境,通过会话可以对计算图中的操作进行执行和求值。

TensorFlow的使用场景包括:

  • 图像识别:TensorFlow提供了卷积神经网络(CNN)等深度学习模型,可用于图像识别、目标检测等任务。
  • 自然语言处理:TensorFlow提供了循环神经网络(RNN)等模型,可用于语音识别、机器翻译等自然语言处理任务。
  • 数据分析:TensorFlow提供了各种机器学习算法,可用于数据分析、预测建模等任务。
  • 强化学习:TensorFlow提供了强化学习算法,可用于各种智能决策场景,如游戏AI、机器人控制等。

例1:TensorFlow神经元网络训练演示

本例中,我们首先加载了鸢尾花数据集,并将类别标签进行独热编码。然后,我们使用TensorFlow 的 Keras API 构建了一个简单的神经网络模型,包括两个密集连接层。通过划分训练集和测试集,我们可以训练模型并在测试集上进行评估。最后,打印出测试集上的损失和准确率。这个神经元网络比较简单,仅适合演示。

import tensorflow as tf
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target# 将类别进行独热编码
encoder = OneHotEncoder(sparse=False)
y_encoded = encoder.fit_transform(y.reshape(-1, 1))# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42)# 定义模型
model = tf.keras.Sequential([tf.keras.layers.Dense(64, activation='relu', input_shape=(4,)),tf.keras.layers.Dense(3, activation='softmax')
])# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs=50, validation_split=0.1)# 在测试集上进行评估
test_loss, test_accuracy = model.evaluate(X_test, y_test)
print("Test Loss:", test_loss)
print("Test Accuracy:", test_accuracy)

输出结果:

Test Loss: 0.4498146176338196
Test Accuracy: 0.8999999761581421

例2:用TensorFlow训练RNN神经元网络

本例演示TensorFLow训练复杂的RNN神经网络,为了充分展示RNN的记忆性特点,我们构建一个正弦曲线序列。在这个任务中,模型需要学习预测一个序列的下一个元素,该元素依赖于前面的几个元素。我们使用Keras构建的简单RNN模型的示例,用于预测正弦波序列中的下一个点。本例中,RNN模型将会学习识别正弦波的模式,并使用它的“记忆”来预测序列的下一个点。

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense# 生成正弦波数据
def generate_sine_wave(batch_size, n_steps):freq1, freq2, offsets1, offsets2 = np.random.rand(4, batch_size, 1)time = np.linspace(0, 1, n_steps)series = 0.5 * np.sin((time - offsets1) * (freq1 * 10 + 10))series += 0.2 * np.sin((time - offsets2) * (freq2 * 20 + 20))series += 0.1 * (np.random.rand(batch_size, n_steps) - 0.5)return series[..., np.newaxis].astype(np.float32)# 超参数
batch_size = 10000
n_steps = 50
n_features = 1# 生成训练数据
X_train, y_train = [], []
for _ in range(batch_size):x = generate_sine_wave(1, n_steps + 1)[0]X_train.append(x[:n_steps, :])y_train.append(x[n_steps, :])
X_train, y_train = np.array(X_train), np.array(y_train)
print(X_train.shape)# 构建RNN模型
model = Sequential([SimpleRNN(50, return_sequences=True, input_shape=[X_train.shape[1], X_train.shape[2]]),SimpleRNN(50),Dense(n_features)
])# 编译模型
model.compile(optimizer='adam', loss='mse')
# 训练模型
history = model.fit(X_train, y_train, epochs=100, verbose=1, validation_split=0.2)
# 评估模型
loss = model.evaluate(X_train, y_train, verbose=0)
print('Train loss:', loss)# 使用模型进行预测
def predict_sequence(model, seed_sequence):n_predict = 10  # 预测接下来的10个点x = seed_sequencefor _ in range(n_predict):x_pred = model.predict(x.reshape((1, x.shape[0], x.shape[1])))x = np.concatenate([x, x_pred], axis=0)return x# 可视化预测结果
seed_sequence = generate_sine_wave(1, n_steps)[0]
predicted_sequence = predict_sequence(model, seed_sequence)
plt.figure(figsize=(12, 6))
plt.plot(np.linspace(0, 1 - 1/6, n_steps), seed_sequence.flatten(), label='Seed Sequence', linewidth=3)
plt.plot(np.linspace(0, 1, n_steps + 10), predicted_sequence.flatten(), label='Predicted Sequence', linewidth=2)
plt.legend()
plt.show()

输出结果:从输出结果可见,右侧橙色曲线基本符合正确的走势。注:本例图形和正弦曲线稍微有些差距,但我们的目的不是为了完全拟合正弦曲线。

PyTorch是由Facebook人工智能研究院(FAIR)于2017年1月推出的一个开源的Python机器学习库,主要用于深度学习领域。它的前身是Torch,一个由Lua语言编写的科学计算框架,用于支持大量的机器学习算法。然而,由于Lua语言相对小众,Torch的流行度受到限制,于是FAIR决定使用更普及的Python语言重新开发Torch,从而诞生了PyTorch。

PyTorch继承了Torch的底层架构,但提供了Python接口,使其更加易于使用。它基于动态计算图,这意味着在构建和训练神经网络时,开发者可以像编写普通的Python程序一样进行调试和修改。这种灵活性使得PyTorch在研究和原型设计方面非常受欢迎。

PyTorch提供了两个主要的高级功能:一是具有强大的GPU加速的张量计算,类似于NumPy;二是包含自动求导系统的深度神经网络。这使得PyTorch在深度学习领域具有独特的优势,可以快速实现和优化复杂的神经网络模型。

PyTorch的主要特点包括:

  1. 动态图:PyTorch使用动态计算图,这意味着你可以在构建神经网络时像编写普通Python程序一样进行调试和修改。这种灵活性使得PyTorch在研究和原型设计方面非常受欢迎。
  2. 张量计算:PyTorch提供了多维数组对象(称为张量),支持各种张量操作,包括数学运算、线性代数、矩阵运算等。这些操作可以在GPU上高效执行,加速深度学习模型的训练。
  3. 自动微分:PyTorch具有自动微分功能,可以自动计算神经网络中的梯度。这使得在训练过程中反向传播算法的实现变得非常简单。
  4. 深度学习框架:PyTorch提供了丰富的深度学习框架,包括卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTM)等。这些框架可以方便地用于图像识别、自然语言处理、语音识别等任务。
  5. 社区支持:PyTorch有一个庞大的社区,提供了许多有用的资源和工具,如教程、示例代码、预训练模型等。这使得PyTorch成为深度学习领域的热门选择之一。

PyTorch与TensorFLow都是强大的机器学习库,被广泛用于神经元网络及大模型训练。这两个库二选一即可,从目前的趋势来看PyTorch逐渐略胜出一些。

例1:PyTorch训练线性回归模型

这个例子中,我们首先创建了一个简单的线性数据集,然后定义了一个线性回归模型。我们使用均方误差(MSE)作为损失函数,并使用随机梯度下降(SGD)作为优化器。接着,我们对模型进行了100轮的训练,并在每10轮输出一次损失值。最后,我们使用训练好的模型对输入数据进行预测,并将结果可视化。

import torch  
import torch.nn as nn  
import torch.optim as optim  
import matplotlib.pyplot as plt  # 创建一个简单的线性数据集  
x_data = torch.tensor([[1.0], [2.0], [3.0]], dtype=torch.float32)  
y_data = torch.tensor([[2.0], [4.0], [6.0]], dtype=torch.float32)  # 定义线性模型 
linear_model = nn.Linear(1, 1)  # 定义损失函数和优化器  
criterion = nn.MSELoss()  
optimizer = optim.SGD(linear_model.parameters(), lr=0.01)  # 训练模型  
num_epochs = 100  
for epoch in range(num_epochs):  # 前向传播  y_pred = linear_model(x_data)  # 计算损失  loss = criterion(y_pred, y_data)  # 反向传播  optimizer.zero_grad()  loss.backward()  # 更新权重  optimizer.step()  if (epoch+1) % 10 == 0:  print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')  # 测试模型  
with torch.no_grad():  y_pred = linear_model(x_data)  
print(y_pred)  # 可视化结果  
plt.scatter(x_data.numpy(), y_data.numpy(), color="orange")  
plt.plot(x_data.numpy(), y_pred.numpy(), 'g-', lw=3)  
plt.text(0.5, 0, 'Loss=%.4f' % loss.item(), fontdict={'size': 20, 'color': 'red'})  
plt.show()

输出结果:

例2:PyTorch训练神经元网络模型

在这个例子中,我们首先生成了一个简单的二分类数据集,其中x_data是随机生成的输入数据,y_data是根据x_data的值生成的标签(0或1)。

然后,我们定义了一个名为SimpleNeuralNetwork的神经元网络类,它包含一个输入层到隐藏层的全连接层(fc1),一个ReLU激活函数,一个隐藏层到输出层的全连接层(fc2),以及一个Sigmoid激活函数用于将输出压缩到0和1之间。

接着,我们实例化了这个网络,并定义了二分类交叉熵损失函数(BCELoss)和随机梯度下降优化器(SGD)。

在训练循环中,我们进行了前向传播、损失计算、反向传播和权重更新。每100个epoch打印一次当前的损失值。

最后,我们测试了网络的准确性,并绘制了数据点和网络预测结果的图表。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
# 生成一个简单的二分类数据集
x_data = torch.tensor(np.random.rand(100, 1), dtype=torch.float32)
y_data = torch.tensor(x_data.numpy() < 0.5, dtype=torch.float32)  # 0 for x < 0.5, 1 for x >= 0.5# 定义神经元网络
class SimpleNeuralNetwork(nn.Module):def __init__(self):super(SimpleNeuralNetwork, self).__init__()self.fc1 = nn.Linear(1, 10)  # 输入层到隐藏层,10个神经元self.relu = nn.ReLU()self.fc2 = nn.Linear(10, 1)  # 隐藏层到输出层self.sigmoid = nn.Sigmoid()def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)out = self.sigmoid(out)return out# 实例化网络model = SimpleNeuralNetwork()
# 定义损失函数和优化器
criterion = nn.BCELoss()  # 二分类交叉熵损失
optimizer = optim.SGD(model.parameters(), lr=0.1)# 训练网络
num_epochs = 1000
for epoch in range(num_epochs):# 前向传播outputs = model(x_data)# 计算损失loss = criterion(outputs, y_data)# 反向传播optimizer.zero_grad()loss.backward()# 更新权重optimizer.step()if (epoch + 1) % 100 == 0:print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item()}')# 测试网络with torch.no_grad():predictions = model(x_data)predictions_cls = predictions.round()  # 将输出四舍五入为0或1correct = (predictions_cls == y_data).sum().item()print(f'Accuracy: {correct / len(y_data)}')# 可视化结果
plt.scatter(x_data.numpy(), y_data.numpy())
plt.plot(x_data.numpy(), predictions_cls.numpy(), 'y-', lw=1)
plt.text(0.5, 0, 'Accuracy=%.2f' % (correct / len(y_data)), fontdict={'size': 20, 'color': 'red'})
plt.show()

  • 限制数据量:MNIST手写数字识别(6万条,单批次32条可运行)
  • 模型压缩‌:
    python Code

    # PyTorch简化网络示例 model = nn.Sequential( nn.Linear(784, 64), # 输入层→隐藏层(大幅减少参数) nn.ReLU(), nn.Linear(64, 10) # 输出层 )


二、算力环境学习阶段(需GPU/云计算)

1. 深度学习进阶
  • 硬件需求场景
    • 计算机视觉:ResNet50训练(ImageNet需GPU)
    • 自然语言处理:BERT微调(>8GB显存需求)
  • 算力获取方式
    • 免费资源‌:Google Colab(GPU/TPU限额)
    • 付费云平台‌:AWS EC2(p3实例)、阿里云GN6i
2. 大规模数据处理
  • 工具与场景
    • Spark分布式计算(需集群环境)
    • 100GB级数据集特征工程(如推荐系统)
3. 生产级模型部署
  • 高并发场景
    • TensorFlow Serving + Docker容器化
    • ONNX模型跨平台优化(需算力验证)
4. 生产级工具‌ ‌
  • 学习目标‌:模型部署与交互式应用开发‌ ‌

学习路径‌: FastAPI:异步接口开发 → OpenAPI 文档生成 → 中间件集成 Streamlit:数据看板构建 → 实时参数调整 → 图表动态更新 ‌场景选择‌:API 服务选 FastAPI,演示工具选 Streamlit。 ‌

  • ‌学习目标‌:模型可解释性分析‌ ‌

学习路径‌:树模型解释(XGBoost) → 深度学习解释(GradientExplainer) → 全局特征重要性 ‌资源建议‌:官方示例 Notebook + 金融风控/医疗诊断案例。


三、无算力环境的替代方案

1. 算法层面的优化
策略实现方式效果
数据量压缩随机抽样10%数据训练减少90%计算时间
特征降维PCA保留95%方差降低输入维度加速训练
模型轻量化使用MobileNetV3(专为端侧设计)参数量减少5-10倍
2. 免费算力工具
  • 国家超算互联网平台
    • 免费计算资源抢购,
    • 特惠4折计算资源(显存64GB PCIE-1 1.00/卡时)获取
  • Google Colab
    • 支持GPU/TPU(12小时会话限制)
    • 挂载Google Drive实现数据持久化
  • Kaggle Kernel
    • 每周30小时GPU额度(足够小型项目)
    • 国家超算互联网平台提供国产加速卡

系统类型配置方案开发效率学习曲线
macOSM2/M3芯片 + Anaconda- Unix环境友好
- Core ML生态
中等
WindowsWin11 + Docker Desktop- 图形化工具丰富
- VS Code生态完善
容易
LinuxUbuntu + JupyterLab- 原生深度学习支持
- 终端操作高效
较高
3. 代码效率提升技巧
  • 向量化运算替代循环
    python Code

    # 低效写法(普通电脑易卡顿) for i in range(len(data)): result[i] = data[i] * 2 # 高效写法(NumPy向量化) result = data * 2

  • 内存优化
    • 使用dtype=np.float32替代默认float64
    • 及时释放未使用的变量(del variable + gc.collect()

四、分阶段学习路线图

阶段学习内容硬件需求耗时
前期统计学基础+Scikit-learn普通电脑1-2月
中期PyTorch/TensorFlow基础普通电脑2-3月
后期大模型训练/海量数据处理GPU/云平台3-6月

五、避坑指南

  1. 普通电脑禁忌

    • 避免直接跑通100万+条数据的全量训练
    • 禁止尝试未裁剪的GPT-2/BERT-base模型
  2. 低成本过渡方案

    • 二手GTX 1080 Ti(约¥1500,仍支持CUDA 11)
    • 阿里云/腾讯云学生优惠(¥10/月起)
  3. 性能监控工具

    • Windows:任务管理器→性能标签(观察CPU/内存占用)
    • Linux:nvidia-smi(GPU监控)、htop(CPU/内存监控)

  1. 六、学习资源推荐

  • 入门课程‌:
    • 吴恩达《Machine Learning》(Coursera,理论扎实)。
    • 李沐《动手学深度学习》(代码驱动,适合实践)。
  • 书籍‌:
    • 《Python机器学习》(Scikit-learn作者编写)。
    • 《机器学习实战:基于Scikit-Learn和TensorFlow》。
  • 工具库‌:
    • 传统算法:Scikit-learn。
    • 深度学习:PyTorch(研究首选)、TensorFlow(工业常用)。

通过这种分离式学习,可在普通电脑上完成70%的机器学习核心技能积累,仅在最耗资源的模型训练阶段调用算力环境,显著降低学习成本。


http://www.mrgr.cn/news/99230.html

相关文章:

  • SAP系统生产跟踪报表入库数异常
  • 大模型应用开发大纲
  • Java学习路线--自用--带链接
  • TensorBoard如何在同一图表中绘制多个线条
  • 【项目管理】成本类计算 笔记
  • 开源身份和访问管理(IAM)解决方案:Keycloak
  • 软件工程师中级考试-上午知识点总结(下)
  • Mininet--nodelib.py源码解析
  • Novartis诺华制药社招入职综合能力测评真题SHL题库考什么?
  • 每日一题——数据中心网络地址规划
  • Oracle数据库和PLSQL安装配置
  • MongoDB数据库的安装到入门使用详细讲解
  • C++笔记-list
  • 【深度学习】计算机视觉(17)——ViT理解与应用
  • day47—双指针-平方数之和(LeetCode-633)
  • 从零开始搭建PyTorch环境(支持CUDA)
  • 【ARM64】【cache/MMU】学习总结
  • day45—贪心-非递减数列(LeetCode-665)
  • 【MySQL数据库入门到精通-02SQL分类以及DDL操作】
  • PFLM: Privacy-preserving federated learning with membership proof证明阅读