Python与人工智能
欢迎来到Python学习课程的最后一天!在前面的课程中,我们已经学习了Python的基础知识、Web开发、数据分析、测试调试、项目实战和网络编程。今天,我们将探索Python在人工智能领域的应用,这是Python最受欢迎的应用领域之一。
1. 人工智能概述
人工智能(AI)是计算机科学的一个分支,致力于创建能够模拟人类智能行为的系统。
flowchart TD
A[数据收集] -->|原始数据| B[数据预处理]
B -->|清洗后的数据| C[特征工程]
C -->|特征向量| D[模型训练]
D -->|初始模型| E[模型评估]
E -->|评估结果| F{性能满意?}
F -->|否| G[调整超参数]
G --> D
F -->|是| H[模型部署]
H --> I[监控与维护]
I -->|新数据| B
style A fill:#d0e0ff,stroke:#333,stroke-width:2px
style B fill:#d0ffe0,stroke:#333,stroke-width:2px
style C fill:#ffe0d0,stroke:#333,stroke-width:2px
style D fill:#ffd0e0,stroke:#333,stroke-width:2px
style E fill:#e0d0ff,stroke:#333,stroke-width:2px
style F fill:#ffffd0,stroke:#333,stroke-width:2px
style G fill:#d0ffff,stroke:#333,stroke-width:2px
style H fill:#ffd0ff,stroke:#333,stroke-width:2px
style I fill:#d0ffd0,stroke:#333,stroke-width:2px
上图展示了一个典型的机器学习项目工作流程,从数据收集开始,经过数据预处理、特征工程、模型训练与评估,最终到模型部署和维护的完整循环。
1.1 什么是人工智能
人工智能(Artificial Intelligence,简称AI)是计算机科学的一个分支,致力于创建能够模拟人类智能行为的系统。这些系统能够学习、推理、感知、规划和解决问题。
1.2 人工智能的主要分支
- 机器学习(Machine Learning):使计算机能够从数据中学习,而无需明确编程。
- 深度学习(Deep Learning):机器学习的一个子集,使用多层神经网络进行学习。
- 自然语言处理(Natural Language Processing):使计算机能够理解、解释和生成人类语言。
- 计算机视觉(Computer Vision):使计算机能够从图像或视频中获取信息。
- 强化学习(Reinforcement Learning):通过与环境交互学习最佳行动策略。
1.3 Python在AI中的地位
机器学习工作流程
flowchart TD
A[数据收集] -->|原始数据| B[数据预处理]
B -->|清洗数据| C[特征工程]
C -->|提取特征| D[模型选择]
D -->|选择算法| E[模型训练]
E -->|训练模型| F[模型评估]
F -->|评估性能| G{性能满意?}
G -->|否| H[调整超参数]
H --> E
G -->|是| I[模型部署]
I -->|部署模型| J[监控与维护]
style A fill:#f9f,stroke:#333,stroke-width:2px
style B fill:#bbf,stroke:#333,stroke-width:2px
style C fill:#dfd,stroke:#333,stroke-width:2px
style D fill:#fdd,stroke:#333,stroke-width:2px
style E fill:#ddf,stroke:#333,stroke-width:2px
style F fill:#ffd,stroke:#333,stroke-width:2px
style G fill:#dff,stroke:#333,stroke-width:4px
style H fill:#fdf,stroke:#333,stroke-width:2px
style I fill:#dff,stroke:#333,stroke-width:2px
style J fill:#ffd,stroke:#333,stroke-width:2px
Python已成为AI和机器学习领域的主导语言,原因包括:
- 简洁易读的语法
- 丰富的库和框架生态系统
- 活跃的社区支持
- 与数据科学工具的无缝集成
- 跨平台兼容性
2. 机器学习基础
2.1 机器学习的类型
2.1.1 监督学习
在监督学习中,算法从标记的训练数据中学习,并根据这些数据预测未来的输出。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import pandas as pd
# 加载数据
data = pd.read_csv('iris.csv')
X = data.drop('species', axis=1)
y = data['species']
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练模型
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
# 预测并评估
predictions = model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print(f"模型准确率: {accuracy:.2f}")
2.1.2 无监督学习
无监督学习算法从未标记的数据中找出隐藏的模式或内在结构。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 创建并训练K-means模型
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X)
# 可视化结果
plt.figure(figsize=(10, 6))
plt.scatter(X.iloc[:, 0], X.iloc[:, 1], c=clusters, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
s=300, c='red', marker='X')
plt.title('K-means聚类结果')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()
2.1.3 强化学习
强化学习是通过与环境交互并从反馈中学习的机器学习方法。
import gym
import numpy as np
# 创建环境
env = gym.make('CartPole-v1')
# Q-learning参数
learning_rate = 0.1
discount_factor = 0.99
epsilon = 0.1
episodes = 1000
# 初始化Q表
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
Q = np.zeros((state_size, action_size))
# 训练循环
for episode in range(episodes):
state = env.reset()
done = False
while not done:
# 选择动作(epsilon-greedy策略)
if np.random.random() < epsilon:
action = env.action_space.sample() # 探索
else:
action = np.argmax(Q[state, :]) # 利用
# 执行动作
next_state, reward, done, _ = env.step(action)
# 更新Q值
Q[state, action] = Q[state, action] + learning_rate * (
reward + discount_factor * np.max(Q[next_state, :]) - Q[state, action])
state = next_state
2.2 常用机器学习库
2.2.1 Scikit-learn
Scikit-learn是Python中最流行的机器学习库,提供了各种算法和工具。
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
# 创建处理和模型管道
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', RandomForestClassifier())
])
# 定义超参数网格
param_grid = {
'classifier__n_estimators': [50, 100, 200],
'classifier__max_depth': [None, 10, 20, 30]
}
# 网格搜索找到最佳参数
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳得分: {grid_search.best_score_:.2f}")
2.2.2 XGBoost
XGBoost是一个优化的梯度提升库,在许多机器学习竞赛中表现出色。
import xgboost as xgb
from sklearn.metrics import mean_squared_error
# 创建DMatrix对象
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置参数
params = {
'objective': 'reg:squarederror',
'max_depth': 3,
'learning_rate': 0.1,
'n_estimators': 100
}
# 训练模型
model = xgb.train(params, dtrain, num_boost_round=100)
# 预测
predictions = model.predict(dtest)
rmse = np.sqrt(mean_squared_error(y_test, predictions))
print(f"RMSE: {rmse:.4f}")
3. 深度学习
3.1 神经网络基础
神经网络是由多层相互连接的节点(神经元)组成的计算系统,灵感来自人脑的结构。
3.1.1 TensorFlow和Keras
TensorFlow是Google开发的开源深度学习框架,而Keras是其高级API。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam
from sklearn.preprocessing import StandardScaler
# 数据预处理
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 构建神经网络
model = Sequential([
Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
Dropout(0.2),
Dense(32, activation='relu'),
Dropout(0.2),
Dense(1, activation='sigmoid')
])
# 编译模型
model.compile(optimizer=Adam(learning_rate=0.001),
loss='binary_crossentropy',
metrics=['accuracy'])
# 训练模型
history = model.fit(
X_train_scaled, y_train,
epochs=50,
batch_size=32,
validation_split=0.2,
verbose=1
)
# 评估模型
loss, accuracy = model.evaluate(X_test_scaled, y_test)
print(f"测试准确率: {accuracy:.2f}")
3.1.2 PyTorch
PyTorch是Facebook开发的另一个流行的深度学习框架,以其动态计算图而闻名。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# 转换数据为PyTorch张量
X_train_tensor = torch.FloatTensor(X_train_scaled)
y_train_tensor = torch.FloatTensor(y_train.values).reshape(-1, 1)
X_test_tensor = torch.FloatTensor(X_test_scaled)
y_test_tensor = torch.FloatTensor(y_test.values).reshape(-1, 1)
# 创建数据加载器
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
# 定义神经网络
class NeuralNetwork(nn.Module):
def __init__(self, input_size):
super(NeuralNetwork, self).__init__()
self.layer1 = nn.Linear(input_size, 64)
self.layer2 = nn.Linear(64, 32)
self.layer3 = nn.Linear(32, 1)
self.relu = nn.ReLU()
self.dropout = nn.Dropout(0.2)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.relu(self.layer1(x))
x = self.dropout(x)
x = self.relu(self.layer2(x))
x = self.dropout(x)
x = self.sigmoid(self.layer3(x))
return x
# 初始化模型、损失函数和优化器
model = NeuralNetwork(X_train.shape[1])
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练模型
epochs = 50
for epoch in range(epochs):
model.train()
for X_batch, y_batch in train_loader:
# 前向传播
y_pred = model(X_batch)
loss = criterion(y_pred, y_batch)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch + 1) % 10 == 0:
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}')
# 评估模型
model.eval()
with torch.no_grad():
y_pred = model(X_test_tensor)
y_pred_class = (y_pred > 0.5).float()
accuracy = (y_pred_class == y_test_tensor).float().mean()
print(f'测试准确率: {accuracy:.2f}')
3.2 卷积神经网络(CNN)
卷积神经网络是一种专门用于处理网格结构数据(如图像)的深度学习架构。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# 加载MNIST数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据预处理
X_train = X_train.reshape(-1, 28, 28, 1) / 255.0
X_test = X_test.reshape(-1, 28, 28, 1) / 255.0
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 构建CNN模型
model = Sequential([
Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
MaxPooling2D(pool_size=(2, 2)),
Conv2D(64, kernel_size=(3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.5),
Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, batch_size=128, epochs=5, validation_split=0.1)
# 评估模型
score = model.evaluate(X_test, y_test)
print(f"测试损失: {score[0]:.4f}")
print(f"测试准确率: {score[1]:.4f}")
3.3 循环神经网络(RNN)
循环神经网络是一种专门用于处理序列数据的神经网络架构。
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Embedding
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 示例文本数据
texts = [
"这是一个积极的评论",
"我喜欢这个产品",
"服务很好",
"质量不错",
"这个产品很差",
"我不喜欢这个服务",
"质量太差了",
"这是一个消极的评论"
]
labels = np.array([1, 1, 1, 1, 0, 0, 0, 0]) # 1表示积极,0表示消极
# 文本预处理
tokenizer = Tokenizer(num_words=1000)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
X = pad_sequences(sequences, maxlen=20)
# 构建LSTM模型
model = Sequential([
Embedding(input_dim=1000, output_dim=16, input_length=20),
LSTM(32),
Dense(1, activation='sigmoid')
])
# 编译模型
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(X, labels, epochs=50, batch_size=2, validation_split=0.2)
# 预测新文本
new_texts = ["这个产品非常好", "服务质量很差"]
new_sequences = tokenizer.texts_to_sequences(new_texts)
new_X = pad_sequences(new_sequences, maxlen=20)
predictions = model.predict(new_X)
for text, pred in zip(new_texts, predictions):
sentiment = "积极" if pred > 0.5 else "消极"
print(f"文本: '{text}' - 情感: {sentiment} (得分: {pred[0]:.2f})")
4. 自然语言处理(NLP)
4.1 NLP基础
自然语言处理是AI的一个分支,专注于计算机与人类语言之间的交互。
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer, WordNetLemmatizer
# 下载必要的资源
nltk.download('punkt')
nltk.download('stopwords')
nltk.download('wordnet')
# 示例文本
text = "Natural language processing is a subfield of linguistics, computer science, and artificial intelligence."
# 分词
tokens = word_tokenize(text)
print("分词结果:", tokens)
# 去除停用词
stop_words = set(stopwords.words('english'))
filtered_tokens = [word for word in tokens if word.lower() not in stop_words]
print("去除停用词后:", filtered_tokens)
# 词干提取
stemmer = PorterStemmer()
stemmed_tokens = [stemmer.stem(word) for word in filtered_tokens]
print("词干提取后:", stemmed_tokens)
# 词形还原
lemmatizer = WordNetLemmatizer()
lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens]
print("词形还原后:", lemmatized_tokens)
4.2 词嵌入
词嵌入是将单词映射到实数向量的技术,捕获单词之间的语义关系。
from gensim.models import Word2Vec
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 示例句子
sentences = [
["我", "喜欢", "机器", "学习"],
["深度", "学习", "是", "人工智能", "的", "一个", "子集"],
["自然语言", "处理", "是", "人工智能", "的", "应用"],
["Python", "是", "一种", "编程", "语言"],
["机器", "学习", "需要", "大量", "数据"]
]
# 训练Word2Vec模型
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
# 查找相似词
similar_words = model.wv.most_similar("学习", topn=3)
print("与'学习'相似的词:", similar_words)
# 可视化词向量
words = ["机器", "学习", "人工智能", "Python", "数据", "编程"]
X = model.wv[words]
# 使用PCA降维
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# 绘制词向量
plt.figure(figsize=(10, 6))
plt.scatter(result[:, 0], result[:, 1], c='b')
for i, word in enumerate(words):
plt.annotate(word, xy=(result[i, 0], result[i, 1]))
plt.title("词向量可视化")
plt.show()
4.3 Transformer模型
Transformer是一种基于自注意力机制的神经网络架构,已成为NLP领域的主导模型。
from transformers import BertTokenizer, BertForSequenceClassification
import torch
# 加载预训练的BERT模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
model = BertForSequenceClassification.from_pretrained('bert-base-chinese', num_labels=2)
# 示例文本
texts = ["这个产品非常好用,我很满意", "服务态度差,不推荐购买"]
labels = torch.tensor([1, 0]) # 1表示积极,0表示消极
# 对文本进行编码
encoded_inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# 添加标签
encoded_inputs['labels'] = labels
# 微调模型
optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)
# 训练循环
model.train()
outputs = model(**encoded_inputs)
loss = outputs.loss
loss.backward()
optimizer.step()
# 预测新文本
new_text = ["这家店的服务很专业"]
new_encoded = tokenizer(new_text, padding=True, truncation=True, return_tensors="pt")
model.eval()
with torch.no_grad():
outputs = model(**new_encoded)
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(f"积极情感概率: {predictions[0][1].item():.2f}")
print(f"消极情感概率: {predictions[0][0].item():.2f}")
5. 计算机视觉
5.1 图像处理基础
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 读取图像
image = cv2.imread('example.jpg')
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 显示原始图像
plt.figure(figsize=(12, 8))
plt.subplot(2, 3, 1)
plt.title('原始图像')
plt.imshow(image_rgb)
# 灰度转换
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.subplot(2, 3, 2)
plt.title('灰度图像')
plt.imshow(gray_image, cmap='gray')
# 高斯模糊
blurred_image = cv2.GaussianBlur(image_rgb, (15, 15), 0)
plt.subplot(2, 3, 3)
plt.title('高斯模糊')
plt.imshow(blurred_image)
# 边缘检测
edges = cv2.Canny(gray_image, 100, 200)
plt.subplot(2, 3, 4)
plt.title('边缘检测')
plt.imshow(edges, cmap='gray')
# 阈值处理
_, threshold = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)
plt.subplot(2, 3, 5)
plt.title('阈值处理')
plt.imshow(threshold, cmap='gray')
# 调整大小
resized_image = cv2.resize(image_rgb, (image_rgb.shape[1]//2, image_rgb.shape[0]//2))
plt.subplot(2, 3, 6)
plt.title('调整大小')
plt.imshow(resized_image)
plt.tight_layout()
plt.show()
5.2 使用CNN进行图像分类
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import numpy as np
# 加载预训练的MobileNetV2模型
model = MobileNetV2(weights='imagenet')
# 加载和预处理图像
img_path = 'cat.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
# 预测
preds = model.predict(x)
results = decode_predictions(preds, top=5)[0]
# 显示结果
plt.imshow(img)
plt.axis('off')
plt.title('预测结果:')
for i, (imagenet_id, label, score) in enumerate(results):
plt.text(10, 30 + i * 20, f"{label}: {score:.2f}", fontsize=12, color='white',
bbox=dict(facecolor='black', alpha=0.7))
plt.show()
5.3 目标检测
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 加载预训练的YOLO模型
net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
# 加载COCO类别名称
with open('coco.names', 'r') as f:
classes = [line.strip() for line in f.readlines()]
# 加载图像
image = cv2.imread('street.jpg')
height, width, _ = image.shape
# 准备图像作为YOLO输入
blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outs = net.forward(output_layers)
# 处理检测结果
class_ids = []
confidences = []
boxes = []
for out in outs:
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
# 目标检测
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)
# 矩形坐标
x = int(center_x - w / 2)
y = int(center_y - h / 2)
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
# 非极大值抑制
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
# 绘制检测结果
colors = np.random.uniform(0, 255, size=(len(classes), 3))
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
confidence = confidences[i]
color = colors[class_ids[i]]
cv2.rectangle(image_rgb, (x, y), (x + w, y + h), color, 2)
cv2.putText(image_rgb, f"{label} {confidence:.2f}", (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
plt.figure(figsize=(12, 8))
plt.imshow(image_rgb)
plt.axis('off')
plt.title('目标检测结果')
plt.show()
6. 生成式AI
6.1 生成对抗网络(GAN)
GAN是一种深度学习模型,由生成器和判别器两个网络组成,可以生成逼真的数据。
import tensorflow as tf
from tensorflow.keras.layers import Dense, Reshape, Flatten, LeakyReLU, BatchNormalization
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
import numpy as np
import matplotlib.pyplot as plt
# 定义生成器
def build_generator(latent_dim):
model = Sequential([
Dense(128, input_dim=latent_dim),
LeakyReLU(alpha=0.2),
BatchNormalization(),
Dense(256),
LeakyReLU(alpha=0.2),
BatchNormalization(),
Dense(512),
LeakyReLU(alpha=0.2),
BatchNormalization(),
Dense(28*28, activation='tanh'),
Reshape((28, 28, 1))
])
return model
# 定义判别器
def build_discriminator(img_shape):
model = Sequential([
Flatten(input_shape=img_shape),
Dense(512),
LeakyReLU(alpha=0.2),
Dense(256),
LeakyReLU(alpha=0.2),
Dense(1, activation='sigmoid')
])
return model
# 构建GAN
def build_gan(generator, discriminator):
discriminator.trainable = False
model = Sequential([
generator,
discriminator
])
return model
# 参数设置
latent_dim = 100
img_shape = (28, 28, 1)
# 构建和编译判别器
discriminator = build_discriminator(img_shape)
discriminator.compile(loss='binary_crossentropy',
optimizer=Adam(0.0002, 0.5),
metrics=['accuracy'])
# 构建和编译生成器
generator = build_generator(latent_dim)
discriminator.trainable = False
# 构建和编译GAN
gan = build_gan(generator, discriminator)
gan.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5))
# 加载MNIST数据集
(X_train, _), (_, _) = tf.keras.datasets.mnist.load_data()
X_train = X_train / 127.5 - 1.0
X_train = np.expand_dims(X_train, axis=3)
# 训练GAN
batch_size = 128
epochs = 10000
sample_interval = 1000
# 真实和虚假标签
valid = np.ones((batch_size, 1))
fake = np.zeros((batch_size, 1))
# 显示生成的图像
def show_generated_images(epoch, generator, latent_dim):
r, c = 4, 4
noise = np.random.normal(0, 1, (r * c, latent_dim))
gen_imgs = generator.predict(noise)
gen_imgs = 0.5 * gen_imgs + 0.5
fig, axs = plt.subplots(r, c, figsize=(8, 8))
cnt = 0
for i in range(r):
for j in range(c):
axs[i, j].imshow(gen_imgs[cnt, :, :, 0], cmap='gray')
axs[i, j].axis('off')
cnt += 1
plt.savefig(f"gan_images/mnist_{epoch}.png")
plt.close()
# 训练循环
for epoch in range(epochs):
# 训练判别器
idx = np.random.randint(0, X_train.shape[0], batch_size)
real_imgs = X_train[idx]
noise = np.random.normal(0, 1, (batch_size, latent_dim))
gen_imgs = generator.predict(noise)
d_loss_real = discriminator.train_on_batch(real_imgs, valid)
d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)
d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
# 训练生成器
noise = np.random.normal(0, 1, (batch_size, latent_dim))
g_loss = gan.train_on_batch(noise, valid)
# 打印进度
if epoch % 1000 == 0:
print(f"{epoch} [D loss: {d_loss[0]:.4f}, acc.: {100*d_loss[1]:.2f}%] [G loss: {g_loss:.4f}]")
# 保存生成的图像
if epoch % sample_interval == 0:
show_generated_images(epoch, generator, latent_dim)
6.2 大型语言模型(LLM)
大型语言模型是一种基于Transformer架构的深度学习模型,能够生成人类语言文本。
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载预训练的语言模型和分词器
model_name = "gpt2" # 这里使用较小的模型作为示例
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 生成文本
def generate_text(prompt, max_length=100):
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(
inputs["input_ids"],
max_length=max_length,
num_return_sequences=1,
temperature=0.7,
top_p=0.9,
do_sample=True
)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
# 示例提示
prompt = "人工智能的未来发展趋势是"
generated_text = generate_text(prompt)
print(f"提示: {prompt}")
print(f"生成的文本: {generated_text}")
6.3 扩散模型
扩散模型是一类生成模型,通过逐步去噪的过程生成数据。
# 注意:完整的扩散模型实现较为复杂,这里提供一个简化的概念示例
import torch
import torch.nn as nn
import torch.nn.functional as F
# 简化的U-Net模型作为去噪网络
class SimpleUNet(nn.Module):
def __init__(self):
super(SimpleUNet, self).__init__()
# 编码器
self.enc1 = nn.Conv2d(1, 64, 3, padding=1)
self.enc2 = nn.Conv2d(64, 128, 3, padding=1, stride=2)
# 解码器
self.dec1 = nn.ConvTranspose2d(128, 64, 4, padding=1, stride=2)
self.dec2 = nn.Conv2d(64, 1, 3, padding=1)
def forward(self, x, t):
# t是时间步,这里简化处理
t_emb = torch.ones(x.shape[0], 1, x.shape[2], x.shape[3]).to(x.device) * t
x = torch.cat([x, t_emb], dim=1)
# 编码
h1 = F.relu(self.enc1(x))
h2 = F.relu(self.enc2(h1))
# 解码
h = F.relu(self.dec1(h2))
h = self.dec2(h)
return h
# 扩散过程
def diffusion_forward(x_0, n_steps=1000):
"""向前扩散过程:逐步添加噪声"""
x_t = x_0.clone()
for t in range(n_steps):
noise = torch.randn_like(x_t)
alpha_t = 1 - t / n_steps # 简化的噪声调度
x_t = torch.sqrt(alpha_t) * x_t + torch.sqrt(1 - alpha_t) * noise
return x_t
def diffusion_reverse(model, x_T, n_steps=1000):
"""反向扩散过程:逐步去噪"""
x_t = x_T.clone()
for t in reversed(range(n_steps)):
t_tensor = torch.tensor(t / n_steps).float()
predicted_noise = model(x_t, t_tensor)
alpha_t = 1 - t / n_steps
x_t = (x_t - torch.sqrt(1 - alpha_t) * predicted_noise) / torch.sqrt(alpha_t)
if t > 0: # 除了最后一步,每一步都添加一些噪声
noise = torch.randn_like(x_t)
sigma_t = torch.sqrt(1 - alpha_t) * 0.1 # 简化的噪声量
x_t = x_t + sigma_t * noise
return x_t
# 注意:实际的扩散模型训练和推理比这复杂得多
7. 强化学习
7.1 强化学习基础
强化学习是一种机器学习方法,通过与环境交互并从反馈中学习最佳行动策略。
import gym
import numpy as np
import matplotlib.pyplot as plt
# 创建CartPole环境
env = gym.make('CartPole-v1')
# Q-learning参数
learning_rate = 0.1
discount_factor = 0.99
epsilon = 0.1
episodes = 5000
max_steps = 500
# 离散化状态空间
def discretize_state(state):
# 将连续状态空间离散化为有限数量的桶
cart_pos_bins = np.linspace(-2.4, 2.4, 10)
cart_vel_bins = np.linspace(-4, 4, 10)
pole_ang_bins = np.linspace(-0.2095, 0.2095, 10)
pole_vel_bins = np.linspace(-4, 4, 10)
# 数字化每个状态维度
cart_pos = np.digitize(state[0], cart_pos_bins)
cart_vel = np.digitize(state[1], cart_vel_bins)
pole_ang = np.digitize(state[2], pole_ang_bins)
pole_vel = np.digitize(state[3], pole_vel_bins)
return (cart_pos, cart_vel, pole_ang, pole_vel)
# 初始化Q表
state_size = (11, 11, 11, 11) # 每个维度10个桶 + 1(超出范围)
action_size = env.action_space.n
Q = np.zeros(state_size + (action_size,))
# 训练循环
episode_rewards = []
for episode in range(episodes):
state = env.reset()
state = discretize_state(state)
total_reward = 0
for step in range(max_steps):
# 选择动作(epsilon-greedy策略)
if np.random.random() < epsilon:
action = env.action_space.sample() # 探索
else:
action = np.argmax(Q[state]) # 利用
# 执行动作
next_state, reward, done, _ = env.step(action)
next_state = discretize_state(next_state)
total_reward += reward
# 更新Q值
best_next_action = np.argmax(Q[next_state])
Q[state + (action,)] = Q[state + (action,)] + learning_rate * (
reward + discount_factor * Q[next_state + (best_next_action,)] - Q[state + (action,)])
state = next_state
if done:
break
episode_rewards.append(total_reward)
# 打印进度
if (episode + 1) % 100 == 0:
avg_reward = np.mean(episode_rewards[-100:])
print(f"Episode {episode + 1}/{episodes}, Avg Reward: {avg_reward:.2f}")
# 绘制学习曲线
plt.figure(figsize=(10, 6))
plt.plot(range(1, episodes + 1), episode_rewards)
plt.xlabel('Episode')
plt.ylabel('Reward')
plt.title('Q-Learning on CartPole')
plt.grid(True)
plt.show()
# 测试训练好的策略
state = env.reset()
state = discretize_state(state)
total_reward = 0
done = False
while not done:
action = np.argmax(Q[state])
next_state, reward, done, _ = env.step(action)
next_state = discretize_state(next_state)
total_reward += reward
state = next_state
print(f"测试奖励: {total_reward}")
7.2 深度强化学习
深度强化学习结合了深度学习和强化学习,使用神经网络来近似值函数或策略。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
import numpy as np
import gym
from collections import deque
import random
# DQN实现
class DQNAgent:
def __init__(self, state_size, action_size):
self.state_size = state_size
self.action_size = action_size
self.memory = deque(maxlen=2000)
self.gamma = 0.95 # 折扣因子
self.epsilon = 1.0 # 探索率
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
self.learning_rate = 0.001
self.model = self._build_model()
def _build_model(self):
# 神经网络模型:输入状态,输出每个动作的Q值
model = Sequential([
Dense(24, input_dim=self.state_size, activation='relu'),
Dense(24, activation='relu'),
Dense(self.action_size, activation='linear')
])
model.compile(loss='mse', optimizer=Adam(lr=self.learning_rate))
return model
def remember(self, state, action, reward, next_state, done):
self.memory.append((state, action, reward, next_state, done))
def act(self, state):
if np.random.rand() <= self.epsilon:
return random.randrange(self.action_size)
act_values = self.model.predict(state)
return np.argmax(act_values[0])
def replay(self, batch_size):
minibatch = random.sample(self.memory, batch_size)
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = reward + self.gamma * np.amax(self.model.predict(next_state)[0])
target_f = self.model.predict(state)
target_f[0][action] = target
self.model.fit(state, target_f, epochs=1, verbose=0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay
# 创建环境和智能体
env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
agent = DQNAgent(state_size, action_size)
# 训练参数
episodes = 1000
batch_size = 32
# 训练循环
for episode in range(episodes):
state = env.reset()
state = np.reshape(state, [1, state_size])
total_reward = 0
for time in range(500):
# 选择动作
action = agent.act(state)
# 执行动作
next_state, reward, done, _ = env.step(action)
next_state = np.reshape(next_state, [1, state_size])
# 记忆经验
agent.remember(state, action, reward, next_state, done)
state = next_state
total_reward += reward
if done:
break
# 从经验中学习
if len(agent.memory) > batch_size:
agent.replay(batch_size)
# 打印进度
if (episode + 1) % 10 == 0:
print(f"Episode {episode + 1}/{episodes}, Reward: {total_reward}, Epsilon: {agent.epsilon:.2f}")
8. 实际应用案例
8.1 情感分析系统
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
import jieba
import re
# 示例数据
data = {
'text': [
'这个产品非常好用,我很满意',
'服务态度很好,物流也很快',
'质量不错,值得购买',
'功能齐全,性价比高',
'这个产品质量太差了,不推荐',
'客服态度恶劣,物流缓慢',
'价格贵,但质量一般',
'外观不错,但使用体验很差'
],
'sentiment': [1, 1, 1, 1, 0, 0, 0, 0] # 1表示积极,0表示消极
}
df = pd.DataFrame(data)
# 文本预处理
def preprocess_text(text):
# 去除特殊字符
text = re.sub(r'[^\w\s]', '', text)
# 分词
words = jieba.cut(text)
return ' '.join(words)
df['processed_text'] = df['text'].apply(preprocess_text)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
df['processed_text'], df['sentiment'], test_size=0.2, random_state=42
)
# 特征提取
vectorizer = TfidfVectorizer(max_features=1000)
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
# 训练模型
model = LogisticRegression()
model.fit(X_train_tfidf, y_train)
# 评估模型
y_pred = model.predict(X_test_tfidf)
print(classification_report(y_test, y_pred))
# 预测新文本
new_texts = [
'这家店的服务真的很棒,下次还会来',
'产品质量不行,退货很麻烦'
]
new_texts_processed = [preprocess_text(text) for text in new_texts]
new_texts_tfidf = vectorizer.transform(new_texts_processed)
predictions = model.predict(new_texts_tfidf)
for text, pred in zip(new_texts, predictions):
sentiment = "积极" if pred == 1 else "消极"
print(f"文本: '{text}' - 情感: {sentiment}")
8.2 图像识别应用
import tensorflow as tf
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import numpy as np
import matplotlib.pyplot as plt
import requests
from io import BytesIO
from PIL import Image
# 加载预训练的MobileNetV2模型
model = MobileNetV2(weights='imagenet')
# 图像预处理函数
def process_image(img_path, is_url=False):
if is_url:
response = requests.get(img_path)
img = Image.open(BytesIO(response.content))
else:
img = image.load_img(img_path, target_size=(224, 224))
img_array = image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array = preprocess_input(img_array)
return img, img_array
# 图像识别函数
def recognize_image(img_path, is_url=False):
img, img_array = process_image(img_path, is_url)
# 预测
preds = model.predict(img_array)
results = decode_predictions(preds, top=5)[0]
# 显示结果
plt.figure(figsize=(8, 8))
plt.imshow(img)
plt.axis('off')
plt.title('预测结果:')
for i, (imagenet_id, label, score) in enumerate(results):
plt.text(10, 30 + i * 30, f"{label}: {score:.2f}", fontsize=14, color='white',
bbox=dict(facecolor='black', alpha=0.7))
plt.show()
return results
# 示例:识别本地图像
# recognize_image('cat.jpg')
# 示例:识别网络图像
# image_url = 'https://example.com/image.jpg'
# recognize_image(image_url, is_url=True)
# 创建简单的图像识别应用
def image_recognition_app():
print("=== 图像识别应用 ===")
print("1. 识别本地图像")
print("2. 识别网络图像")
print("3. 退出")
choice = input("请选择操作 (1-3): ")
if choice == '1':
img_path = input("请输入图像路径: ")
try:
results = recognize_image(img_path)
print("\n识别结果:")
for i, (imagenet_id, label, score) in enumerate(results):
print(f"{i+1}. {label}: {score:.2f}")
except Exception as e:
print(f"错误: {e}")
elif choice == '2':
img_url = input("请输入图像URL: ")
try:
results = recognize_image(img_url, is_url=True)
print("\n识别结果:")
for i, (imagenet_id, label, score) in enumerate(results):
print(f"{i+1}. {label}: {score:.2f}")
except Exception as e:
print(f"错误: {e}")
elif choice == '3':
print("谢谢使用!")
return
# 继续应用
input("\n按Enter键继续...")
image_recognition_app()
# 启动应用
# image_recognition_app()
8.3 智能聊天机器人
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import re
class SimpleChatbot:
def __init__(self, model_name="gpt2"):
print("正在加载模型,请稍候...")
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForCausalLM.from_pretrained(model_name)
print("模型加载完成!")
# 添加特殊标记
self.user_token = "<|用户|>"
self.bot_token = "<|机器人|>"
self.tokenizer.add_special_tokens({'additional_special_tokens': [self.user_token, self.bot_token]})
self.model.resize_token_embeddings(len(self.tokenizer))
# 对话历史
self.conversation_history = ""
def preprocess_text(self, text):
# 简单的文本预处理
text = text.strip()
text = re.sub(r'\s+', ' ', text)
return text
def generate_response(self, user_input, max_length=100):
# 预处理用户输入
user_input = self.preprocess_text(user_input)
# 更新对话历史
if not self.conversation_history:
self.conversation_history = f"{self.user_token} {user_input}\n{self.bot_token}"
else:
self.conversation_history += f" {user_input}\n{self.bot_token}"
# 生成回复
inputs = self.tokenizer(self.conversation_history, return_tensors="pt")
with torch.no_grad():
outputs = self.model.generate(
inputs["input_ids"],
max_length=len(inputs["input_ids"][0]) + max_length,
num_return_sequences=1,
temperature=0.7,
top_p=0.9,
do_sample=True,
pad_token_id=self.tokenizer.eos_token_id
)
# 解码回复
response = self.tokenizer.decode(outputs[0], skip_special_tokens=False)
# 提取生成的回复
response = response.split(self.bot_token)[-1].strip()
# 更新对话历史
self.conversation_history += f" {response}\n{self.user_token}"
return response
def chat(self):
print("欢迎与AI聊天机器人对话!输入'退出'结束对话。")
while True:
user_input = input("\n你: ")
if user_input.lower() in ['退出', 'exit', 'quit']:
print("谢谢使用,再见!")
break
response = self.generate_response(user_input)
print(f"机器人: {response}")
# 创建并启动聊天机器人
# chatbot = SimpleChatbot()
# chatbot.chat()
9. 总结与展望
9.1 Python在AI中的优势
Python在人工智能领域具有以下优势:
- 丰富的库和框架:TensorFlow、PyTorch、scikit-learn等提供了强大的工具。
- 简洁易读的语法:降低了学习曲线,提高了开发效率。
- 活跃的社区:大量的资源、教程和支持。
- 跨平台兼容性:可在不同操作系统上运行。
- 与数据科学工具的集成:与NumPy、pandas等无缝协作。
9.2 AI的未来发展趋势
- 多模态AI:结合文本、图像、音频等多种数据类型的模型。
- 自监督学习:减少对标记数据的依赖。
- 小型高效模型:在边缘设备上运行的轻量级模型。
- 可解释AI:提高模型决策的透明度和可解释性。
- AI伦理和安全:解决隐私、偏见和安全问题。
- 人机协作:AI作为人类的助手和增强工具。
9.3 学习资源推荐
-
在线课程:
- Coursera上的"机器学习"(Andrew Ng)
- edX上的"人工智能导论"(哈佛大学)
- 深度学习专项课程(deeplearning.ai)
-
书籍:
- 《Python机器学习》(Sebastian Raschka)
- 《深度学习》(Ian Goodfellow等)
- 《动手学深度学习》(李沐等)
-
实践平台:
- Kaggle:参加数据科学竞赛
- GitHub:探索开源项目
- Google Colab:免费使用GPU进行实验
-
社区:
- Stack Overflow
- Reddit的r/MachineLearning
- AI研究论文网站如arXiv
10. 结语
恭喜你完成了Python学习课程的最后一天!在这个为期两周的课程中,我们从Python基础开始,逐步深入到各个应用领域,最后以人工智能这一前沿技术作为收尾。
Python的简洁性和强大的生态系统使其成为从初学者到专业人士的理想编程语言。无论你是想开发Web应用、分析数据、构建机器学习模型,还是创建网络应用,Python都能提供所需的工具和库。
人工智能作为当今最热门的技术领域之一,正在改变我们的生活和工作方式。通过掌握Python和AI技术,你将能够参与这一技术革命,创造出有价值的解决方案。
记住,学习编程和AI是一个持续的过程。技术在不断发展,新的工具和方法不断涌现。保持好奇心,持续学习,并将所学知识应用到实际项目中,这是成为优秀开发者的关键。
祝你在Python和人工智能的学习之旅中取得成功!