every blog every motto: You can do more than you think.
0. 前言
制作样本标签中遇到问题的小结,有关softmax
1. 正文
1.1 遇到困难的代码
深度学习中所涉及到的数据有三个:
(x_train,y_train) =(样本,样本标签),还有一个y_predict(预测值)
深度学习的主要思想是根据样本标签(y_train,也称y_true)和预测值(y_predict)计算两者的差距,然后不断调整参数,使差距尽可能的小。
下面的代码就是因为样本标签(y_train,代码中的img_array,(208,208,3))不满足要求,要进行调整为((208,208,2))满足要求的 (这里用labels表示,和下面代码变量名一样,方便叙述)
目的:是将样本标签(y_trian)调整到适合和预测值(y_predict)计算的形状和值,即y_train => labels
说明: 不仅要调整形状,还要调整每个通道的值(原本标签中三个通道的值使相同的)
一句话概括:合并图层的逆操作(将一张合并的图层拆分成几个小图层)
# 生成标签,标签的shape是(208,208,class_numbers)=(208,208,2),里面的值全为0
labels = np.zeros((int(HEIGHT / 2), int(WIDHT / 2), CLASS_NUMBERS))
print('label shape: ',labels.shape)
# 下面将(208,208,3) => (208,208,2)
for cn in range(CLASS_NUMBERS): # range(0,2) => 0,1
# 标签数组中,斑马线的值为1,其他为0 (三个通道值相同!!!),所以下面选第0通道
# (img_array[:, :, 0]==cn) ,(208,208)里面的值,如果和cn
labels[:, :, cn] = (img_array[:, :, 0]==cn).astype(int)
labels = np.reshape(labels,(-1,CLASS_NUMBERS)) # (208,208,2)=>(208*208,2)
标签数据,如下图:
下面的数据其实使有值的,只是看不出。为什么呢?
根据分类数的不同,像元值(范围)也不同。比如:分4类。背景为0,像元值也为0,第一类像元值为1,依次类推。只是这里举例说的单通道。
比如,下面某一个像元的为第2类(背景和斑马线)。背景(三个通道的)值为000,斑马线(三个通道的)值为111(R:1;G:1;B:1,每个通道都是1). 所以这是一张肉眼无法分辨的有数值的图像。
1.2 举例说明
y_train(代码中的img_array) 三个通道 (可以把通道看作是图层) 中的值相同,下面以0通道为例:
这是一张2 * 2的图片,其中1代码斑马线,0代表背景。剩余两个通道中的值和这一样。
下面是生成的labels 数组(通道数为2),
labels = np.zeros((2,2,2))
涉及的代码如下:
# 下面将(208,208,3) => (208,208,2)
for cn in range(CLASS_NUMBERS): # range(0,2) => 0,1
# 标签数组中,斑马线的值为1,其他为0 (三个通道值相同!!!),所以下面选第0通道
# (img_array[:, :, 0]==cn) ,(208,208)里面的值,如果和cn
labels[:, :, cn] = (img_array[:, :, 0]==cn).astype(int)
cn取值分别为0,1(因为CLASS_NUMBERS=2,分两类)
img_array = np.ones((2,2,2))
img_array[1,1] = 0
img_array[:,:,0]
打印第0通道:
当cn=0,时,和0比较,如下:
t = img[:,:,0] == 0
将True或False转成1或0:
t.astype(int)
将结果,赋值给labels的第0通道
labels[:, :, 0] = t
当 cn =1 时,
t = img[:,:,0] ==1
T/F转成称1/0,如下图
t.astype(int)
将结果赋值给labels的第1通道
labels[:, :, 1] = t
可用的labels为:
图像上的变化,如下图:
初始标签(img_array)三个通道上的值是相同的,经过转换后,第0通道(代表背景)上背景位置(右下角)值为1,第1通道(代表斑马线)上斑马线位置(其余三个)的值为1。
至此, 完成。相当于把合并在一张图层上的值,分成两个图层(再经过softmax)。和预测的y_predict现在可以进行交叉熵计算了。