Python MNIST上的转移学习:错误标签错误
所以我在MNIST数据集上用tensorflow训练了一个感知器,但只训练了数字0到4。然后,我制作了一个新模型,所有层和权重都相同,但新的输出层也有5个输出节点。我想训练这个新模型把数字5到9分类 我生成了一个新的x_序列和y_序列,只有数字5到9,然后运行Python MNIST上的转移学习:错误标签错误,python,tensorflow,transfer-learning,Python,Tensorflow,Transfer Learning,所以我在MNIST数据集上用tensorflow训练了一个感知器,但只训练了数字0到4。然后,我制作了一个新模型,所有层和权重都相同,但新的输出层也有5个输出节点。我想训练这个新模型把数字5到9分类 我生成了一个新的x_序列和y_序列,只有数字5到9,然后运行 transfer\u model.fit(x\u train[train\u filter],y\u train[train\u filter],epoch=5) 其中列过滤器定义为np。其中(np.logical\u和(x\u列=9))
transfer\u model.fit(x\u train[train\u filter],y\u train[train\u filter],epoch=5)
其中列过滤器定义为np。其中(np.logical\u和(x\u列=9))
在培训的第一步,我遇到了以下错误:
InvalidArgumentError:收到的标签值为9,超出了[0,5]的有效范围。标签值:5 9 7 8 9 8 7 6 7 6 9 5 8 7 6 9 7 6 7 6 6
这是有意义的,因为我最初训练网络在[0,5]范围内进行分类,但现在我想在[5,10]范围内进行分类。我遗漏了一步吗?我不确定我遗漏了什么…我如何定义每个输出神经元对应的内容
以下是我的模型摘要:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_7 (Flatten) (None, 784) 0
_________________________________________________________________
dense_49 (Dense) (None, 100) 78500
_________________________________________________________________
batch_normalization_10 (Batc (None, 100) 400
_________________________________________________________________
dropout_5 (Dropout) (None, 100) 0
_________________________________________________________________
dense_50 (Dense) (None, 100) 10100
_________________________________________________________________
batch_normalization_11 (Batc (None, 100) 400
_________________________________________________________________
dropout_6 (Dropout) (None, 100) 0
_________________________________________________________________
dense_51 (Dense) (None, 100) 10100
_________________________________________________________________
batch_normalization_12 (Batc (None, 100) 400
_________________________________________________________________
dropout_7 (Dropout) (None, 100) 0
_________________________________________________________________
dense_52 (Dense) (None, 100) 10100
_________________________________________________________________
batch_normalization_13 (Batc (None, 100) 400
_________________________________________________________________
dropout_8 (Dropout) (None, 100) 0
_________________________________________________________________
dense_53 (Dense) (None, 100) 10100
_________________________________________________________________
batch_normalization_14 (Batc (None, 100) 400
_________________________________________________________________
dropout_9 (Dropout) (None, 100) 0
_________________________________________________________________
dense_55 (Dense) (None, 5) 505
=================================================================
Total params: 121,405
Trainable params: 505
Non-trainable params: 120,900
_________________________________________________________________
您需要将5-9映射到0-4。类标签可能是通过一个热编码完成的,您有5个唯一的标签,因此它只需要一个长度为5的向量来表示它。但是由于标签是5-9,它将超出范围。您不需要调整模型,只需将一个映射添加到标签输出。由于您使用
numpy
,您可以尝试f滚滚
将tensorflow导入为tf
将numpy作为np导入
arr=np.数组([5,6,7,8,9,8,7,6,5])
arr=tf.one_hot(arr,10,axis=0).numpy()
arr=arr[5:]
argmax(arr.numpy()#返回数组([0,1,2,3,4,3,2,1,0])
或者使用tf.map\u fn
arr=np.数组([5,6,7,8,9,8,7,6,5])
tf.map_fn(lambda x:x-5,arr).numpy()#数组([0,1,2,3,4,3,2,1,0])
有道理,但我应该在我的keras代码的哪一点上做这个映射?我假设keras对此有一些东西,但我不知道具体是什么。将映射查找添加到dataloader部分,例如,当您获取数据和标签时,将标签映射到相应的0索引值。然后在查看输出时,使用反向映射将输出映射回to适当的标签。