Mojo是一门新的编程语言,它结合了Python的易用性和C的性能,旨在成为AI研究和生产的理想选择。Mojo的优点有:
- 它可以编写比C更快的可移植代码,据称比Python快35000倍。
- 它可以与Python生态系统无缝互操作,支持Python的核心功能,如异步/等待、错误处理和可变参数。
- 它可以利用系统编程和元编程,提供更高的抽象和表达能力。
Mojo是Python的超集,也就是说,任何有效的Python代码也是有效的Mojo代码。Mojo还添加了一些新的语法和特性,如类型推断、编译时计算、内联函数等,以提高性能和灵活性。
(1)用Mojo实现一个简单的神经网络,用来识别手写数字:
代码语言:python代码运行次数:0复制# 导入必要的模块
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# 定义一个内联函数,用来初始化权重矩阵
inline def init_weights(shape: list) -> np.ndarray:
return np.random.normal(size=shape) / np.sqrt(sum(shape))
# 定义一个内联函数,用来计算交叉熵损失
inline def cross_entropy(y_true: np.ndarray, y_pred: np.ndarray) -> float:
return -np.mean(y_true * np.log(y_pred))
# 定义一个内联函数,用来计算准确率
inline def accuracy(y_true: np.ndarray, y_pred: np.ndarray) -> float:
return np.mean(np.argmax(y_true, axis=1) == np.argmax(y_pred, axis=1))
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# 将图像数据转换为浮点型并归一化
x_train = x_train.astype(np.float32) / 255.0
x_test = x_test.astype(np.float32) / 255.0
# 将标签数据转换为one-hot编码
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)
# 定义超参数
learning_rate = 0.01 # 学习率
epochs = 10 # 训练轮数
batch_size = 128 # 批次大小
# 定义网络结构
n_input = 784 # 输入层神经元个数(28*28)
n_hidden = 256 # 隐藏层神经元个数
n_output = 10 # 输出层神经元个数(10个类别)
# 初始化权重和偏置
W1 = init_weights([n_input, n_hidden]) # 输入层到隐藏层的权重矩阵
b1 = np.zeros(n_hidden) # 隐藏层的偏置向量
W2 = init_weights([n_hidden, n_output]) # 隐藏层到输出层的权重矩阵
b2 = np.zeros(n_output) # 输出层的偏置向量
# 训练网络
for epoch in range(epochs):
# 打乱训练数据的顺序
indices = np.arange(len(x_train))
np.random.shuffle(indices)
x_train = x_train[indices]
y_train = y_train[indices]
# 按批次进行训练
for i in range(0, len(x_train), batch_size):
# 获取当前批次的数据
x_batch = x_train[i:i batch_size].reshape(-1, n_input)
y_batch = y_train[i:i batch_size]
# 前向传播,计算输出层的激活值
z1 = x_batch @ W1 b1 # 隐藏层的线性组合
a1 = np.tanh(z1) # 隐藏层的激活值,使用双曲正切函数作为激活函数
z2 = a1 @ W2 b2 # 输出层的线性组合
a2 = np.exp(z2) / np.sum(np.exp(z2), axis=1, keepdims=True) # 输出层的激活值,使用softmax函数作为激活函数
# 反向传播,计算梯度并更新权重和偏置
delta2 = a2 - y_batch # 输出层的误差项
delta1 = (1 - a1**2) * (delta2 @ W2.T) # 隐藏层的误差项,使用双曲正切函数的导数作为激活函数的导数
W2 -= learning_rate * (a1.T @ delta2) / batch_size # 更新隐藏层到输出层的权重矩阵
b2 -= learning_rate * np.mean(delta2, axis=0) # 更新输出层的偏置向量
W1 -= learning_rate * (x_batch.T @ delta1) / batch_size # 更新输入层到隐藏层的权重矩阵
b1 -= learning_rate * np.mean(delta1, axis=0) # 更新隐藏层的偏置向量
# 计算训练集和测试集上的损失和准确率,并打印结果
train_loss = cross_entropy(y_train, a2)
train_acc = accuracy(y_train, a2)
z1_test = x_test.reshape(-1, n_input) @ W1 b1
a1_test = np.tanh(z1_test)
z2_test = a1_test @ W2 b2
a2_test = np.exp(z2_test) / np.sum(np.exp(z2_test), axis=1, keepdims=True)
test_loss = cross_entropy(y_test, a2_test)
test_acc = accuracy(y_test, a2_test)
print(f"Epoch {epoch 1}: Train loss: {train_loss:.4f}, Train acc: {train_acc:.4f}, Test loss: {test_loss:.4f}, Test acc: {test_acc:.4f}")
(2)用Mojo实现豆瓣电影的采集,获取当前热映的电影名称和评分:
代码语言:python代码运行次数:0复制# 导入必要的模块
import requests
from bs4 import BeautifulSoup
# 定义一个内联函数,用来生成代理认证的头部
inline def proxy_auth_header(username: str, password: str) -> str:
# 将用户名和密码进行base64编码
auth = base64.b64encode(f"{username}:{password}".encode()).decode()
# 返回代理认证的头部
return f"Basic {auth}"
# 定义目标网站的URL
target_url = "https://movie.douban.com"
# 亿牛云(动态转发隧道代理)爬虫加强版代理IP 服务器的URL,用户名和密码
proxy_url = "http://www.16yun.cn:8080"
proxy_username = "16YUN"
proxy_password = "16IP"
# 创建一个会话对象
s = requests.Session()
# 设置代理服务器和代理认证头部
s.proxies = {"http": proxy_url, "https": proxy_url}
s.headers["Proxy-Authorization"] = proxy_auth_header(proxy_username, proxy_password)
# 发送请求并获取响应
response = s.get(target_url)
# 判断响应状态码是否为200
if response.status_code == 200:
# 解析响应内容并获取正在热映的电影信息
soup = BeautifulSoup(response.text, "html.parser")
movies = soup.find_all("div", class_="slide-item")
# 创建一个空列表,用来存储电影名称和评分
movie_list = []
# 遍历每个电影信息,提取名称和评分,并添加到列表中
for movie in movies:
title = movie.find("span", class_="title").text # 电影名称
rating = movie.find("span", class_="rating_num").text # 电影评分
movie_list.append((title, rating)) # 将名称和评分作为元组添加到列表中
# 打印电影列表
print("正在热映的电影有:")
for title, rating in movie_list:
print(f"{title},评分为{rating}。")
else:
# 打印错误信息
print(f"Something went wrong. The status code is: {response.status_code}")
Mojo是一门新兴的编程语言,但已经有一些用户可以通过Mojo Playground在线体验Mojo的编程。Mojo的开发团队计划逐步开源Mojo,并与社区进行交流和反馈。Mojo的发展趋势是利用MLIR(多层次中间表示)作为其核心基础,实现跨平台、跨语言、跨硬件的优化和部署。Mojo还希望成为一个统一的AI语言,支持各种AI框架和库,如TensorFlow、PyTorch等。
总之,Mojo是一门具有前瞻性和创新性的编程语言,它有可能成为未来几十年内最重要的编程进展之一。