当前位置: 首页 > article >正文

半导体数据分析: 玩转WM-811K Wafermap 数据集(二) AI 机器学习

一、数据集回顾

前面我们已经基本了解了WM-811K Wafermap 数据集,并通过几段代码,熟悉了这个数据集的数据结构,这里为了方便各位连续理解,让我们再回顾一下:

WM-811K Wafermap 数据集是一个在半导体制造领域广泛使用的公开数据集,主要用于晶圆缺陷模式识别和分析。该数据集包含了大量晶圆图(wafer maps),这些图展示了半导体制造过程中晶圆上的缺陷分布情况。以下是该数据集的一些关键信息:

数据集概述

  • 数据量:WM-811K 数据集包含约 811,457 张晶圆图。

  • 缺陷类型:数据集中标注了多种常见的缺陷模式,如中心缺陷、边缘缺陷、局部缺陷、环形缺陷等。

  • 应用场景:该数据集常用于机器学习、深度学习和模式识别任务,特别是在半导体制造中的缺陷检测和分类。

数据集结构

  • 晶圆图:每张晶圆图是一个二维矩阵,表示晶圆上的缺陷分布。

  • 标签:每张图都有对应的标签,标明缺陷的类型或模式。

  • 元数据:可能包含制造过程中的其他相关信息,如工艺参数、设备状态等。

应用

  • 缺陷分类:通过训练模型,自动识别和分类晶圆上的缺陷模式。

  • 质量控制:帮助制造商优化工艺,减少缺陷率,提高良品率。

  • 研究:用于学术研究和工业应用中的算法开发和验证。

以下是上次我们演示过的,数据集的最后5条记录:

如果你没有看过我之前的文章,建议先看一下:

半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习_wafer dataset-CSDN博客 我们接着上一篇文章来继续深入了解这个数据的结构和内容

二、基本统计

如果按照前面我们介绍的数据来计算,这个数据集收集自实际工厂的47,543个批次。但是,47,543个批次× 25个晶圆/批次=1,157,325张晶圆图比811,457张晶圆图要多出许多。为什么这个数据集实际只有811,457片wafer呢?

频次统计

从上面的图片看,每个批次(LOT)最多有25片Wafer(waferIndex <=25),so, 我们清楚地看到,最后两个批次分别是1片和2片。所以并不是每个Lot都有完整的25片wafer的!

我们通过下面的代码,来统计每个Lot中waferIndex的出现频率:

import pandas as pd  # 导入 Pandas 库,用于数据处理和分析
import numpy as np   # 导入 NumPy 库,用于科学计算和数组操作
import matplotlib.pyplot as plt  # 导入 Matplotlib 的 pyplot 模块,用于绘图
%matplotlib inline  # Jupyter Notebook 的魔法命令,使图形直接显示在 Notebook 中

# 定义数据文件的路径 -- 这是我自己的路径,每个人都不会相同,请注意
mp_file = "/data_disk/public_lib/wm811k_wafer_map/in/LSWMD.pkl"

# 使用 Pandas 读取 pickle 格式的数据文件,并将其加载到 DataFrame 中
df = pd.read_pickle(mp_file)

# 使用 NumPy 的 unique 函数统计 df.waferIndex 列中的唯一值及其出现次数
# uni_Index 是一个包含两个数组的元组:唯一值数组和对应的计数数组
uni_Index = np.unique(df.waferIndex, return_counts=True)

# 使用 Matplotlib 绘制柱状图
# uni_Index[0] 是 x 轴数据(唯一值),uni_Index[1] 是 y 轴数据(出现次数)
# color='gold' 设置柱状图颜色为金色,align='center' 使柱状图居中,alpha=0.5 设置透明度
plt.bar(uni_Index[0], uni_Index[1], color='gold', align='center', alpha=0.5)

# 设置图表的标题
plt.title("wafer Index distribution")

# 设置 x 轴的标签
plt.xlabel("index #")

# 设置 y 轴的标签
plt.ylabel("frequency")

# 设置 x 轴的范围为 0 到 26
plt.xlim(0, 26)

# 设置 y 轴的范围为 30000 到 34000
plt.ylim(30000, 34000)

# 显示绘制的图表
plt.show()

运行代码,显示如下:

从图中可以看出,并非所有批次都有完美的25片晶圆,这可能是由于传感器故障或其他未知问题造成的。换句话说,waferIndex 列的值可能不完整或不一致,这可能会影响后续的数据分析或建模。


所幸我们在分类中不需要索引特性,因此我们可以删除这个字段。

df = df.drop(['waferIndex'], axis = 1)

 所以你看到,我们这样就删除了这个字段:

新增字段

从上面的数据中,虽然从 wafer map 列中无法直接提取出很多有用的信息,但我们可以观察到每个晶圆图(wafer map)的尺寸(die size)是不同的。因此,让我们创建一个新的量 waferMapDim 来记录每个晶圆图的尺寸信息,以便后续分析或处理。

运行以下的代码:

import pandas as pd  # 导入 Pandas 库,用于数据处理和分析
import numpy as np   # 导入 NumPy 库,用于科学计算和数组操作

# 定义数据文件的路径
mp_file = "/data_disk/public_lib/wm811k_wafer_map/in/LSWMD.pkl"

# 使用 Pandas 读取 pickle 格式的数据文件,并将其加载到 DataFrame 中
df = pd.read_pickle(mp_file)

# 移除 DataFrame 中的 'waferIndex' 列,因为该列在当前任务中不需要
#这行代码删除了 df 中的 waferIndex 列。axis=1 表示删除的是列(axis=0 是删除行)。

df = df.drop(['waferIndex'], axis=1)

# 定义一个函数 find_dim,用于计算二维数组的尺寸
def find_dim(x):
    """
    计算二维数组的尺寸(行数和列数)。
    
    参数:
    x (np.array): 输入的二维数组。
    
    返回:
    tuple: 包含行数和列数的元组。
    """
    dim0 = np.size(x, axis=0)  # 计算数组的行数
    dim1 = np.size(x, axis=1)  # 计算数组的列数
    return dim0, dim1  # 返回行数和列数

# 对 DataFrame 中的 'waferMap' 列应用 find_dim 函数,计算每个晶圆图的尺寸,并将结果存储在新列 'waferMapDim' 中
df['waferMapDim'] = df.waferMap.apply(find_dim)

# 随机抽取 DataFrame 中的 5 行数据,用于查看结果 
df.sample(5)

代码释义:

这段代码的功能是读取数据集文件,处理其中的数据,并计算出每个“waferMap”列的维度信息。

1. 导入必要的库

import pandas as pd
import numpy as np
  • pandas 是一个强大的数据处理库,常用于数据清洗和分析。通过 pd 引用。
  • numpy 是一个用于科学计算的库,尤其擅长数组操作和数学计算。通过 np 引用。

2. 读取 .pkl 文件

mp_file = "/data_disk/public_lib/wm811k_wafer_map/in/LSWMD.pkl"
df = pd.read_pickle(mp_file)
  • mp_file 定义了文件的路径,LSWMD.pkl 是一个 pickle 文件,这个文件保存了数据。
  • pd.read_pickle(mp_file) 用于从 .pkl 文件中读取数据,并将其加载为一个 DataFramedf 是这个数据框。

3. 删除指定列

df = df.drop(['waferIndex'], axis=1)
  • 这行代码删除了 df 中的 waferIndex 列。axis=1 表示删除的是列(axis=0 是删除行)。

4. 定义函数 find_dim

def find_dim(x):
    dim0 = np.size(x, axis=0)
    dim1 = np.size(x, axis=1)
    return dim0, dim1
  • find_dim 是一个函数,用来计算输入对象 x 的维度。这个函数接受一个二维对象(如矩阵或数组)并返回其两个维度:
    • np.size(x, axis=0) 获取 x 的第一个维度(行数)。
    • np.size(x, axis=1) 获取 x 的第二个维度(列数)。

5. 应用 find_dim 函数到 waferMap

df['waferMapDim'] = df.waferMap.apply(find_dim)
  • df.waferMapDataFrame 中的 waferMap 列,假设它包含二维数组或类似的数据结构。
  • .apply(find_dim)find_dim 函数应用到 waferMap 列的每个元素上,计算每个元素的维度,并将结果存储在新的列 waferMapDim 中。

find_dim 函数被应用于 df.waferMap 列的每个元素。这里的关键是理解 .apply() 函数的工作原理。

详细解释:

  • df.waferMapDataFrame 中的一个列,假设它包含的是一系列二维数组或者列表(在你的数据中表现为嵌套的列表,如 [[0, 0, 0, 0, 0, 0, ...]])。每个元素对应一个 waferMap,即一个二维的矩阵或者数组。
  • df.waferMap.apply(find_dim) 会对 df.waferMap 列中的每个元素应用 find_dim 函数。

find_dim 函数的输入:

find_dim 函数的输入是 df.waferMap 列中的每个元素,也就是每个 waferMap。根据这些数据,这些 waferMap 看起来是二维的列表或数组。

举个例子:

  • 假设某个 waferMap 的值是:[[0, 0, 0], [1, 1, 1], [2, 2, 2]]
    • 这是一个 3 行 3 列的二维列表。
  • find_dim 函数会接收到这个二维列表,并计算它的维度:
    • np.size(x, axis=0) 会返回 3(行数)。
    • np.size(x, axis=1) 会返回 3(列数)。
    • 所以,find_dim 的返回值是 (3, 3)

6. 查看 df 的随机样本

df.sample(5)
  • df.sample(5) 随机选择 df 中的 5 行,并显示它们。这通常用于快速查看数据的样本。

这段代码的核心功能是处理二维数组(waferMap)并计算它们的维度信息。

 解释了这么多,上面的代码运行的结果如下图:

请注意最后的括号内的数值,也就是说代表了行和列的矩阵,表明了这片wafer的规模。

max(df.waferMapDim), min(df.waferMapDim)

最大和最小就出来了:

加上下面这段代码:

uni_waferDim=np.unique(df.waferMapDim, return_counts=True)
uni_waferDim[0].shape[0]

这行代码涉及到对 df.waferMapDim 列进行去重和计数操作,并访问其结果的一部分。

1. np.unique(df.waferMapDim, return_counts=True)

uni_waferDim = np.unique(df.waferMapDim, return_counts=True)
  • df.waferMapDimDataFrame 中的列,存储了每个 waferMap 的维度信息,例如 (88, 81)(35, 36) 等。
  • np.unique 是 NumPy 的一个函数,返回输入数组中唯一的元素,并可以计算每个唯一元素的出现次数。
    • df.waferMapDim 是要处理的输入数据。
    • return_counts=True 表示除了返回唯一元素本身,还会返回每个唯一元素的出现次数。

因此,uni_waferDim 会是一个元组,包含两个数组:

  • 第一个数组是所有 唯一的维度元组(如 (88, 81)(35, 36) 等)。
  • 第二个数组是每个唯一维度元组在 df.waferMapDim 中出现的次数。

例如,假设 df.waferMapDim 中有以下维度数据:

[(88, 81), (35, 36), (88, 81), (35, 36), (25, 27)]

np.unique 会返回:

uni_waferDim[0] = [(88, 81), (35, 36), (25, 27)]   # 唯一的维度元组
uni_waferDim[1] = [2, 2, 1]  # 每个维度元组出现的次数

2. uni_waferDim[0].shape[0]

uni_waferDim[0].shape[0]
  • uni_waferDim[0] 是返回的唯一维度元组的数组(例如 [(88, 81), (35, 36), (25, 27)])。
  • uni_waferDim[0].shape 返回的是这个数组的形状。在这个例子中,uni_waferDim[0] 是一个长度为 3 的数组,因此 uni_waferDim[0].shape 会返回 (3,)
  • .shape[0] 访问的是数组的第一个维度的大小,也就是数组的长度。在这个例子中,uni_waferDim[0].shape[0] 会返回 3,表示有 3 个唯一的维度元组。

uni_waferDim[0].shape[0] 的含义是 返回 waferMapDim 中唯一维度元组的数量。也就是说,统计 df.waferMapDim 列中有多少种不同的维度元组。例如,如果有 3 种不同的维度元组,结果就是 3

本例中结果是 632

就是说 唯一维度的元组的数量是 632种。

圆图的尺寸(或者说图像大小)并不总是相同的。我们注意到,数据集中有 632 种不同的尺寸。因此,为了统一输入的尺寸,必须进行数据转换(特征提取),这种方法将在后续章节中介绍。


http://www.kler.cn/a/469970.html

相关文章:

  • Flink概念知识讲解之:Restart重启策略配置
  • 黄仁勋演讲总结(2种显卡,1个开源大模型,1个数据采集平台)
  • 服务器等保测评审计日志功能开启(auditd)和时间校准
  • 51单片机——步进电机模块
  • thinkphp通过html生成pdf
  • Nginx——入门介绍、安装与核心配置文件结构(一/五)
  • ElasticSearch基础-文章目录
  • mapreduce 工作流程
  • 头歌python实验:网络安全应用实践-恶意流量检测
  • 【FTP 协议】FTP主动模式
  • Rabbitmq消息补偿机制
  • 【机器学习】从监督学习的懵懂起步至迁移学习的前沿瞭望
  • iOS - 自定义引用计数(MRC)
  • Cursor 实战技巧:好用的提示词插件Cursor Rules
  • 深度解读 “驭风行动”
  • Latex中inproceedings 和 article的区别
  • 【wiki知识库】08.添加用户登录功能--后端SpringBoot部分
  • mac 使用zip2john破解zip压缩包密码
  • Ruby语言的编程范式
  • idea全局替换显示不全(ctrl+shift+R)
  • Teleport 传送
  • 前端开发中页面优化的方法
  • LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库
  • unity3d——3D动画学习day01 状态机相关参数
  • HackMyVM-Always靶机的测试报告
  • Linux文件系统权限