- 2024-12-03
-
加入了学习《直播回放: DigiKey FollowMe 第二季 第4期 Arduino Nano RP2040 Connect 任务讲解》,观看 Arduino Nano RP2040 Connect 任务讲解
-
评论了课程:
EEWORLD大学堂----直播回放: DigiKey FollowMe 第二季 第4期 Arduino Nano RP2040 Connect 任务讲解
讲得很仔细,特别是原理部分,程序代码分析得也很详细
-
回复了主题帖:
【Follow me第二季第4期】IMU 传感器
gtq 发表于 2024-12-3 16:02
哇塞,学到啦,超感谢!多多积累经验哈,盼着有那么一天能派上用场呢。
这款开发板的板载传感器较多,文中提到的 IMU 传感器在智能手机、手表、手环等可穿戴设备中应用较多,得益于在保持精度的前提下器件微型化技术的更新,因此还是有很多可以拓展的应用场景,如步数统计、姿态检测、速度监测等。
-
回复了主题帖:
【Follow me第二季第4期】Blink、串口打印
gtq 发表于 2024-12-3 15:57
哇塞,学到啦,超感谢!多多积累经验哈,盼着有那么一天能派上用场呢。
感谢关注,点灯这里还可以加上渐变功能,实现彩色呼吸灯效果,后面再更新一下
-
回复了主题帖:
【Follow me第二季第4期】Nano RP2040 Connect 开发板简介、环境搭建、工程测试
怀66 发表于 2024-12-3 15:25
点赞👍,写的很详细,对我这种小白很友好呀。
开发板用户手册更详细,Nano RP2040 Connect | Arduino Documentation
不过官网信息量比较大,在完成具体项目时,需要梳理出对项目有用的重点部分
-
发表了主题帖:
【Follow me第二季第4期】IMU 传感器
# 【Follow me第二季第4期】IMU 传感器
IMU,即惯性测量单元(Inertial Measurement Unit),是一种用于测量和报告物体的三个基本线性运动(加速度)和三个基本角运动(角速度)的电子设备。
IMU 原理是采用惯性定律实现的。
IMU 通常包括一组加速度计和陀螺仪,他们是惯性系统的核心部件,是影响惯性系统性能的主要因素。
## 加速度计
加速度计是一种用于测量加速度的机电设备。
这些力可能是静态的,例如重力的连续力,或者像许多移动设备一样,动态的,用于感应运动或振动。
插图从左至右分别展示了上下、左右、前后加速度感知的情况。
快速移动开发板可在串口监视器中观察到 x, y, z 三个方向的数值曲线发生变化。
### 代码
```c++
#include
void setup() {
Serial.begin(9600);
while (!Serial);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Acceleration in g's");
Serial.println("X\tY\tZ");
}
void loop() {
float x, y, z;
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(x, y, z);
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.println(z);
}
}
```
#### 流程图
### 效果
### 应用
#### 跌落检测
从实验结果可以看出,当开发板发生剧烈晃动时,其加速度发生明显改变,通过设定阈值,可以判断是否发生碰撞或跌落。
#### 步数检测
结合人体行走或奔跑时的曲线姿态,制定相应的步态检测方案,如设定曲线抖动间隔、抖动幅值,对可能的走路、跳跃、奔跑、慢跑等多场景状态进行反馈,实现步数统计。
## 陀螺仪
陀螺仪传感器是一种可以测量和保持物体的方向和角速度的设备。
陀螺仪比加速度计更先进,因为它们可以测量物体的倾斜和横向,而加速度计只能测量其线性运动。
陀螺仪传感器也称为“角速率传感器”或“角速度传感器”。角速度以 `度/秒` 为单位,是物体**单位时间内旋转角度的变化**。
插图从左至右分别描述了绕 z 轴、绕 x 轴、绕 y 轴旋转的情况。
旋转开发板可在串口监视器中观察到 x, y, z 三个数值曲线的变化。
### 代码
```c++
#include
void setup() {
Serial.begin(9600);
while (!Serial);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Gyroscope sample rate = ");
Serial.print(IMU.gyroscopeSampleRate());
Serial.println(" Hz");
Serial.println();
Serial.println("Gyroscope in degrees/second");
Serial.println("X\tY\tZ");
}
void loop() {
float x, y, z;
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(x, y, z);
Serial.print(x);
Serial.print('\t');
Serial.print(y);
Serial.print('\t');
Serial.println(z);
}
}
```
#### 流程图
### 效果
### 应用
飞机俯仰角变化,游戏模拟器,游戏手柄等
## 温度计
温度会影响 IMU 采样数据的稳定性,因此 IMU 传感器中包含高精度温度传感器,用来对温漂进行校正。
**温度漂移** TAR(Temperature Accelerometer Random Walk)**:**
- 描述IMU在温度变化时性能的稳定性。温度漂移小的IMU在不同环境条件下能够提供更一致的性能。
- 单位:$$m/s^2/\sqrt{Hz}/^\circ C$$
### 代码
```c++
#include
void setup()
{
Serial.begin(9600);
while (!Serial);
if (!IMU.begin())
{
Serial.println("Failed to initialize IMU!");
while (1);
}
}
void loop()
{
if (IMU.temperatureAvailable())
{
int temperature_int = 0;
float temperature_float = 0;
IMU.readTemperature(temperature_int);
IMU.readTemperatureFloat(temperature_float);
Serial.print("LSM6DSOX Temperature = ");
Serial.print(temperature_int);
Serial.print(" (");
Serial.print(temperature_float);
Serial.print(")");
Serial.println(" °C");
}
}
```
### 效果
### 应用
手势识别、手势控制、温漂校准等。
## Arduino Cloud
若使用 [Arduino Cloud](https://app.arduino.cc/) 编译代码,则首先需要对开发板进行固件升级
若开发板出现问题需要重置或初始化,也可采用 Firmware Updater 对开发板进行重置。
注意该升级过程需要时间较长,五分钟左右,当固件下载进度条走完后,需要保持连接,等待窗口显示 Successful 字样时表明升级完成。之后下载并安装 Arduino Cloud Agent 可成功连接 Arduino Cloud .
-
发表了主题帖:
【Follow me第二季第4期】Blink、串口打印
# 【Follow me第二季第4期】Blink、串口打印
## Blink
所需板载元件:红色-绿色-蓝色 LED
由原理图可知,板载 RGB 三个 LED 为低电平点亮,
因此,要实现闪灯效果,只需要令 LEDR、LEDG、LEDB 循环输出低电平即可。
### 流程图
### 代码
```c++
#include "WiFiNINA.h"
void setup() {
Serial.begin(9600);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {
// Red
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
delay(500);
// Green
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, HIGH);
delay(500);
// Blue
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, LOW);
delay(500);
}
```
### 效果
## 串口打印
所用板载元件:串口通信接口,即Type-C接口和数据线
### 流程图
### 代码
```c++
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello DigiKey & EEWorld!");
delay(500);
}
```
波特率 9600 bps
### 效果
- 2024-12-02
-
回复了主题帖:
【《人工智能实践教程》测评】卷积神经网络
Jacktang 发表于 2024-11-27 07:30
单机版是48 个CPU 和8 块GPU,占的资源也挺多的
AlphaGO部署于TPU,自发布至今,TPU技术已经经历了多代的演化和升级。
第一代TPU,被应用到AlphaGo上,在2015年和李世英对战时,就是部署了48个TPU。
第二代TPU,它被引入了Google Cloud,应用在谷歌计算引擎(Google Compute Engine ,简称GCE)中,也称为Cloud TPU。配置了TPU v2的AlphaGo,仅用了4块TPUv2,便击败当时的世界围棋冠军柯洁。
第三代TPU,(2018年)性能提升到第二代的2倍。每个Pod的性能提高了8倍,且每个pod最多可含1024个芯片。
第四代TPU,2021年。采用 7nm 工艺,翻倍的 MXU 数量,以及显著增加的内存容量和带宽,实现了性能的大幅提升。引入 Sparse Core ,针对稀疏计算进行了优化,使得 TPU v4 在处理深度学习中的 Embedding 层时更加高效。3D Torus 互联方式以及 TPU v4 Pod 的构建,展示了谷歌在大规模并行计算和高效互联方面的突破。Palomar 光路开关芯片的开发,利用 MEMS 技术,进一步降低了系统延迟和功耗,同时减少了网络成本。
第五代TPU,2023年,谷歌在发布多模态大模型Gemini的同时,推出了全新的面向云端AI加速的TPU v5p ,(云张量处理单元)。
第六代TPU,2024年5月,Alphabet首席执行官桑达尔·皮查伊(Sundar Pichai)发布了第六代TPU,与 TPU v5e 相比,Trillium TPU 的能源效率高出 67% 以上。Trillium 可以在单个高带宽、低延迟 Pod 中扩展到多达 256 个 TPU。
-
回复了主题帖:
【《人工智能实践教程》测评】分支与循环
Jacktang 发表于 2024-11-24 09:26
分支与循环,编程的基础判断语句
掌握这部分编程原理,对其他语言的学习都大有裨益
-
回复了主题帖:
【《人工智能实践教程》测评】神经网络
Jacktang 发表于 2024-11-27 07:31 流程图画的真是不错
是的,这本书有很多内容是通过流程和框架图进行展示的,非常便于读者掌握章节的整体布局
-
回复了主题帖:
【Follow me第二季第4期】Nano RP2040 Connect 开发板简介、环境搭建、工程测试
秦天qintian0303 发表于 2024-12-2 09:13
大家这个板子都不用焊接引脚就行了,板载传感器太多了
暂时没焊排针,后面看看是否有需求吧,如果需要其他传感器数据或者OLED屏显示数据,那就不得不焊排针了
- 2024-12-01
-
发表了主题帖:
【Follow me第二季第4期】Nano RP2040 Connect 开发板简介、环境搭建、工程测试
# 【Follow me第二季第4期】Nano RP2040 Connect 开发板简介、环境搭建、工程测试
功能丰富的 **Arduino Nano RP2040 Connect** 将新的 **Raspberry Pi RP2040** 微控制器引入 Nano 外形尺寸。
借助 **U-blox® Nina W102** 模块,充分利用双核 **32 位 Arm® Cortex-M0®+**,通过蓝牙®和 WiFi 连接制作物联网项目。
使用板载加速计、陀螺仪、RGB LED 和麦克风深入研究实际项目。
使用 **Arduino Nano RP2040 Connect** 以最少的工作量开发强大的嵌入式 AI 解决方案。
## 物料清单
**物料名称**
[ARDUINO NANO RP2040 CONNECT](https://www.digikey.cn/zh/products/detail/arduino/ABX00052/14123941)
**实物图片**
该开发板的 DigiKey 官网介绍
## 开箱上电
**Top view**
**Bottom view**
**上电效果**
板载 RGB 三色 LED 循环点亮。
详见:[Nano RP2040 Connect](https://docs.arduino.cc/hardware/nano-rp2040-connect/) .
## 概述
Arduino NANO RP2040 Connect 它适合 Arduino Nano 外形尺寸,使其成为具有大功能的小板。
该板的大脑是 Raspberry Pi® RP2040 芯片:双核 Arm Cortex M0+,运行频率 133MHz,264KB SRAM,片外 16MB 闪存。
板载连接选项包含 u-blox NINA-W102 无线电模块、完全兼容 Arduino Cloud、配有内置传感器、麦克风和运动感应,增加了电路板的探索深度。
Arduino Nano RP2040 Connect 是 RP2040 设备升级项目和释放新项目潜力的完美选择。
### 特点
- 兼容 Arduino IoT Cloud
- 在 Arduino 的 IoT Cloud 上使用 MKR 板,这是一种确保所有互联事物安全通信的简单快速方法。
- 无线模块
- u-blox NINA-W102 无线电模块使其成为唯一连接的 RP2040 选项。它为您提供完整的 WiFi 802.11b/g/n 连接, 以及蓝牙®和低功耗蓝牙® v4.2
- 传感器
- 板载几个非常有用的传感器。内置麦克风用于声音激活、音频控制甚至 AI 语音识别。具有 AI 功能的六轴智能 IMU 告诉电路板它正在向哪个方向移动,并增加了跌倒感应和双击激活。
- 硬件
- 它可能是一个小板,但 Nano RP2040 Connect 具有硬件冲击力。它与已建立的 Arduino Nano 外形尺寸相匹配,使其成为各种规模项目的完美升级。
- 内存
- 借助微处理器外部的 16MB 闪存,为您的代码和存储需求提供了充足的空间。
- 引脚
- 可编程 I/O 引脚具有多种功能;22 个数字端口、20 个带 PWM 端口和 8 个模拟端口。
- 兼容 Raspberry Pi® Pico
- 适用于智能设备的智能软件选项。它完全支持整个 RP2040 软件生态系统。
- Arduino 扩展
- 支持 Arduino 编程语言、IDE 2.0 和所有这些出色的库。
- Python 功能
- 对 MicroPython 的完全支持。获取 Nano RP2040 Connect,它附带用于机器视觉项目的免费 OpenMV 许可证。
- Arduino 云支持
- 直接 Web 浏览器对 Nano RP2040 Connect 进行编程和操作。
- 通过 **Arduino IoT Remote** 手机应用程序进行即时远程控制,通过无线方式上传工程。
## 原理图
## 引脚
基本引脚定义
PWM、UART、SPI、IIC
ADC、USB、Timer、SIO、PIO
RGB LED、SJ2
WiFi NINA-W102-00B、Microphoton、FLASH、RP2040、Oscillator
Micro USB、Step Down Converter MP2322GQH
- Nano RP2040 Connect 与 [Arduino Cloud](https://app.arduino.cc/) 平台兼容。只需几分钟即可构建 IoT 项目!
- [Python® 支持](https://docs.arduino.cc/tutorials/nano-33-ble-sense/micropython-installation):该板可以使用 MicroPython 进行编程,MicroPython 是 Python® 编程语言的实现,附带 Python® 标准库的子集。[更多信息](https://docs.arduino.cc/micropython) .
- [机器学习](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-imu-advanced):借助项目中时钟频率为 133 MHz 的高性能节能微处理器,开始使用 TinyML、TensorFlow Lite 或 Edge Impulse 进行机器学习。[库文件](https://github.com/stm32duino/X-NUCLEO-IKS01A3) .
- [全向麦克风](https://docs.arduino.cc/learn/built-in-libraries/pdm) :Nano RP2040 connect 随附 MP34DT06JTR 麦克风。它允许您实时捕获和分析声音,并可用于创建语音界面以通过声音控制您的外围设备。[相关文档](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-microphone-basics) .
- [蓝牙](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-ble-device-to-device):该板支持蓝牙®,允许您通过蓝牙控制外围设备。[库文件 ArduinoBLE](https://www.arduino.cc/reference/en/libraries/arduinoble/) .
- [六轴 IMU](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-imu-basics) :将加速度计和陀螺仪与专用机器学习核心相结合。[LSM6DSOX 库文件](https://www.arduino.cc/reference/en/libraries/arduino_lsm6dsox/) .
- [温度传感器](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-01-technical-reference#temperature):LSM6DSOX 传感器还具有嵌入式传感器,可通过库直接访问。[库文件 PDM](https://docs.arduino.cc/learn/built-in-libraries/pdm) .
## 环境搭建
1.下载和安装 [Ardunio IDE](https://www.arduino.cc/en/software) ;
2.安装 Arduino NANO RP2040 开发板对应的软件包。
## 工程案例
### WiFi 控制 LED
[Control Built-in RGB LED over Wi-Fi with Nano RP2040 Connect](https://docs.arduino.cc/tutorials/nano-rp2040-connect/rp2040-web-server-rgb/)
#### 代码
加载示例代码,参考如上网址,并输入本地 WiFi 名称和对应的密码
```c++
#include
#include
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = "xxxx"; // your network SSID (name)
char pass[] = "xxxx"; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key index number (needed only for WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
Serial.begin(9600); // initialize serial communication
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid); // print the network name (SSID);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
server.begin(); // start the web server on port 80
printWifiStatus(); // you're connected now, so print out the status
}
void loop() {
WiFiClient client = server.available(); // listen for incoming clients
if (client) { // if you get a client,
Serial.println("new client"); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// the content of the HTTP response follows the header:
client.print("");
client.print(".container {margin: 0 auto; text-align: center; margin-top: 100px;}");
client.print("button {color: white; width: 100px; height: 100px;");
client.print("border-radius: 50%; margin: 20px; border: none; font-size: 20px; outline: none; transition: all 0.2s;}");
client.print(".red{background-color: rgb(196, 39, 39);}");
client.print(".green{background-color: rgb(39, 121, 39);}");
client.print(".blue {background-color: rgb(5, 87, 180);}");
client.print(".off{background-color: grey;}");
client.print("button:hover{cursor: pointer; opacity: 0.7;}");
client.print("");
client.print("");
client.print("ON");
client.print("OFF");
client.print("ON");
client.print("OFF");
client.print("ON");
client.print("OFF");
client.print("");
// The HTTP response ends with another blank line:
client.println();
// break out of the while loop:
break;
} else { // if you got a newline, then clear currentLine:
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
// Check to see if the client request was /X
if (currentLine.endsWith("GET /RH")) {
digitalWrite(LEDR, HIGH);
}
if (currentLine.endsWith("GET /RL")) {
digitalWrite(LEDR, LOW);
}
if (currentLine.endsWith("GET /GH")) {
digitalWrite(LEDG, HIGH);
}
if (currentLine.endsWith("GET /GL")) {
digitalWrite(LEDG, LOW);
}
if (currentLine.endsWith("GET /BH")) {
digitalWrite(LEDB, HIGH);
}
if (currentLine.endsWith("GET /BL")) {
digitalWrite(LEDB, LOW);
}
}
}
// close the connection:
client.stop();
Serial.println("client disconnected");
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
// print where to go in a browser:
Serial.print("To see this page in action, open a browser to http://");
Serial.println(ip);
}
```
连接开发板与电脑,选择对应的开发板型号、目标端口,上传项目至开发板即可,
打开串口监视器,即可获取当前通信网址和 LED 状态。
#### 效果
通过串口读取 IP 地址,手机或电脑连接相同的局域网,浏览器访问 IP 即可按钮控制对应颜色的 LED 点亮或熄灭。
- 2024-11-27
-
回复了主题帖:
【《人工智能实践教程》测评】Python 面向对象
freebsder 发表于 2024-11-27 11:38
python的没啥必要写吧,随便找一本python的书都比面向AI的书写的详细。
这本书就是基于Python的人工智能,所以前半部分都是关于Python的铺垫,面向对象这部分书里面介绍很详细,有好多例子验证,我帖子里没有具体展示出来,感兴趣的话可以看看原书,写得很不错!
- 2024-11-26
-
发表了主题帖:
【《人工智能实践教程》测评】卷积神经网络
# 【《人工智能实践教程》测评】卷积神经网络
### 全连接前馈神经网络
- 权重矩阵的参数非常多
- 局部不变性特征
- 自然图像中的物体都具有局部不变性特征
- 尺度缩放、平移、旋转等操作不影响其语义信息。
- 全连接前馈网络很难提取这些局部不变特征
### 卷积神经网络
- 卷积神经网络(Convolutional Neural Networks,CNN)
- 一种前馈神经网络
- 受生物学上感受野(Receptive Field)的机制而提出的
- 在视觉神经系统中,一个神经元的感受野是指视网膜上的特定区域,只有这个区域内的刺激才能够激活该神经元。
- 卷积神经网络有三个结构上的特性:
- 局部连接
- 权重共享
- 空间或时间上的次采样
### 卷积
- 卷积经常用在信号处理中,用于计算信号的延迟累积。
- 假设一个信号发生器每个时刻t产生一个信号xt ,其信息的衰减率为wk ,即在k−1个时间步长后,信息为原来的wk 倍
- 假设w1 = 1,w2 = 1/2,w3 = 1/4
- 时刻t收到的信号yt 为当前时刻产生的信息和以前时刻延迟信息的叠加。
### 卷积类型
- 卷积的结果按输出长度不同可以分为三类:
- 窄卷积:步长 � = 1 ,两端不补零 � = 0 ,卷积后输出长度为 � − � + 1
- 宽卷积:步长 � = 1 ,两端补零 � = � − 1 ,卷积后输出长度 � + � − 1
- 等宽卷积:步长 � = 1 ,两端补零 � =(� − 1)/2 ,卷积后输出长度 �
- 在早期的文献中,卷积一般默认为窄卷积。
- 而目前的文献中,卷积一般默认为等宽卷积。
### 两维卷积
在图像处理中,图像是以二维矩阵的形式输入到神经网络中,因此我们需要二维卷积。
### 卷积神经网络
用卷积层代替全连接层
### 互相关
- 计算卷积需要进行卷积核翻转。
- 卷积操作的目标:提取特征。
- 翻转是不必要的!
- 互相关
### 多个卷积核
- 特征映射(Feature Map):图像经过卷积后得到的特征。
- 卷积核看成一个特征提取器
- 卷积层
- 输入:D个特征映射 M × N × D
- 输出:P个特征映射 M′ × N′ × P
### 汇聚层
- 卷积层虽然可以显著减少连接的个数,但是每一个特征映射的神经元个数并没有显著减少
### 卷积网络结构
- 卷积网络是由卷积层、汇聚层、全连接层交叉堆叠而成。
- 趋向于小卷积、大深度
- 趋向于全卷积
## 其他卷积
### 转置卷积/微步卷积
低维特征映射到高维特征
### 空洞卷积
- 如何增加输出单元的感受野
- 增加卷积核的大小
- 增加层数来实现
- 在卷积之前进行汇聚操作
- 空洞卷积
- 通过给卷积核插入“空洞”来变相地增加其大小。
## 典型卷积网络
### LeNet-5
- LeNet-5 是一个非常成功的神经网络模型。
- 基于 LeNet-5 的手写数字识别系统在 90 年代被美国很多银行使用,用来识别支票上面的手写数字。
- LeNet-5 共有 7 层。
### AlexNet
- 2012 ILSVRC winner
- (top 5 error of 16% compared to runner-up with 26% error)
- 第一个现代深度卷积网络模型
- 首次使用了很多现代深度卷积网络的一些技术方法
- 使用GPU进行并行训练,采用了ReLU作为非线性激活函数,使用Dropout防止过拟合,使用数据增强
- 5个卷积层、3个汇聚层和3个全连接层
### Inception网络
- 2014 ILSVRC winner (22层)
- 参数:GoogLeNet:4M VS AlexNet:60M
- 错误率:6.7%
- Inception网络是由有多个inception模块和少量的汇聚层堆叠而成。
### Inception模块 v1
- 在卷积网络中,如何设置卷积层的卷积核大小是一个十分关键的问题。
- 在Inception网络中,一个卷积层包含多个不同大小的卷积操作,称为Inception模块。
- Inception模块同时使用1 × 1、3 × 3、5 × 5等不同大小的卷积核,并将得到的特征映射在深度上拼接(堆叠)起来作为输出特征映射。
### Inception模块 v3
- 用多层的小卷积核来替换大的卷积核,以减少计算量和参数量。
- 使用两层3x3的卷积来替换v1中的5x5的卷积
- 使用连续的nx1和1xn来替换nxn的卷积。
### 残差网络
- 残差网络(Residual Network,ResNet)是通过给非线性的卷积层增加直连边的方式来提高信息的传播效率。
- 假设在一个深度网络中,我们期望一个非线性单元(可以为一层或多层的卷积层)f(x,θ)去逼近一个目标函数为h(x)。
- 将目标函数拆分成两部分:恒等函数和残差函数
### ResNet
- 2015 ILSVRC winner (152层)
- 错误率:3.57%
## 卷积的应用
### AlphaGo
- 分布式系统:1202 个CPU 和176 块GPU
- 单机版:48 个CPU 和8 块GPU
- 走子速度:3 毫秒-2 微秒
### 目标检测(Object Detection)
### Mask RCNN
实例分割算法
### OCR
### 图像生成
### Deep Dream
### 画风迁移
### 对抗样本
-
发表了主题帖:
【《人工智能实践教程》测评】神经网络
# 【《人工智能实践教程》测评】神经网络
### 神经网络概述
人工智能的一个子领域
神经网络:一种以(人工)神经元为基本单元的模型
深度学习:一类机器学习问题,主要解决贡献度分配问题。
### 概括
### 预备知识
- 线性代数
- 微积分
- 数学优化
- 概率论
- 信息论
### 人工智能
- 人工智能(artificial intelligence,AI)就是让机器具有人类的智能。
- “计算机控制”+“智能行为”
- 人工智能这个学科的诞生有着明确的标志性事件,就是1956年的达特茅斯(Dartmouth)会议。在这次会议上,“人工智能”被提出并作为本研究领域的名称。
### 图灵测试
“一个人在不接触对方的情况下,通过一种特殊的方式,和对方进行一系列的问答。如果在相当长时间内,他无法根据这些问题判断对方是人还是计算机,那么就可以认为这个计算机是智能的”。
—— Alan Turing [1950]《Computing Machinery and Intelligence》
### 人工智能的研究领域
- 让机器具有人类的智能
- 机器感知(计算机视觉、语音信息处理)
- 学习(模式识别、机器学习、强化学习)
- 语言(自然语言处理)
- 记忆(知识表示)
- 决策(规划、数据挖掘)
### 发展历史
### 芒果机器学习
- 从市场上随机选取的芒果样本(训练数据),列出每个芒果的所有特征:
- 如颜色,大小,形状,产地,品牌
- 以及芒果质量(输出变量):
- 甜蜜,多汁,成熟度。
- 设计一个学习算法来学习芒果的特征与输出变量之间的相关性模型。
- 下次从市场上买芒果时,可以根据芒果(测试数据)的特征,使用前面计算的模型来预测芒果的质量。
如何开发一个人工智能系统?
### 深度学习
#### 机器学习
当我们用机器学习来解决一些模式识别任务时,一般的流程包含以下几个步骤:
浅层学习(Shallow Learning):不涉及特征学习,其特征主要靠人工经验或特征转换方法来抽取。
#### 语义鸿沟:人工智能的挑战之一
- 底层特征 VS 高层语义
- 人们对文本、图像的理解无法从字符串或者图像的底层特征直接获得
- 表示学习
- 数据表示是机器学习的核心问题。
- 特征工程:需要借助人类智能
- 表示学习
- 如何自动从数据中学习好的表示
- 难点
- 没有明确的目标
#### 什么是好的数据表示?
“好的表示”是一个非常主观的概念,没有一个明确的标准。
但一般而言,一个好的表示具有以下几个优点:
- 应该具有很强的表示能力。
- 应该使后续的学习任务变得简单。
- 应该具有一般性,是任务或领域独立的。
### 语义表示
如何在计算机中表示语义?
局部(符号)表示(知识库、规则)到
分布式表示(嵌入:压缩、低维、稠密向量)
### 表示形式
- 局部表示
- 离散表示、符号表示
- One-Hot向量
- 分布式(distributed)表示
- 压缩、低维、稠密向量
### 词嵌入(Word Embeddings)
### 表示学习与深度学习
一个好的表示学习策略必须具备一定的深度
- 特征重用
- 指数级的表示能力
- 抽象表示与不变性
- 抽象表示需要多步的构造
### 传统的特征提取
- 特征提取
- 线性投影(子空间)
- PCA、LDA
- 非线性嵌入
- LLE、Isomap、谱方法
- 自编码器
- 特征提取VS表示学习
- 特征提取:基于任务或先验对去除无用特征
- 表示学习:通过深度模型学习高层语义特征
### 深度学习
通过构建具有一定“深度”的模型,可以让模型来自动学习好的特征表示(从底层特征,到中层特征,再到高层特征),从而最终提升预测或识别的准确性。
### 神经网络
如何学习?
赫布法则 Hebb's Rule
“当神经元 A的一个轴突和神经元B很近,足以对它产生影响,并且持续地、重复地参与了对神经元B的兴奋,那么在这两个神经元或其中之一会发生某种生长过程或新陈代谢变化,以致于神经元A作为能使神经元B兴奋的细胞之一,它的效能加强了。”
——加拿大心理学家Donald Hebb,《行为的组织》,1949
1. 人脑有两种记忆:长期记忆和短期记忆。短期记忆持续时间不超过一分钟。
2. 如果一个经验重复足够的次数,此经验就可储存在长期记忆中;
3. 短期记忆转化为长期记忆的过程就称为凝固作用;
4. 人脑中的海马区为大脑结构凝固作用的核心区域。
### 人工神经元
### 人工神经网络
- 人工神经网络主要由大量的神经元以及它们之间的有向连接构成。因此考虑三方面:
- 神经元的激活规则
- 主要是指神经元输入到输出之间的映射关系,一般为非线性函数。
- 网络的拓扑结构
- 不同神经元之间的连接关系。
- 学习算法
- 通过训练数据来学习神经网络的参数。
- 人工神经网络由神经元模型构成,这种由许多神经元组成的信息处理网络具有并行分布结构。
- 虽然这里将 神经网络结构大体上分为三种类型,但是大多数网络都是复合型结构,即一个神经网络中包括多种网络结构。
### 神经网络
### 常用的深度学习框架
1. 简易和快速的原型设计
2. 自动梯度计算
3. 无缝CPU和GPU切换
-
发表了主题帖:
【《人工智能实践教程》测评】机器学习
# 【《人工智能实践教程》测评】机器学习
基础介绍包括三部分:
1.人工智能和机器学习
2.机器学习和数学
3.机器学习的应用
第二部分为机器学习的算法借介绍。
## 认识机器学习
### 机器学习和人工智能的区别
只要能让计算机模拟人类行为的技术,都叫人工智能
### 人工智能的分类领域
#### 图像识别应用领域
自动驾驶 -> 深度神经网络/图像识别/模式识别 -> 特斯拉,百度,xx汽车集团有限公司
图像识别/图像处理 -> 深度神经网络/LSTM -> 学科网,华为,大疆
工业自动化 -> 机器学习/图像识别 -> 三一重工,大学
光学影像 -> 深度学习/模式识别 -> 西工大博士 李学龙教授
……
#### NLP应用领域
(大)数据分析 -> 大数据(Hadoop/Spark/MR, 深度学习/LSTM, NLP)-> 字节跳动(互联网),汇丰、华为
文本分析 -> 模式识别/NLP/LSTM -> 爱彼迎,大众点评、SAP
……
#### 语音识别应用领域
个人助手 -> 深度学习 -> 苹果(Siri),微软(Cortana)
自动话务员 -> 深度学习/模式识别/LSTM -> 科大讯飞
声纹识别 -> 深度学习/LSTM -> SpeakIn
### 机器学习与人工智能
机器学习是现阶段人工智能的核心技术,是通过统计学原理,来对数据进行分析与建模
### 机器学习的基本方法 – 数据训练
逻辑推理和数据训练
机器学习的基本思想是通过大量数据的学习,找到一定的规律(这个规律就叫做模型),当有新数据出现时,把新数据带入模型
- 优点
- (1)速度快
- (2)高度抽象化,简单易用
- 缺点
- (1)极度依赖数据
- (2)模型的好坏至关重要
### 深度学习和普通机器学习的区别
通过更高的复杂度,加强了让机器自我归纳总结的能力,并且通过规则的设计,让算法的扩展性更大
普通机器学习算法:一般就一个公式,一层推导,比较直接
深度学习算法:多个公式,多层推导,层层递进
强化学习和普通机器学习的区别:强化学习模拟人的认知过程,加入评价体系
### 机器学习的基本步骤
### 机器学习主要涉及的数学知识
- 高等数学
- 线性代数
- 概率论与数理统计
### 概率与高斯分布函数
概率: 上帝的骰子
中心极限定理与高斯分布函数
中心极限定理:
在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,如果每个因素所产生的影响都很微小时,总的影响可以看作是服从正态分布的。
## 机器学习的算法
机器学习 ≈ 构建一个映射函数
- 机器学习:通过算法使得机器能从大量数据中学习规律从而对新的样本做决策。
- 规律:决策(预测)函数
### 机器学习的三要素
模型
- 线性方法:
- 广义线性方法:
如果 φ(x) 为可学习的非线性基函数,f(x,θ)就等价于神经网络。
- 学习准则
- 期望风险
- 优化
- 梯度下降
### 模型
以线性回归(Linear Regression)为例
模型:
- 损失函数
- 0-1损失函数
- 平方损失函数
### 学习准则
- 期望风险未知,通过经验风险近似
- 训练数据:
- 经验风险最小化
- 在选择合适的风险函数后,我们寻找一个参数θ^*^ ,使得经验风险函数最小化
- 机器学习问题转化成为一个最优化问题
### 梯度下降法( Gradient Descent )
- 学习率是十分重要的超参数!
### 随机梯度下降法
随机梯度下降法(Stochastic Gradient Descent,SGD)也叫增量梯度下降,每个样本都进行更新小批量(Mini-Batch)随机梯度下降法。
### 过拟合
过拟合:经验风险最小化原则很容易导致模型在训练集上错误率很低,但是在未知数据上错误率很高。
过拟合问题往往是由于训练数据少和噪声等原因造成的。
### 泛化错误
期望风险不等于经验风险
如何减少泛化错误?
- 优化 —— 经验风险最小
- 正则化 —— 降低模型复杂度
正则化(regularization):所有损害优化的方法都是正则化。
- 增加优化约束——L1/L2约束、数据增强
- 干扰优化过程——权重衰减、随机梯度下降、提前停止
### 提前停止
我们使用一个验证集(Validation Dataset)来测试每一次迭代的参数在验证集上是否最优。
如果在验证集上的错误率不再下降,就停止迭代。
### 线性回归(Linear Regression)
模型:
增广权重向量和增广特征向量
#### 优化方法
经验风险最小化(最小二乘法)
结构风险最小化(岭回归)
最大似然估计
最大后验估计
### 经验风险最小化
最大似然估计
### 概率
概率(Probability):一个随机事件发生的可能性大小,为0到1之间的实数。
- 随机变量(Random Variable)
- 概率分布(Probability Distribution)
- 伯努利分布(Bernoulli Distribution)
- 二项分布(Binomial Distribution)
连续随机变量的概率分布一般用概率密度函数( Probability Density Function , PDF )描述
- 高斯分布(Gaussian Distribution)
- 条件概率(Conditional Probability)
- 贝叶斯公式
- 最大似然估计
- 最大后验估计
### 多项式回归
### 机器学习的几个关键点
常见的机器学习类型
如何选择一个合适的模型?
#### 模型选择
拟合能力强的模型一般复杂度会比较高,容易过拟合。
如果限制模型复杂度,降低拟合能力,可能会欠拟合。
- 偏差与方差分解
- 模型选择:偏差与方差
- 集成模型:有效的降低方差的方法
#### PAC学习
Probably Approximately Correct
根据大数定律,当训练集大小|D|趋向无穷大时,泛化错误趋向于0,即经验风险趋近于期望风险。
#### 样本复杂度
PAC学习理论可以帮助分析一个机器学习方法在什么条件下可以学习到一个近似正确的分类器。
如果希望模型的假设空间越大,泛化错误越小,其需要的样本数量越多。
### 归纳偏置(Inductive Bias)
- 很多学习算法经常会对学习的问题做一些假设,这些假设就称为归纳偏置。
- 在最近邻分类器中,我们会假设在特征空间中,一个小的局部区域中的大部分样本都同属一类。
- 在朴素贝叶斯分类器中,我们会假设每个特征的条件概率是互相独立的。
- 归纳偏置在贝叶斯学习中也经常称为先验(Prior)。
-
发表了主题帖:
【《人工智能实践教程》测评】Python 高级编程
# 【《人工智能实践教程》测评】Python 高级编程
### 类属性与实例属性
类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本。
在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数。
类方法是类对象所拥有的方法,需要用修饰器一般以 @classmethod 来标识其为类方法,
1. 对于类方法,第一个参数必须是类对象,作为第一个参数
(cls是形参, 可以修改为其它变量名,但最好用'cls'了)
2. 能够通过实例对象和类对象去访问。
静态方法需要用修饰器一般以 @staticmethod 来标识其为静态方法,
1. 静态方法不需要多定义参数
2. 能够通过实例对象和类对象去访问。
### property类属性
1. Python内置的@property装饰器就是负责把一个方法变成属性调用的;
2. @property本身又创建了另一个装饰器@state.setter,负责把一个 setter 方法变成属性赋值,于是,我们就拥有一个可控的属性操作.
3. @property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
### 单例模式
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
```python
# https://www.cnblogs.com/wozijisun/p/16635365.html
def singleton(cls):
_instance_dict = {} # 采用字典,可以装饰多个类,控制多个类实现单例模式
def inner(*args, **kwargs):
if cls not in _instance_dict:
_instance_dict[cls] = cls(*args, **kwargs)
return _instance_dict.get(cls)
return inner
@singleton
class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age
@singleton
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def get(self):
t1 = Teacher("aa",52)
return t1
# def __new__(cls, *args, **kwargs): # 将方法3的这部分代码搬到了函数装饰器中
# if not cls._instance:
# cls._instance = super().__new__(cls)
# return cls._instan
stu1 = Student('bb', 18)
stu2 = Student('jack', 18)
stu3 = Student('aaa', 19)
print(stu1 is stu3)
print(stu1.__dict__, stu3.__dict__)
t1 = Student('bb', 18).get()
t2 = Student('bb', 18).get()
print(t1 is t2)
```
装饰器(**decorator**)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例,代码如下:
-
发表了主题帖:
【《人工智能实践教程》测评】Python 面向对象
# 【《人工智能实践教程》测评】Python 面向对象
本文主要分为两部分,分别介绍面向对象和面向过程编程这两种基本编程思想。
Python 设计之初便是一种面向对象的语言。
## 面向对象编程
### 面向对象的基本特征
类(**Class**)是现实或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。
```c++
class Person: #定义一个人类
role = 'person' #人的角色属性都是人
def __init__(self,name):
self.name = name # 每一个角色都有自己的昵称;
def walk(self): #人都可以走路,也就是有一个走路方法
print("person is walking...")
print(Person.role) #查看人的role属性
print(Person.walk) #引用人的走路方法,注意,这里不是在调用
```
对象(**Object**)是具有类类型的变量。类和对象是面向对象编程技术中的最基本的概念。
```python
class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人
def __init__(self, name, aggressivity, life_value):
self.name = name # 每一个角色都有自己的昵称;
self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
self.life_value = life_value # 每一个角色都有自己的生命值;
def attack(self,dog):
# 人可以攻击狗,这里的狗也是一个对象。
# 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
dog.life_value -= self.aggressivity
```
用数学集合语言描述就是:对象包含于类,对象是类的子集。
**实例化**是指在面向对象的编程中,把用类创建对象的过程称为实例化。
实例化是将一个抽象的概念类,具体到该类实物的过程。实例化过程中一般由类名 对象名 = 类名(参数1,参数2...参数n)构成。
- 类(Class)是是创建实例的模板
- 对象(Object)是一个一个具体的实例
面向对象的三大特性是指:封装、继承和多态
### 封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。所以,在使用面向对象的封装特性时,需要:
1. 将内容封装到某处
2. 从某处调用被封装的内容
3. 通过对象直接调用被封装的内容: 对象.属性名
4. 通过self间接调用被封装的内容: self.属性名
5. 通过self间接调用被封装的内容: self.方法名()
对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。
### 继承特性
面向对象的三大特性是指:封装、继承和多态
1. 继承
2. 多继承
3. 私有属性与私有方法
继承描述的是事物之间的所属关系,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类、扩展类(Subclass),而被继承的class称为基类、父类或超类(Baseclass、Superclass)。
- 子类在继承的时候,在定义类时,小括号()中为父类的名字
- 父类的属性、方法,会被继承给子类。
多态(**Polymorphism**)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。通俗来说: 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
多态的好处就是,当我们需要传入更多的子类,只需要继承父类就可以了,而方法既可以直接不重写(即使用父类的),也可以重写一个特有的。这就是多态的意思。调用方只管调用,不管细节,而当我们新增一种的子类时,只要确保新方法编写正确,而不用管原来的代码。这就是著名的“开闭”原则:
- 对扩展开放(Open for extension):允许子类重写方法函数
- 对修改封闭(Closed for modification):不重写,直接继承父类方法函数
### 栈与队列的封装
#### 栈
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),
- 允许进行操作的一端称为“栈顶”,
- 另一固定端称为“栈底”,
- 当栈中没有元素时称为“空栈”。
向一个栈内插入元素称为是进栈,push;从一个栈删除元素称为是出栈,pop。
特点 :**后进先出**(LIFO)。
#### 队列
队列是限制在一端进行插入操作和另一端删除操作的线性表,
- 允许进行插入操作的一端称为“队尾”,
- 允许进行删除操作的一端称为“队头”,
- 当队列中没有元素时称为“空队”。
特点 :**先进先出**(FIFO)。
## 面向过程编程
### 基本特征
“面向过程”(**Procedure Oriented**)是一种以过程为中心的编程思想。
这些都是以什么正在发生为目标进行编程,不同于面向对象的是谁在受影响。
与面向对象明显的不同就是封装、继承、类。
- 特性:模块化 流程化
- 优点:性能比面向对象高, 因为类调用时需要实例化,开销比较大,比较消耗资源;
- 单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
- 缺点:没有面向对象易维护、易复用、易扩展
### 函数式编程
函数式编程是一种编程方式,它将电脑运算视为函数的计算。
函数编程语言最重要的基础是 λ 演算(**lambda calculus**),而且 λ 演算的函数可以接受函数当作输入(参数)和输出(返回值)。
主要思想: 把运算过程尽量写成一系列嵌套的函数调用。
> 面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
- 特性:抽象 封装 继承 多态
- 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,
- 可以设计出低耦合 的系统,使系统更加灵活、更加易于维护
- 缺点:性能比面向过程低
详见:[博客园](https://www.cnblogs.com/Eva-J/articles/7293890.html) .
- 2024-11-23
-
发表了主题帖:
【《人工智能实践教程》测评】Python 函数
# 【《人工智能实践教程》测评】Python 函数
## 函数
如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数。
> Tips: 如果一件事需要重复两遍以上,请务必编程完成……
函数这个数学名词是 **莱布尼茨 (Leibniz)** 在 1694 年开始使用的,以描述曲线的一个相关量,如曲线的斜率或者曲线上的某一点。莱布尼兹所指的函数现在被称作可导函数,数学家之外的普通人一般接触到的函数即属此类。对
于可导函数可以讨论它的极限和导数。此两者描述了函数输出值的变化同输入值变化的关系,是微积分学的基础。
中文的“函数”一词由清朝数学家**李善兰**译出。其《代数学》书中解释:
“凡此變數中函(包含)彼變數者,則此為彼之函數”。
## 定义一个函数
```python
def test(a,b):
"sum of a and b"
print("%d"%(a+b))
test(1,2)
```
输出 `3`
### 形参与实参
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”
```python
def area(width, height): # parameter
return width * height
w = 4 # argument
h = 5 # argument
print(area(w,h))
```
使用函数的好处:代码重用、便于修改、易于扩展。
## 函数的参数
### 参数检查
调用函数时,如果参数个数不对,Python 解释器会自动检查出来,并抛出 TypeError;
- 如果参数类型不对,Python 解释器就无法帮我们检查。
- 数据类型检查可以用内置函数 isinstance 实现。
### 默认参数
需求: 定义一函数,计算x值的n次方。那如果计算x平方时只需要传入x值时怎么解决?
- - 默认参数可以降低调用函数的难度。
- - 默认参数注意事项:
- - 有多个参数时,变化大放前面,变化小的放后面;
- - 必选参数在前,默认参数在后
默认函数容易出错点:
先定义一个函数,传入一个 list,添加一个 END 再返回.
### 可变参数
可变参数就是==传入的参数个数是可变的==,可以是 1 个、2 个到任意个,还可以是 0 个。
- 以数学题为例子,给定一组数字 a,b,c ..
- 请计算 a 2 + b 2 + c 2 + ..
如果已经有一个 list 或者 tuple,要调用一个可变参数怎么办?
1. Python 允许你在 list 或 tuple 前面加一个 * 号;
2. 把 list 或 tuple 的元素变成可变参数传进去;
```python
largs = [1,2,3]
func(largs[0],largs[1],largs[2])
func(*largs)
```
### 关键字参数
- 关键字参数允许传入 0 个或任意个含参数名的参数;
- 这些关键字参数在函数内部自动组装为一个 dict;
- 关键字参数用 **kwargs;
### 参数组合
- 参数组合是指可以必选参数、 默认参数、 可变参数和关键字参数一起使用。
- 参数定义的顺序必须是:必选参数、 默认参数、可变参数和关键字参数。
对于任意函数,都可以通过类似 `func(*args, **kw)` 的形式调用它。
## 匿名函数
匿名函数指一类无须定义标识符的函数或子程序。Python用 lambda 语法定义匿名函数,只需用表达式而无需申明。(省略了用def声明函数的标准步骤)
```python
# define anonymous function
sum = lambda arg1, arg2: arg1 + arg2
# call sum function
print("Value of total : ", sum(10,20))
print("Value of total : ", sum(20,20))
```
lambda 函数的语法只包含一个语句
```
lambda [arg1 [,arg2,...,argn]]:expression
```
lambda 函数能接收任何数量的参数但只能返回一个表达式的值
## 递归函数
已知: 函数可以调用函数。
结论: 一个函数在内部调用自己本身,这个函数就是递归函数。
例如:求阶乘
```python
def factorial(num):
"""递归方法求 num 的阶乘"""
result = 1
# product fo 1, 2, 3, ... , n
for item in range (1, num + 1):
# result
result *= item
return result
if __name__ == '__main__':
print("2! is ", factorial(2))
print("3! is ", factorial(3))
print("3! is ", factorial(5))
```
输出
## 练习
```
# 打印九九乘法表
for i in range(1,10):
for j in range(1,i+1):
print("{}*{} = {} \t".format(i,j,i*j),end=" ")
print()
```
### 效果
-
发表了主题帖:
【《人工智能实践教程》测评】分支与循环
# 【《人工智能实践教程》测评】分支与循环
官方配套视频教程 Bilibili 链接分享:[Python](https://www.bilibili.com/video/BV1RV4y1B7po?p=1&vd_source=311a862c74a77082f872d2e1ab5d1523) .
详见:[Gitee](https://gitee.com/shao1chuan/pythonbook) .
## 条件语句
if 语句基本形式
```python
if expression:
if_suite
```
if-else 语句
```python
if expression:
if_suite
else:
else_suite
```
if-elif-else 语句
```python
if expression1:
if_suite
elif expression2:
elif_suite
else:
else_suite
```
多个条件同时判断
```python
if_suite if expression1 else else_suite
```
## 循环语句
### for 循环
```
for expression:
suite_to_repeat
```
### while 循环
```
while expression:
suite_to_repeat
```
while 循环 continue 和 break 指令
break 用于跳出本层循环,continue 用于跳出当次循环
**举例**:求和 1+2+3+···+100,当 sum 大于1000 时停止循环并输出 sum 值
```python
count = 1
sum = 0
while count 1000:
break
count = count + 1
print(sum)
```
输出结果为 `1035`
### 嵌套循环
for 和 while 循环嵌套,for循环中嵌套 for 或 while 循环,while 循环中嵌套 for 或 while 循环
```python
for expression:
while expression:
statement(s)
statement(s)
```
## 随机数处理
导入工具包 random
```python
import random
```
语法:`random.randint(a, b)` 返回 [a,b] 区间的随机整数。