bojone / bert4keras

keras implement of transformers for humans
https://kexue.fm/archives/6915
Apache License 2.0
5.37k stars 929 forks source link

ImportError: cannot import name 'Loss' #344

Open lcynju opened 3 years ago

lcynju commented 3 years ago

提问时请尽可能提供如下信息:

基本信息

################################################ ########from bert4keras.layers import Loss就报错了 ####### ################################################

核心代码

# 请在此处贴上你的核心代码。
# 请尽量只保留关键部分,不要无脑贴全部代码。
from __future__ import print_function
import os
import numpy as np
from bert4keras.backend import keras, K
from bert4keras.layers import Loss
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer, load_vocab
from bert4keras.optimizers import Adam
from bert4keras.snippets import sequence_padding, open
from bert4keras.snippets import DataGenerator, AutoRegressiveDecoder
from keras.models import Model
..
..
..
class CrossEntropy(Loss):
    """交叉熵作为loss,并mask掉输入部分
    """
    def compute_loss(self, inputs, mask=None):
        y_true, y_mask, y_pred = inputs
        y_true = y_true[:, 1:]  # 目标token_ids
        y_mask = y_mask[:, 1:]  # segment_ids,刚好指示了要预测的部分
        y_pred = y_pred[:, :-1]  # 预测序列,错开一位
        loss = K.sparse_categorical_crossentropy(y_true, y_pred)
        loss = K.sum(loss * y_mask) / K.sum(y_mask)
        return loss

纯复用的你提供的seq2seq的例子。最奇怪的事情是,有些机器能跑起来。

输出信息

# 请在此处贴上你的调试输出
![image](https://user-images.githubusercontent.com/3223671/118588024-30847600-b7d0-11eb-9573-046fb504632d.png)

自我尝试

不管什么问题,请先尝试自行解决,“万般努力”之下仍然无法解决再来提问。此处请贴上你的努力过程。

说明:尝试了各种组合环境情况,还是这个错,不给我Import。

能是啥问题呢?郁闷

lcynju commented 3 years ago

实在没有办法,出去吃了个苹果。

回来找其他人的能运行的代码看看看,偶然发现,把他的代码直接复制到我的文件里,直接就报错了。

立刻想到,是不是我的文件路径有问题。我是把代码文件放在“seq2seq”的文件夹下,改了名字后,果然可以了。

泪流满面。

所以真的是“seq2seq”的文件名问题吗?还没有探究是什么原因。和库中有冲突?

bojone commented 3 years ago

我也没碰到过这么奇怪的问题~