day 36打卡
day 24元组和os 模型
元组的特点:
1、有序,可以重复,这一点和列表一样
2、元组中的元素不能修改,这一点非常重要,深度学习场景中很多的参数,形状定义好了确保后续后续不能被修改。
很多流行的ML/dl库如(Tensorflow,pytorch,numpy)在其API 中都广泛使用了元组来表示形状、配置等。 可以看到,元组最重要的功能是在列表之上,增加了不可修改的这个需求。
元组的创建
my_tuple=(1,2,3)
my_tuple2=('a','b','c')
my_tuple3=(1,'hello',3.14,[4,5])# 包含不同类型的元素
print(my_tuple)
print(my_tuple2)
print(my_tuple3)# 省略括号
my_tuple4=10,20,'thirty'
print(my_tuple4)
print (type(my_tuple4))
# 创建空元组
empty_tuple=()
empty_tuple2=tuple()
print(empty_tuple)
print(empty_tuple2)元组的常见用法# 元组的索引
my_tuple=('p','y','t','h','o','n')
print(my_tuple[0])
print (my_tuple[2])
print (my_tuple[-1])
# 元组的切片
my_tuple=(0,1,2,3,4,5)
print (my_tuple[1:4])# 从索引1开始到3,不包含4
print(my_tuple[:3])
print (my_tuple[3:])
print(my_tuple[::2])#每隔一个元素取一个# 元组的长度获取
my_tuple = (1, 2, 3)
print(len(my_tuple))
管道工程中pipeline类接收的是一个包含多个小元组的列表作为输入。
可以这样理解这个结构
1、列表[]:定义了步骤执行的先后顺序,pipeline会按照列表只能够的顺序依次处理数据。之所以用列表,是未来可以对这个列表进行修改。
2、元组():用于将每个步骤的名称和处理对象捆绑在一起。名称用于在后续访问或设置参数时引用该步骤,而对象则是实际执行数据转换或模型训练的工具。固定操作名+操作。
不用字典是因为字典是无序的。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
# 1、加载数据
iris =load_iris()
X=iris.data
y=iris.target
#2、划分训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
# 3、创建pipeline
pipeline=Pipeline([('scaler',StandardScaler()),('classifier',LogisticRegression())
])
# 4、训练模型
pipeline.fit(X_train,y_train)
# 5、预测
y_pred=pipeline.predict(X_test)
# 6、评估
accuracy=accuracy_score(y_test,y_pred)
print(f"准确率:{accuracy}")
可迭代对象
可迭代对象是python中一个非常核心的概念。简单来说,一个可迭代对象就是指的那些能够一次返回其成员的对象,让你可以在一个循环中遍历他们。
python 中有很多内置的可迭代对象,目前我们见过的类型包括:
序列类型:
列表(list)
元组(tuple)
字符串(str)
范围(range)
集合类型:
集合(set)
字典类型:
字典(dict)---迭代时返回键key
文件对象(file objects)
生成器(generators)
迭代器(iterators)本身# 列表
print ("迭代列表")
my_list = [1, 2, 3, 4, 5]
for item in my_list:print(item)
# 元组
print("迭代元组")
my_tuple = ('a', 'b', 'c')
for item in my_tuple:print(item)# 字符串
print("迭代字符串")
my_string = "hello"
for char in my_string:print(char)
# range (范围)
print("迭代 range")
for number in range(5):print(number)
# 集合类型
print("迭代集合")
my_set={3,1,4,1,5,9}
for item in my_set:print(item)
# 字典
print("迭代字典")
my_dict={'name':'Alice','age':30,'city':'Singapore'}
for key in my_dict:print(key)
# 迭代字典的值
print ("迭代字典的值")
for value in my_dict.values():print(value)
# 迭代字典的键值对
print("迭代字典的键值对")
for key,value in my_dict.items():print(key,value)
os 模块
随着深度学习项目变得越来越大,代码结构越来约复杂,你会越来越繁琐的用到os 模块来管理文件,目录、路径等。以及进行一些基本的操作系统交互。
虽然深度学习的核心在于模型的构建和训练,但数据和模型的有效管理是项目成功的关键环节,而os 模块为此提供了重要的工具。
在简单入门项目中,你可能只需要使用pd.read_csv() 加载数据,而不需要直接操作文件路径。但是,当你开始处理图像数据集、自定义数据加载流程、保存和加载复杂的模型结构时,os 模块就会变得非常有用。
好的代码组织和有效的文件管理时大型深度学习项目基石。os 模块是实现这些项目的重要组成部分。
import os
# os 是系统内置模块,无需安装
# 获取当前目录
os.getcwd()# 获取当前目录下的文件列表
os.listdir()环境变量方法# os.environ 获取环境变量
os.environ# 使用 items()方法可以方便地同时获取变量名,和变量值,之前已经提过字典的items()方法,可以去键和值
for variable_name,value in os.environ.items():print(f"{variable_name}:{value}")print (f"\n ---总检测到{len(os.environ)}个环境变量")目录树
os.walk()是python os 模块中一个非常有用的函数,遍历一个目录树
核心功能:
os.walk(top,topdown=true,onerror=None,followlinks=False)会为一个目录生成文件名,对于树中的每个目录,她会yield一个包含三个元素的元组:
1、dirpath 一个字符串,表示当前正在访问目录的路径
2、dirnames:一个列表,包含了dirpath 目录下所有子目录的名称
3、filenames:一个列表,包含了dirpath 目录下所有文件的名称
总结:
os.walk()会首先访问起始目录(my_project),然后选择第一个目录(data)并深入进去,访问data本身,然后继续深入它的子目录。只有当data 分支下的所有内容都被访问完毕后,她才回到my_project 这一层,去访问下一个子目录(src)并对src 分支重复深度优先的探索。
他不是按层级进行的,而是按分支深度进行的。
import os
start_directory = os.getcwd()
print (f"--------开始遍历目录:{start_directory}")
for dirpath, dirnames, filenames in os.walk(start_directory):print(f"当前目录:{dirpath}")print(f"子目录:{dirnames}")print(f"文件:{filenames}")print("------------------")
@ 浙大疏锦行