gpt4 book ai didi

python - 带有 tensorflow 后端的张量数学

转载 作者:太空宇宙 更新时间:2023-11-03 14:51:35 25 4
gpt4 key购买 nike

我在使用 keras 训练 LSTM 时尝试添加自定义指标。请参阅下面的代码:

from keras.models import Sequential
from keras.layers import Dense, LSTM, Masking, Dropout
from keras.optimizers import SGD, Adam, RMSprop
import keras.backend as K
import numpy as np

_Xtrain = np.random.rand(1000,21,47)
_ytrain = np.random.randint(2, size=1000)

_Xtest = np.random.rand(200,21,47)
_ytest = np.random.randint(1, size=200)

def t1(y_pred, y_true):
return K.tf.count_nonzero((1 - y_true))

def t2(y_pred, y_true):
return K.tf.count_nonzero(y_true)

def build_model():
model = Sequential()
model.add(Masking(mask_value=0, input_shape=(21, _Xtrain[0].shape[1])))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))
rms = RMSprop(lr=.001, decay=.001)
model.compile(loss='binary_crossentropy', optimizer=rms, metrics=[t1, t2])
return model

model = build_model()

hist = model.fit(_Xtrain, _ytrain, epochs=1, batch_size=5, validation_data=(_Xtest, _ytest), shuffle=True)

上述代码的输出结果如下:

使用 1000 个样本进行训练,使用 200 个样本进行验证纪元 1/11000/1000 [================================] - 5s - 损失:0.6958 - t1:5.0000 - t2:5.0000 - val_loss:0.6975 - val_t1:5.0000 - val_t2:5.0000

所以看来方法 t1 和 t2 都产生完全相同的输出,这让我感到困惑。可能出了什么问题以及如何获得 y_true 的互补张量?

背景故事:我试图专门为我的模型编写自定义指标(F1 分数)。 Keras 似乎没有现成的东西。如果有人知道更好的方法,请帮助我指出正确的方向。

最佳答案

处理此问题的一种简单方法是使用回调。遵循此issue的逻辑,您可以指定一个指标回调来使用 sci-kit learn 计算任何指标。例如,如果您想计算 f1,您可以执行以下操作:

from keras.models import Sequential
from keras.layers import Dense, LSTM, Masking, Dropout
from keras.optimizers import SGD, Adam, RMSprop
import keras.backend as K
from keras.callbacks import Callback
import numpy as np

from sklearn.metrics import f1_score

_Xtrain = np.random.rand(1000,21,47)
_ytrain = np.random.randint(2, size=1000)

_Xtest = np.random.rand(200,21,47)
_ytest = np.random.randint(2, size=200)

class MetricsCallback(Callback):
def __init__(self, train_data, validation_data):
super().__init__()
self.validation_data = validation_data
self.train_data = train_data
self.f1_scores = []
self.cutoff = .5

def on_epoch_end(self, epoch, logs={}):
X_val = self.validation_data[0]
y_val = self.validation_data[1]

preds = self.model.predict(X_val)

f1 = f1_score(y_val, (preds > self.cutoff).astype(int))
self.f1_scores.append(f1)


def build_model():
model = Sequential()
model.add(Masking(mask_value=0, input_shape=(21, _Xtrain[0].shape[1])))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))
rms = RMSprop(lr=.001, decay=.001)
model.compile(loss='binary_crossentropy', optimizer=rms, metrics=['acc'])
return model

model = build_model()

hist = model.fit(_Xtrain, _ytrain, epochs=2, batch_size=5, validation_data=(_Xtest, _ytest), shuffle=True,
callbacks=[MetricsCallback((_Xtrain, _ytrain), (_Xtest, _ytest))])

关于python - 带有 tensorflow 后端的张量数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45869776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com