首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras loss收敛到const

Keras loss收敛到const
EN

Stack Overflow用户
提问于 2017-12-27 02:52:28
回答 1查看 131关注 0票数 0

我显然不理解一些东西(第一个Keras玩具)

我的输入x,y,x是一维实数,y是一个标量,我想预测y是正数还是负数。一种方法是编码为一个热,并使用categorical_cross_entropy (它可以工作),另一种方法是使用一个客户损失函数,它做同样的事情(它不工作)我正在训练8个例子,并检查我是否可以过拟合。我的自定义函数停留在0.56

代码如下:

代码语言:javascript
复制
import keras.backend as K

def custom_cross_entrophy(y_true, y_pred):
    '''expected return'''
    return -(K.log(y_pred[:,0])*K.cast(y_true<=0, dtype='float32') 
            + K.log(y_pred[:,1])*K.cast(y_true>0, dtype='float32'))

def build_model(x_dim, unites, loss_fuc):
    model = Sequential()

    model.add(Dense(
        units=unites,
        activation='relu',
        input_shape=(x_dim,),
#         return_sequences=True
    ))
    model.add(Dense(
        units=2))
    model.add(Activation("softmax"))

    start = time.time()
    model.compile(loss=loss_fuc, optimizer="adam")
    print("Compilation Time : ", time.time() - start)
    return model

现在使用自定义来构建和运行模型

代码语言:javascript
复制
model = build_model(X_train.shape[1], 20, custom_cross_entrophy)
model.fit(X_train,y_train,
    batch_size=8,epochs=10000,
    validation_split=0.,verbose=0)
print model.evaluate(X_train, y_train, verbose=1)

#assert my custom_cross_entrophy is like catergorical_cross_entropy
pred = model.predict(X)
y_onehot = np.zeros((len(K.eval(y_true)),2))
for i in range(len(K.eval(y_true))):
    y_onehot[i,int(K.eval(y_true)[i]>0)]=1

print K.eval(custom_cross_entrophy(K.variable(y_train), K.variable(pred)))
print K.eval(categorical_crossentropy(K.variable(y_onehot), K.variable(pred)))

输出:

(‘编译时间:',0.06212186813354492) 8/8 ============================== - 0s 52ms/步0.562335193157

1.38629234 0.28766826 1.38613474 0.28766349 0.28740349 0.28795806 0.28766707 0.28768104

1.38629234 0.28766826 1.38613474 0.28766349 0.28740349 0.28795806 0.28766707 0.28768104

现在对Keras的损失进行同样的处理:

代码语言:javascript
复制
model = build_model(X_train.shape[1], 20, categorical_crossentropy)

model.fit(X_train,y_onehot,
    batch_size=8,epochs=10000,
    validation_split=0.,verbose=0)

print model.evaluate(X_train, y_onehot, verbose=1)

输出:(‘编译时间:',0.04332709312438965) 8/8 ============================== - 0s 34ms/step 4.22694138251e-05

这怎麽可能?损失在数学上应该是一样的,谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-12-27 03:02:22

不经意间,我会说你在做两种不同的评估:

代码语言:javascript
复制
print model.evaluate(X_train, y_train, verbose=1)
# ...
print model.evaluate(X_train, y, verbose=1)

但我不知道y和y_train中有什么,所以您可能需要更详细地说明您正在做什么以及如何拆分数据。尝试并运行:

代码语言:javascript
复制
print model.evaluate(X_train, y_onehot, verbose=1)

看看是不是打错了。

干杯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47982572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档