Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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
收到的标签值1超出了[0,1]的有效范围-Python,Keras_Python_Machine Learning_Keras - Fatal编程技术网

收到的标签值1超出了[0,1]的有效范围-Python,Keras

收到的标签值1超出了[0,1]的有效范围-Python,Keras,python,machine-learning,keras,Python,Machine Learning,Keras,我正在使用keras和tensorflow背景制作一个简单的cnn分类器 def cnnKeras(training_data, training_labels, test_data, test_labels, n_dim): print("Initiating CNN") seed = 8 numpy.random.seed(seed) model = Sequential() model.add(Convolution2D(64, 1, 1, init='glorot_u

我正在使用keras和tensorflow背景制作一个简单的cnn分类器

def cnnKeras(training_data, training_labels, test_data, test_labels, n_dim):
  print("Initiating CNN")
  seed = 8
  numpy.random.seed(seed)
  model = Sequential()
  model.add(Convolution2D(64, 1, 1, init='glorot_uniform', 
   border_mode='valid',input_shape=(16, 1, 1), activation='relu'))
  model.add(MaxPooling2D(pool_size=(1, 1)))
  model.add(Convolution2D(32, 1, 1, init='glorot_uniform', 
   activation='relu'))
  model.add(MaxPooling2D(pool_size=(1, 1)))
  model.add(Dropout(0.25))
  model.add(Flatten())
  model.add(Dense(128, activation='relu'))
  model.add(Dropout(0.5))
  model.add(Dense(64, activation='relu'))
  model.add(Dense(1, activation='softmax'))
  # Compile model
  model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam', metrics=['accuracy'])
  model.fit(training_data, training_labels, validation_data=(
    test_data, test_labels), nb_epoch=30, batch_size=8, verbose=2)

  scores = model.evaluate(test_data, test_labels, verbose=1)
  print("Baseline Error: %.2f%%" % (100 - scores[1] * 100))
  # model.save('trained_CNN.h5')
  return None
这是一个二进制分类问题,但我不断收到消息
收到的标签值1超出了[0,1)
的有效范围,这对我来说没有任何意义。有任何建议吗?

范围[0,1)
表示0和1之间的每个数字,排除1。因此1不是范围内的值[0,1]


我不是100%确定,但问题可能是由于您选择了损失函数。对于二进制分类,
binary\u crossentropy
应该是一个更好的选择。

在您使用的上一个密集层
model.add(密集(1,activation='softmax'))
。这里1将其值限制在
[0,1)
将其形状更改为最大输出标签。例如,您的输出来自标签
[0,7)
,然后使用
模型。添加(稠密(7,activation='softmax'))

当我有类型为“float”的标签时,我遇到了这个问题,将它们转换为“int”,问题就解决了…

稀疏分类交叉熵的特性 损失函数稀疏\分类\交叉熵将分类器上下文中的最后一层解释为每个可能类的一组概率,并将输出值解释为类的数量(更详细一点)因此,将输出层中的x个神经元与0到x-1范围内的输出值进行比较;在输出层中只有一个神经元是一个“一元”分类器,这是没有意义的

如果这是一项分类任务,您希望以0到x-1的形式输出数据,那么您可以保持稀疏的分类交叉熵,但您需要将输出层中的神经元数量设置为您拥有的类的数量。或者,您可以将输出编码为一个热向量,并使用分类交叉熵损失函数离子而不是稀疏的分类交叉熵


如果这不是一项分类任务,并且你想像在回归中那样预测任意实数,那么分类交叉熵就根本不是一个合适的损失函数。

Cray和Shaili的答案是正确的! 我的结果范围从1到6, 这句话:

tf.keras.layers.Dense(6, activation = 'softmax') 
产生了错误信息,说事情超出了范围 [0,6]。我认为这是一个标签问题(是否所有值都存在于 培训和验证标签都有,并且正在鞭笞他们

)

错误在[0,4]范围内,您只需在类数(标签)中添加一个即可。 例如,更改此项:

layers.Dense(4)
致:


**与[0,1]相同。

这个问题的另一个可能答案是关于工作空间。如果它不是其他答案所建议的逻辑/稀疏性/熵错误,请继续阅读:

如果创建了一个工作空间来保存经过训练的模型的数据,则如果使用新样本(尤其是不同数量的文件夹)重新训练数据,并且使用文件夹作为分类标签,则旧工作空间数据可能会导致此错误

例子: 我在以下方面训练了我的原始设置:

当我尝试重新培训新样本集时:

我收到了错误消息:
收到的标签值为3,超出了[0,3]的有效范围。

这可能是因为旧样本集的4个文件夹的缓存值与新样本集的3个文件夹的缓存值造成了某种问题。我所能确定的是,一旦我从工作区中清除了旧信息,并再次运行,它就运行到完成。这是多次失败后的一个单独更改,因此我确信这就是解决问题的方法问题


免责声明:我正在使用C#和ML.NET,但它仍然使用TensorFlow,这是我们两个错误产生的地方,因此它应该绝对适用于这个问题。

根据文档(),这里1是输出维度(秩)而不是输出范围。因此,如果要预测第6个数字,其中训练数据为[1,2,3,4,5],有一个类别:[6],你的分类方法是什么?我假设保持分类交叉熵,在这种特定情况下,“一元”分类器可能有意义。如果这是一项分类任务,那么你正在学习(即调整)一个函数的参数,其中一组可能的输出(即,在函数的技术数学定义中,函数的范围)是类别列表。如果只有一个类别,这是退化形式,其中范围由一个值组成,你有一个函数,根据定义,除了这个单一类别之外,它不能输出任何东西,不管它给出了什么输入,不管它是否经过训练,它总是输出唯一技术上可能的回答。因此,不,一元分类器永远没有意义,只是作为退化边情况的一个例子,从技术上讲,它可能算作“可学习函数”。这一评论似乎说明了对分类含义的一个基本误解——分类器将尝试预测(预定义的)一个可能的答案。如果只有一个类别,没有什么可预测的,就不可能给出错误的答案,因为没有其他答案是可能的——“有一个类别:[6]”字面上的意思是你在明确假设[6]是唯一可能的输出,不管怎样。并且“如果要预测第6个数字,其中训练数据为[1,2,3,4,5],并且有一个类别:[6]”——如果我将其理解为预测序列中的下一个数字的任务(因此它也必须适用于[11,12,13,14,15]->[16]),那么没有分类方法是合适的,因为(就像任何其他预测任意实数或自然数的任务)都不是一个分类问题,它违反了分类问题的核心假设。
layers.Dense(5)