IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Image数据数值计算处理的一个小问题 -> 正文阅读

[人工智能]Image数据数值计算处理的一个小问题

目录

1. 前言

2. 原始问题

3. 调试1

4. 调试2

5. 错误原因和正解


1. 前言

????????今天在做图像分类实验的手撕代码实验中碰到了一个非常无厘头的问题,折腾了两个小时,最后搞明白了错在哪儿了后,心中一万头草泥马奔腾而过。。。感觉自己就是一个智障。。。

????????记录于此,给自己提个醒。

????????背景是做一个图像分类器(Image classification)的代码实验,作为对比,先实现一个最naive的kNN分类器。在kNN分类器中需要求两个图像之间的距离,这里采用欧几里得距离。即各像素值的差的平方和的开方:

????????????????d(I_1,I_2) = \sqrt{\sum\limits_{i,j} (I_1[i,j] - I_2[i,j])^2}

2. 原始问题

? ? ? ? 以下代码中首先用加载cifar10数据集。然后将每个图像的数据由3维张量变为1维向量数据。然后取第一张图片计算两者之间的欧几里得距离。

? ? ? ? 顺便作为numpy的一个练习,采用几种不同的方法进行计算作为对比(应该庆幸做了这样一件多余的事。不做这个对比的话,就意识不到这个错误)。

import tensorflow.keras as keras
(X_train, y_train), (X_test, y_test) = keras.datasets.cifar10.load_data()
# Reshape the image data into rows
X_train = np.reshape(X_train, (X_train.shape[0], -1))
X_test = np.reshape(X_test, (X_test.shape[0], -1))
a = X_train[0,:10]
b = X_test[0,:10]
d = b-a
print('a =', a)
print('b =', b)
print('d = ',d)
print(np.linalg.norm(d))
print(np.sqrt(np.squeeze(np.dot(d,d.T))))
print(np.sqrt(np.dot(np.squeeze(d),np.squeeze(d))))
print(np.sqrt(np.sum(np.multiply(d,d))))
squ_sum = 0
for k in range(len(d)):
    squ_sum += d[k] * d[k]
print(np.sqrt(squ_sum))
print('')

? ? ? ? 结果如下:?

a = [59 62 63 43 46 45 50 48 43 68]
b = [158 112  49 159 111  47 165 116  51 166]
d =  [ 99  50 242 116  65   2 115  68   8  98]
340.68607250664064
9.95
9.95
33.51119216023208
33.51119216023208

? ? ? ? 咦,为什么结果不一致,竟然出来了三种结果???!!!

? ? ? ? 读者朋友们不妨自己想一想问题出在哪儿,然后再往下看^-^

3. 调试1

? ? ? ? 生成了一些随机数来测试这几种方法的一致性。

# case1
a = np.random.randn(1,10)
b = np.random.randn(1,10)
d = b-a
print(d)
print(np.linalg.norm(d))
print(np.sqrt(np.squeeze(np.dot(b-a,(b-a).T))))
print(np.sqrt(np.sum(np.multiply((b-a),(b-a)))))
print(np.sqrt(np.dot(np.squeeze(d),np.squeeze(d))))
print('')

?????????运行结果如下:

[[-1.63494836 -1.41606636 -1.31414425 -2.05088151  1.32989198 -1.66553675
   0.95680131 -0.98757441 -3.46276187 -1.07665464]]
5.4949697401612125
5.4949697401612125
5.4949697401612125
5.4949697401612125

? ? ? ? 没毛病,几种方法的结果是一致的。

4. 调试2

? ? ? ? 把上面图像数据直接进行赋给两个变量。

# case2
a = np.array([59, 62, 63, 43, 46, 45, 50, 48, 43, 68] )
b = np.array([158, 112,  49, 159, 111,  47, 165, 116,  51, 166])
d = b-a
print('d = ',d)
print(np.linalg.norm(d))
print(np.sqrt(np.squeeze(np.dot(d,d.T))))
print(np.sqrt(np.sum(np.multiply(d,d))))
print(np.sqrt(np.dot(np.squeeze(d),np.squeeze(d))))

? ? ? ? 运行结果如下:

d =  [ 99  50 -14 116  65   2 115  68   8  98]
240.20616145303185
240.20616145303185
240.20616145303185
240.20616145303185

? ? ? ? 也没毛病,4种计算方法的结果是一致的。

? ? ? ? BUT。。。等等!这个结果跟最初的几种不同的运算结果又不一致了。。。抓狂。

5. 错误原因和正解

? ? ? ? 现在记录下来只是一刹那的事情,但是真的折腾了很久才看出毛病来。

? ? ? ? 调试2中打印出来的d的数值与原始问题中打印出来的d的数值不一样(a和b是一样的)!注意到这里,瞬间就明白过来了,图像数据的原始数据类型是uint8,做减法后得到的仍然是unit8,所以本来做正常的有符号数减法应该出现负数的地方仍然是给出了uint8的正数!

? ? ? ? 修改最初的代码,将a和b的类型用过astype()重设为有符号整数。这样各种方法的结果就完全一致了。

import tensorflow.keras as keras
(X_train, y_train), (X_test, y_test) = keras.datasets.cifar10.load_data()
# Reshape the image data into rows
X_train = np.reshape(X_train, (X_train.shape[0], -1))
X_test = np.reshape(X_test, (X_test.shape[0], -1))
print(X_train.dtype,X_test.dtype)
a = X_train[0,:10].astype('int32')
b = X_test[0,:10].astype('int32')
d = b-a
print('a =', a)
print('b =', b)
print('d = ',d)
print(np.linalg.norm(d))
print(np.sqrt(np.squeeze(np.dot(d,d.T))))
print(np.sqrt(np.dot(np.squeeze(d),np.squeeze(d))))
print(np.sqrt(np.sum(np.multiply(d,d))))
squ_sum = 0
for k in range(len(d)):
    squ_sum += d[k] * d[k]
print(np.sqrt(squ_sum))
print('')

? ? ? ? 在机器学习中,一般来说图像数据加载进来后会先进行归一化处理,这个归一化过程(当然同样需要注意数据类型的指定)中就将数据变成了浮点数类型。平时看到这个处理基本上是无意识地跳过去了,不是做一下手撕代码的实验,真的意识不到这里居然会有这么一个坑在在这里。?正所谓:纸上得来终觉浅,绝知此事要躬行。。。

uint8 uint8
a = [59 62 63 43 46 45 50 48 43 68]
b = [158 112  49 159 111  47 165 116  51 166]
d =  [ 99  50 -14 116  65   2 115  68   8  98]
240.20616145303185
240.20616145303185
240.20616145303185
240.20616145303185
240.20616145303185

?

?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:05:07  更:2022-05-08 08:06:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:33:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码