[英]I'm trying something new with python but isn't working, can anyone help me figure out why the function only prints data[0]?
[英]Can't figure out why I'm only getting one value from predict function?
我已经使用keras层构建并训练了顺序二进制分类模型。 在我开始使用predict
方法之前,一切似乎都可以正常工作。 这个函数开始给我一个怪异的指数值,而不是两个类的概率。 这是我训练后在模型上使用预测方法后得到的
这个分类模型有两个类别,假设是猫还是狗,所以我期望结果类似于[99.9999,0.0001],暗示它是猫。 我不确定如何解释我回来的价值。
这是我的代码:
# Get the data.
(train_texts, train_labels), (val_texts, val_labels) = data
train_labels = np.asarray(train_labels).astype('float32')
val_labels = np.asarray(val_labels).astype('float32')
# Vectorizing data
train_texts,val_texts, word_index = vectorize_data.sequence_vectorize(
train_texts, val_texts)
# Building the model architecture( adding layers to the model)
model = build_model.simple_model_layers(train_texts.shape[1:])
# Setting and compiling with the features like the optimizer, loss and metrics functions
model = build_model.simple_model_compile(model=model)
# This is when the learning happens
history = model.fit(train_texts,
train_labels,
epochs=EPOCHS,
validation_data=(val_texts, val_labels),
verbose=VERBOSE_OFF, batch_size=BATCH_SIZE)
print('Validation accuracy: {acc}, loss: {loss}'.format(
acc=history['val_acc'][-1], loss=history['val_loss'][-1]))
# loading data to predict on
test_text = any
with open('text_req.pickle', 'rb') as pickle_file:
test_text = pickle.load(pickle_file)
print('Lets make a prediction of this requirement:')
prediction = model.predict(test_text, batch_size=None, verbose=0, steps=None)
print(prediction)
这是简单模型函数的样子:
model = models.Sequential()
model.add(Dense(26, activation='relu', input_shape=input_shape))
model.add(Dense(16, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
return model
渐变目标函数:optimizer ='adam',损失='binary_crossentropy'
样本数据为String类型,我使用padding和all将其转换为1和0的恒定大小矩阵。 这些功能具有两个类别,因此标签仅是1和0。全部用于数据。 在我看来,数据似乎不是问题,它可能比我忽略但未能认识到的数据更琐碎。
谢谢大家,最后一个问题已解决,但是我需要对此有更好的理解:
我读到sigmoid
返回所有可能类的概率,所有概率应加起来为1。我得到的值是:
Validation accuracy: 0.792168688343232, loss: 2.8360600299145804
Let's make a prediction of this requirement:
[[2.7182817, 1. ]
[2.7182817, 1. ]
[1., 2.7182817]
[1. , 2.7182817]]
它们的总和不等于1,并且将这些值视为1,否则对其构成的直观性不够。
您的模型只有一个输出。 如果将训练标签的cat设置为0,将dog设置为1,则意味着如果输出为[[2.977094e-12]]
,则网络[[2.977094e-12]]
猫。 如果您希望像预期的那样获得两个类的概率,则需要按如下所示更改模型的输出:
model = models.Sequential()
model.add(Dense(26, activation='relu', input_shape=input_shape))
model.add(Dense(16, activation='relu'))
model.add(Dense(10, activation='relu')
model.add(Dense(2, activation='softmax'))
猫和狗的标签也需要分别更改为[1, 0]
和[0, 1]
。
我想澄清一下,您不会得到一个怪异的指数值,而只是得到了一个怪异的值。 E是x10的科学记数法,因此您基本上得到2.7 x 10 ^ -12。 我很乐意提供帮助,但是我无法检查您的数据或模型。 我试图对您的代码的某些部分进行Google搜索,希望能找到一些澄清,但似乎无法找出这两行的含义:
model = build_model.simple_model_layers(train_texts.shape[1:])
model = build_model.simple_model_compile(model=model)
我不知道已经建立了什么网络,我想至少知道损失函数和完整的最后一层,这已经很困难了。 您还确定数据正确吗?
编辑:
sigmoid不会执行您描述的操作,softmax会执行此操作。 Sigmoid通常用作多标签分类,因为它可以将多个标签检测为True。 乙状结肠输出可能看起来像[0.99,0.3],它具有分别查看每个标签的能力。 另一方面,Softmax却不是,softmax看起来像[0.99,0.01],所有概率的总和始终为1。
这就解决了混乱,现在关于您的输出,我不知道那是什么,它应该在1到0之间,除非我在这里丢失了一些东西。
为了回答您向K. Streutker提出的数据问题:神经网络的目标是在新数据上创建输入的标签。 如果需要概率分布,则还需要添加一个。 每个图像都应带有标签[1,0]和狗[0,1],或随意翻转。 然后,一旦训练好模型,便可以为您提供两个有意义的输出。 损失函数(很可能是交叉熵)会使用这些标签和模型的输出,并尝试使随时间的差异最小化。 因此,这就是您所需要的:
图片(狗)->模型->损失->优化器,用于更新权重
标签([0,1])------------------┘
然后预测会像这样
图片->模型->标签
希望我能有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.