我有一个要从上面拍摄的葡萄园图像数据集,我想对其进行分类,有3个大类[地面,植物,葡萄园],其中一些分为几个子类:植物: [草,花],葡萄园:[健康,疾病A,疾病B]。我想设计一个具有三个输出的神经网络,问题是对于某些类别或子类(例如草),某些输出可能是不相关的(例如疾病输出)。这不是推理的问题,但是为了训练我的模型,我想找到正确的(多个)标签,例如,在计算草样的误差时,我不希望权重这些仅负责更新疾病输出。
我的想法是为每个类别3提供一个热矢量,如果分类输出不相关,则该热矢量将为零,例如,健康的葡萄园样本将被编码为[[0,0,1],[0, 0],[1,0,0]]和地面样本[[1,0,0],[0,0],[0,0,0]]。我认为这行得通,因为在计算地面样本的疾病/植物输出的误差梯度时,该梯度应为零。
但是,看起来用“将一个热标签归零”(对不起,这个名称...)计算出的误差的梯度实际上不是零。
import tensorflow as tf
import numpy as np
input_layer=tf.keras.layers.Input(shape=(128,128,3))
x=tf.keras.layers.Conv2D(8,kernel_size=(2,2),activation='relu')(input_layer)
x=tf.keras.layers.MaxPool2D(pool_size=(2,2))(x)
x=tf.keras.layers.Conv2D(16,kernel_size=(2,2),activation='relu')(x)
x=tf.keras.layers.MaxPool2D(pool_size=(2,2))(x)
x=tf.keras.layers.Conv2D(32,kernel_size=(2,2),activation='relu')(x)
x=tf.keras.layers.MaxPool2D(pool_size=(2,2))(x)
x=tf.keras.layers.Conv2D(32,kernel_size=(2,2),activation='relu')(x)
x=tf.keras.layers.MaxPool2D(pool_size=(2,2))(x)
x=tf.keras.layers.Conv2D(32,kernel_size=(2,2),activation='relu')(x)
x=tf.keras.layers.GlobalAveragePooling2D()(x)
output=tf.keras.layers.Dense(3,activation='softmax')(x)
model=tf.keras.Model(inputs=input_layer,outputs=output)
model.compile('sgd','binary_crossentropy')
X=np.random.randint(0,255,(1,128,128,3))
Y=np.zeros((1,3))
old_weights=model.layers[-1].get_weights()
model.train_on_batch(X,Y)
new_weights=model.layers[-1].get_weights()
print old_weights[0]-new_weights[0]
给我一个非零的张量,有人可以解释一下这里发生了什么吗?