我显然不明白(第一个Keras玩具)
我的输入x,y。 X是1D实数值,y是标量 我想预测y是正面还是负面。一种方法是编码为一个hot并使用categorical_cross_entropy(可行),另一种方法是使用相同的客户损失函数(不起作用) 我正在训练8个例子并检查我是否可以过度装备。我的自定义函数卡在0.56
以下是代码:
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
现在使用自定义
构建和运行模型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的损失做同样的事情:
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 /步 4.22694138251e-05
这怎么可能?损失在数学上应该是相同的 谢谢!
答案 0 :(得分:0)
在我的头脑中,我会说你正在进行两项不同的评估:
print model.evaluate(X_train, y_train, verbose=1)
# ...
print model.evaluate(X_train, y, verbose=1)
但我不知道y和y_train中有什么,所以你可能需要进一步扩展你正在做的事情以及你如何分割数据。 尝试并运行:
print model.evaluate(X_train, y_onehot, verbose=1)
看看它是否只是一个错字。
干杯