Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 精度度量因琐碎的自定义Keras损失函数而失败_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python 精度度量因琐碎的自定义Keras损失函数而失败

Python 精度度量因琐碎的自定义Keras损失函数而失败,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我在玩Keras模型上的自定义损耗函数。我的“自定义”损失似乎失败了(就准确性得分而言),即使我只使用返回原始keras损失的包装器 作为一个玩具示例,我正在使用Tensorflow/Keras教程,该教程在fashion MNIST数据集上使用了一个简单的NN,我将遵循相关的Keras和SO post 这就是模型: model=keras.Sequential([ keras.layers.Flatten(输入_形状=(28,28)), keras.layers.致密(128,活化='rel

我在玩Keras模型上的自定义损耗函数。我的“自定义”损失似乎失败了(就准确性得分而言),即使我只使用返回原始keras损失的包装器

作为一个玩具示例,我正在使用Tensorflow/Keras教程,该教程在fashion MNIST数据集上使用了一个简单的NN,我将遵循相关的Keras和SO post


这就是模型:

model=keras.Sequential([
keras.layers.Flatten(输入_形状=(28,28)),
keras.layers.致密(128,活化='relu'),
keras.层.致密(10,活化='softmax')
])
现在,如果我在
compile()
函数中将
sparse\u categorical\u crossentropy
作为字符串参数保留,则训练结果的准确率约为87%,这很好:

model.compile(优化器='adam',
损失=“稀疏”\u分类”\u交叉熵',
指标=[‘准确度’])
model.fit(序列图像、序列标签、时代=10)
测试损失,测试acc=模型。评估(测试图像,测试标签,详细=2)
打印(“\n测试精度:”,测试依据)
但当我创建一个简单的包装函数来调用keras的交叉熵时,我在训练集和测试集上都获得了约10%的准确率:

来自tensorflow.keras进口损失
定义我的损失(y_真,y_pred):
回报损失。稀疏的分类交叉熵(y_真,y_pred)
model.compile(优化器='adam',
损失=我的损失,
指标=[‘准确度’])
Epoch 1/10 60000/60000[============================================================-3s 51us/样本-损失:0.5030-精度:0.1032
Epoch 2/10 60000/60000[=======================================]-3s 45us/样本-损失:0.3766-精度:0.1035

测试准确度:0.1013


通过绘制一些图像并检查它们的分类标签,在每种情况下,结果看起来并没有什么不同,但打印的准确度是非常不同的。那么,是不是默认指标不能很好地处理自定义损失?我看到的是错误而不是准确性,这是不是一种情况?我在文档中遗漏了什么吗

编辑:两种情况下损失函数的值最终大致相同,因此确实进行了培训。准确性是故障点。

原因如下:
当您使用内置损耗并使用
loss='sparse\u category\u crossentropy'
时,使用的精度度量是
sparse\u category\u精度
,但当您使用自定义损耗函数时,使用的精度度量是
category\u精度

例如:

model.compile(optimizer='adam',
              loss=losses.sparse_categorical_crossentropy,
              metrics=['categorical_accuracy', 'sparse_categorical_accuracy'])
model.fit(train_images, train_labels, epochs=1)
'''
Train on 60000 samples
60000/60000 [==============================] - 5s 86us/sample - loss: 0.4955 - categorical_accuracy: 0.1045 - sparse_categorical_accuracy: 0.8255
'''


model.compile(optimizer='adam',
              loss=my_loss,
              metrics=['accuracy', 'sparse_categorical_accuracy'])
model.fit(train_images, train_labels, epochs=1)

'''
Train on 60000 samples
60000/60000 [==============================] - 5s 87us/sample - loss: 0.4956 - acc: 0.1043 - sparse_categorical_accuracy: 0.8256
'''
原因如下:
当您使用内置损耗并使用
loss='sparse\u category\u crossentropy'
时,使用的精度度量是
sparse\u category\u精度
,但当您使用自定义损耗函数时,使用的精度度量是
category\u精度

例如:

model.compile(optimizer='adam',
              loss=losses.sparse_categorical_crossentropy,
              metrics=['categorical_accuracy', 'sparse_categorical_accuracy'])
model.fit(train_images, train_labels, epochs=1)
'''
Train on 60000 samples
60000/60000 [==============================] - 5s 86us/sample - loss: 0.4955 - categorical_accuracy: 0.1045 - sparse_categorical_accuracy: 0.8255
'''


model.compile(optimizer='adam',
              loss=my_loss,
              metrics=['accuracy', 'sparse_categorical_accuracy'])
model.fit(train_images, train_labels, epochs=1)

'''
Train on 60000 samples
60000/60000 [==============================] - 5s 87us/sample - loss: 0.4956 - acc: 0.1043 - sparse_categorical_accuracy: 0.8256
'''

我对Keras的示例如何使用
稀疏\u分类\u交叉熵
作为
(n,10)
目标数组有点困惑。通常,“稀疏”表示它需要一个
(n,1)
数组。您是否尝试过
损失。分类交叉熵
?您应该使用
稀疏分类准确度
作为度量标准,而不是
准确度
@NicolasGervais,但目标数组确实是一个
(n,1)
数组。(如果通过
分类交叉熵
损失,错误消息也会这样说)@bit01您是对的,谢谢。我对Keras的示例如何使用
稀疏分类交叉熵
作为
(n,10)
目标数组有点困惑。通常,“稀疏”表示它需要一个
(n,1)
数组。您是否尝试过
损失。分类交叉熵
?您应该使用
稀疏分类准确度
作为度量标准,而不是
准确度
@NicolasGervais,但目标数组确实是一个
(n,1)
数组。(如果你通过了
categorical\u crossentropy
loss),错误消息也会这样说)@bit01你是对的,谢谢你清楚了。谢谢,很清楚。非常感谢。