#Keras Invalid reduction dimension 2 for input with 2 dimensions.

在跑Bert-CRF的时候发现公司的电脑带不动,就把Bert改成了BiLSTM,因为之前没有试过中文命名实体识别的代码,所以出了一个小失误…花了半天才发现(这里用了(双向)最大熵隐马尔可夫模型,作用和用法都类似CRF,但是比CRF更快更简单。)

原代码如下:

	input_id = Input(batch_shape=(None, None), )
    x = Embedding(21128, 8)(input_id)
    x = Bidirectional(LSTM(256))(x)
    x = Dropout(0.3)(x)
    x = Dense(1)(x)
    output = Dense(len(categories) * 2 + 1)(x)
    MME = MaximumEntropyMarkovModel(lr_multiplier=crf_lr_multiplier)
    crf = CRF(7, sparse_target=True)
    output = MME(output)

    model = Model(input_id, output)
    model.summary()
    model.compile(
        loss=MME.sparse_loss,
        optimizer=Adam(learning_rate),
        metrics=[MME.sparse_accuracy]
    )

这里用的是苏剑林老师的bert4keras(苏老师很厉害!),一直报错:

ValueError: Invalid reduction dimension 2 for input with 2 dimensions. 
for 'metrics/sparse_accuracy/All' (op: 'All') with input shapes: [?,7], [] and with computed input tensors: input[1] = <2>.

因为一直跑不痛就去看了别人的代码是怎么用keras构建的,结果model.summary之后才发现…CRF层要接收的参数是三维的,也就是说,LSTM层要return_sequences=True

改了之后问题迎刃而解

	input_id = Input(batch_shape=(None, None), )
    x = Embedding(21128, 8)(input_id)
    x = Bidirectional(LSTM(256, return_sequences=False))(x)
    x = Dropout(0.3)(x)
    x = Dense(1)(x)
    output = Dense(len(categories) * 2 + 1)(x)
    MME = MaximumEntropyMarkovModel(lr_multiplier=crf_lr_multiplier)
    crf = CRF(7, sparse_target=True)
    output = MME(output)

    model = Model(input_id, output)
    model.summary()
    model.compile(
        loss=MME.sparse_loss,
        optimizer=Adam(learning_rate),
        metrics=[MME.sparse_accuracy]
    )

model.summary要这样的
Model: "model_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, None)              0         
_________________________________________________________________
embedding_1 (Embedding)      (None, None, 8)           169024    
_________________________________________________________________
bidirectional_1 (Bidirection (None, None, 512)         542720    
_________________________________________________________________
dropout_1 (Dropout)          (None, None, 512)         0         
_________________________________________________________________
dense_1 (Dense)              (None, None, 1)           513       
_________________________________________________________________
dense_2 (Dense)              (None, None, 7)           14        
_________________________________________________________________
maximum_entropy_markov_model (None, None, 7)           49        
=================================================================
Total params: 712,320
Trainable params: 712,320
Non-trainable params: 0
_________________________________________________________________
### 回答1: `tf.keras.Input`是一个用于定义模型输入的函数,它可以用于构建基于Keras的深度学习模型。它的作用是将输入数据的形状(shape)传递给模型,并给这个输入数据一个可读性强的名称。在使用`tf.keras.Input`函数时,需要指定输入数据的形状、数据类型和名称等参数。例如,下面的代码定义了一个输入形状为(32, 32, 3)的float32类型的张量,并命名为`input_tensor`: ```python import tensorflow as tf input_tensor = tf.keras.Input(shape=(32, 32, 3), dtype=tf.float32, name=&#39;input_tensor&#39;) ``` 在模型构建时,可以使用这个`input_tensor`作为模型的输入。例如,下面的代码构建了一个简单的全连接神经网络模型: ```python x = tf.keras.layers.Flatten()(input_tensor) x = tf.keras.layers.Dense(128, activation=&#39;relu&#39;)(x) output_tensor = tf.keras.layers.Dense(10, activation=&#39;softmax&#39;)(x) model = tf.keras.Model(inputs=input_tensor, outputs=output_tensor) ``` 这个模型的输入是`input_tensor`,输出是`output_tensor`。 ### 回答2: tf.keras.Input是TensorFlow中的一个函数,用于定义模型的输入层。 在使用tf.keras建立神经网络模型时,首先我们需要定义模型的输入。tf.keras.Input函数的作用就是为我们提供了一个方便的方法来定义模型的输入层。 它的用法如下: input = tf.keras.Input(shape=(input_shape,)) 其中,shape参数指定了输入层的形状。 具体来说,shape参数是一个元组,描述了输入张量的维度。例如,shape=(32, 32, 3)表示输入张量是一个三维张量,其中宽度为32,高度为32,通道数为3。 通过tf.keras.Input函数定义的输入层本质上是一个占位符,它没有实际的数值,只是用来占位。在模型训练时,我们会利用训练数据填充这个输入层。 在定义完输入层后,我们可以将输入层与其他层连接,构建一个完整的神经网络模型。例如: x = tf.keras.Conv2D(32, (3,3))(input) 这行代码表示将输入层与一个卷积层连接起来,其中卷积层的输出是一个32通道的特征图。 通过tf.keras.Input函数定义的输入层是通过函数式API的方式定义模型的输入。相比于Sequential模型,函数式API更加灵活,可以处理更加复杂的模型结构。 总之,tf.keras.Input函数是TensorFlow中用来定义模型输入层的一个函数,它通过shape参数来指定输入张量的形状,然后与其他层连接构建一个完整的神经网络模型。 ### 回答3: tf.keras.Input是TensorFlow中的一个函数,用于定义Keras模型的输入层。 在Keras中,每个模型都必须有一个输入层。输入层是模型的起点,它接收输入数据,并根据指定的形状将数据转换为张量。tf.keras.Input函数就是用来定义这个输入层的。 tf.keras.Input函数有以下参数: - shape:指定输入数据的形状。它是一个元组或列表,表示输入数据的每个维度的大小。例如,shape=(32,32,3)表示输入数据是一个32x32像素的RGB图像。 - dtype:指定输入数据的数据类型。默认为float32。 - sparse:指定输入是否稀疏。当输入数据是一个稀疏矩阵时,将sparse参数设置为True。默认为False。 - name:给输入层命名的字符串。 使用tf.keras.Input函数定义输入层后,我们可以将其作为Keras模型的第一层。例如: ``` input_layer = tf.keras.Input(shape=(32,32,3)) ``` 定义完输入层后,我们可以使用它作为其他层的输入,通过层与层之间的连接来构建模型。 通过tf.keras.Input函数定义输入层的好处是,我们可以更方便地将输入与其他层连接起来,而不需要明确地指定输入的形状和数据类型。Keras会根据输入层的定义自动识别并应用正确的转换。 总之,tf.keras.Input是TensorFlow中用于定义Keras模型的输入层的函数,它可以方便地定义输入的形状和数据类型,并作为模型的起点,连接其他的层构建整个模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值