python-2.7 - 在softmax层之前提取输出,然后手动计算softmax给出不同的结果

标签 python-2.7 machine-learning keras entropy softmax

我有一个经过训练的模型,可以将 RGB 值分为 1000 个类别。

#Model architecture
model = Sequential()
model.add(Dense(512,input_shape=(3,),activation="relu"))
model.add(BatchNormalization())
model.add(Dense(512,activation="relu"))
model.add(BatchNormalization())
model.add(Dense(1000,activation="relu"))
model.add(Dense(1000,activation="softmax"))

我希望能够在 softmax 层之前提取输出,以便我可以对模型内的不同类别样本进行分析。我想对每个样本执行softmax,并使用名为getinfo()的函数进行分析。

  1. 型号 最初,我将 X_train 数据输入 model.predict,以获得每个输入的 1000 个概率的向量。我对此数组执行 getinfo() 以获得所需的结果。

  2. 流行1 然后我使用 model.pop() 删除 softmax 层。我得到了弹出模型的新预测,并执行 scipy.special.softmax。然而,getinfo() 在此数组上产生完全不同的结果。

  3. 流行2 我编写了自己的 softmax 函数来验证第二个结果,并且我收到了与 Pop1 几乎相同的答案。

  4. 流行3 但是,当我简单地在没有 softmax 函数的情况下对 model.pop() 的输出计算 getinfo() 时,我得到与初始模型相同的结果。

data = np.loadtxt("allData.csv",delimiter=",")
model = load_model("model.h5")

def getinfo(data):
    objects = scipy.stats.entropy(np.mean(data, axis=0), base=2)
    print(('objects_mean',objects))
    colours_entropy = []
    for i in data:
        e = scipy.stats.entropy(i, base=2)
        colours_entropy.append(e)
    colours = np.mean(np.array(colours_entropy))
    print(('colours_mean',colours))
    info = objects - colours
    print(('objects-colours',info))
    return info

def softmax_max(data):
    # calculate softmax whilst subtracting the max values (axis=1)
    sm = []
    count = 0
    for row in data:
        max = np.argmax(row)
        e = np.exp(row-data[count,max])
        s = np.sum(e)
        sm.append(e/s)
    sm = np.asarray(sm)
    return sm

#model
preds = model.predict(X_train)
getinfo(preds)

#pop1
model.pop()
preds1 = model.predict(X_train)
sm1 = scipy.special.softmax(preds1,axis=1)
getinfo(sm1)

#pop2
sm2 = softmax_max(preds1)
getinfo(sm2)

#pop3
getinfo(preds1)

我期望从 Model、Pop1 和 Pop2 获得相同的输出,但从 Pop3 获得不同的答案,因为我在这里没有计算 softmax。我想知道问题是否出在 model.predict 之后计算 softmax ?我是否在 Model 和 Pop3 中得到相同的结果,因为 softmax 将值限制在 0-1 之间,因此对于 getinfo() 函数的目的,结果在数学上是等效的?

如果是这种情况,那么如何在 model.predict 之前执行 softmax?

我一直在绕圈子,所以任何帮助或见解将不胜感激。如果有任何不清楚的地方,请告诉我。谢谢!

最佳答案

model.pop() 不会立即生效。您需要再次运行 model.compile() 来重新编译不包含最后一层的新模型。

如果不重新编译,您实际上是在完全相同的模型上连续运行 model.predict() 两次,这解释了为什么 Model 和 Pop3 给出相同的结果。 Pop1 和 Pop2 给出了奇怪的结果,因为它们正在计算 softmax 的 softmax。

此外,您的模型没有将 softmax 作为单独的层,因此 pop 会去掉最后的整个 Dense 层。要解决此问题,请将 softmax 添加为单独的层,如下所示:

model.add(Dense(1000))           # softmax removed from this layer...
model.add(Activation('softmax')) # ...and added to its own layer

关于python-2.7 - 在softmax层之前提取输出,然后手动计算softmax给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58081650/

相关文章:

python - 在 cross_val_predict 之后对新文档进行分类

machine-learning - 在weka上使用j48进行分类

tensorflow - 训练损失在 12 个时期后增加

python-3.x - 在 Keras 中加载数据集时如何修复错误?

tensorflow - 神经网络框架和 RL 算法库有什么区别?

python - 访问函数的内部函数

python - 根据条件在 Pandas Dataframe 中插入行

python 错误: no module named pylab

python - python 中 'argv' 的确切术语是什么?

machine-learning - xgboost错误: Error in setinfo. xgb.DMAtrix(dmat,names(p),p[[1]]):标签的长度必须等于输入数据中的行数