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

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


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

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

例1:NumPy数据处理

python 复制代码
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)

运行结果:

复制代码
NumPy Array Squared: [ 1  4  9 16 25]

例2:Python原生数据处理

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)

运行结果:

复制代码
Python List Squared: [1, 4, 9, 16, 25]

例3:用NumPy库做矩阵运算

python 复制代码
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)  

运行结果:

复制代码
Matrix Multiplication:
[[19 22]
 [43 50]]

Matrix A Transpose:
[[1 3]
 [2 4]]

Matrix B Transpose:
[[5 7]
 [6 8]]

Matrix A Inverse:
[[-2.   1. ]
 [ 1.5 -0.5]]

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

python 复制代码
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)  

运行结果:

复制代码
Reshaped Array (3x3 matrix):
[[1 2 3]
 [4 5 6]
 [7 8 9]]

Flattened Array (C Order):
[1 2 3 4 5 6 7 8 9]

Flattened Array (F Order):
[1 4 7 2 5 8 3 6 9]

Transposed Array:
[[1 4 7]
 [2 5 8]
 [3 6 9]]
  • 概率统计:贝叶斯公式推导(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库来读取、处理数据

python 复制代码
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库做数据聚合和分组

python 复制代码
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库完成画图。

python 复制代码
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库画二维、三维图

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

python 复制代码
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库画图、添加标注、设置颜色样式

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

python 复制代码
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库训练线性回归模型

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

python 复制代码
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库做数据预处理

python 复制代码
import numpy as np
from sklearn.preprocessing import OneHotEncoder,StandardScaler
 
 
data = [[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库有多么强大!

python 复制代码
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 构建了一个简单的神经网络模型,包括两个密集连接层。通过划分训练集和测试集,我们可以训练模型并在测试集上进行评估。最后,打印出测试集上的损失和准确率。这个神经元网络比较简单,仅适合演示。

python 复制代码
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模型将会学习识别正弦波的模式,并使用它的"记忆"来预测序列的下一个点。

python 复制代码
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_sequence
    for _ 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轮输出一次损失值。最后,我们使用训练好的模型对输入数据进行预测,并将结果可视化。

python 复制代码
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打印一次当前的损失值。

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

python 复制代码
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或1
    correct = (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/云计算)

环境配置

  • 显卡驱动:

nvidia-smi #显示的是GPU驱动版本和驱动支持的CUDA版本。显卡能否正常工作

nvcc --version #显示的是安装的CUDA工具包版本,用于编译CUDA程序,依此程序调用到显卡。

TensorFlow 与 CUDA 和 cuDNN 版本兼容性

TensorFlow 版本 支持的 CUDA 版本 支持的 cuDNN 版本 备注

|------------|-----------------|----------------|----------------------|
| 2.11.x | CUDA 11.2, 11.3 | cuDNN 8.1, 8.2 | 推荐在生产环境中使用。支持新硬件和旧硬件 |

|------------|-----------------|----------------|-----------------|
| 2.10.x | CUDA 11.2, 11.3 | cuDNN 8.1, 8.2 | 与 2.11.x 兼容,较稳定 |

|-----------|-----------------|----------------|------------------|
| 2.9.x | CUDA 11.2, 11.3 | cuDNN 8.1, 8.2 | 适用于大多数常见硬件,稳定性较好 |

|-----------|-----------------|----------------|-----------------|
| 2.8.x | CUDA 11.0, 11.1 | cuDNN 8.0, 8.1 | 对于较老的硬件平台也能良好运行 |

|-----------|-----------------|-----------|-----------------|
| 2.7.x | CUDA 10.1, 10.2 | cuDNN 7.6 | 适用于老旧硬件环境,稳定性较高 |

PyTorch 与 CUDA 和 cuDNN 版本兼容性

PyTorch 版本 支持的 CUDA 版本 支持的 cuDNN 版本 备注

|-----------|-----------------|-----------|-----------------------------|
| 2.0.x | CUDA 12.0, 12.1 | cuDNN 8.9 | 最新的 PyTorch 版本,支持 CUDA 12.x |

|------------|-----------------|-----------|----------------|
| 1.13.x | CUDA 11.6, 11.7 | cuDNN 8.4 | 适合较新硬件和环境,推荐使用 |

|------------|-----------------|-----------|--------------|
| 1.12.x | CUDA 11.3, 11.4 | cuDNN 8.3 | 稳定性较好,适合生产环境 |

|---------------------|-----------------------|----------------|------------------|
| 1.10.x / 1.11.x | CUDA 10.2, 11.1, 11.2 | cuDNN 8.0, 8.1 | 适用于老旧硬件或兼容性较强的环境 |

|-------------------|-----------------|-----------|---------------|
| 1.8.x / 1.9.x | CUDA 10.1, 10.2 | cuDNN 7.6 | 与较老的硬件或操作系统兼容 |

  • 环境管理

Anaconda #虚拟出不同环境,因程序依赖不同库来编写,多个不同项目运行就会切换不同的版本,没有它只能同一时间只能保留一个环境。这个时候使用这个工具就可以同时隔离出多个环境。一句命令在不同的环境来回切换。

conda env list #显示当前虚拟环境列表

conda info --envs

conda list # 显示当前conda环境下的已经安装软件包

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额度(足够小型项目)
    • 国家超算互联网平台提供国产加速卡
系统类型 配置方案 开发效率 学习曲线
macOS M2/M3芯片 + Anaconda - Unix环境友好 - Core ML生态 中等
Windows Win11 + Docker Desktop - 图形化工具丰富 - VS Code生态完善 容易
Linux Ubuntu + 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/内存监控)

六、学习资源推荐

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

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

相关推荐
終不似少年遊*4 分钟前
国产之光DeepSeek架构理解与应用分析04
人工智能·python·深度学习·算法·大模型·ds
心想事“程”24 分钟前
决策树详解+面试常见问题
算法·决策树·机器学习
訾博ZiBo41 分钟前
AI日报 - 2025年4月23日
人工智能
羊小猪~~1 小时前
深度学习基础--CNN经典网络之InceptionV3详解与复现(pytorch)
网络·人工智能·pytorch·python·深度学习·机器学习·cnn
筱小虾米1 小时前
Dify忘记管理员密码,重置的问题
人工智能·学习·dify
果冻人工智能1 小时前
人类终于打开了AI的黑箱!
人工智能
深度学习lover1 小时前
<项目代码>YOLO小船识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·小船识别
Want5951 小时前
大模型安全吗?数据泄露与AI伦理的黑暗面!
网络·人工智能·安全·aigc
橙色小博1 小时前
RBF(径向基神经网络)基础解析与代码实例:拟合任意函数
人工智能·pytorch·深度学习·神经网络·rbf
飞哥数智坊1 小时前
艺术家的梦想要实现了?即梦3.0作品提示词
人工智能