【问题标题】:Tensorflow Model I/O question: Failed to find data adapter that can handle inputTensorflow Model I/O 问题:未能找到可以处理输入的数据适配器
【发布时间】:2020-10-14 07:15:59
【问题描述】:

这来自 Keras 文档示例:训练模型以计算 priority_score 以及要转发电子邮件的部门。

我以另一种方式实现模型,我可以编译它,但我无法训练模型。我猜这是模型 I/O 问题,即我需要提供正确格式的 I/O 数据。

ValueError: Failed to find data adapter that can handle input: (<class 'dict'> containing {"<class 'str'>"} keys and {"<class 'numpy.ndarray'>", '(<class \'list\'> containing values of types {"<class \'str\'>"})'} values), (<class 'dict'> containing {"<class 'str'>"} keys and {"<class 'numpy.ndarray'>"} values)

因为太长了,所以没有放在这个帖子的标题里。

我的模型有 3 个输入:

  • title_input:应该是单个字符串
  • body_input:应该是单个字符串
  • tags_input:12 个 0 或 1 的数组。例如,[0,1,0,1,0,0,0,0,0,1]

输出是:

  • 优先级:浮动
  • 部门:由 4 个 0,1 组成的数组。

问题

谁能告诉我我的代码有什么问题?

一般来说,我应该如何考虑模型的 I/O?比如这个案例。我以为准备N个字符串,比如800个字符串,800个标签就OK了。但我不断收到错误。好吧,我解决了大多数问题,但无法克服这一问题。请分享您的经验。谢谢!

附录

模型总结

Model: "functional_1"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
tags_input (InputLayer)         [(None, 12)]         0                                            
__________________________________________________________________________________________________
flatten (Flatten)               (None, 12)           0           tags_input[0][0]                 
__________________________________________________________________________________________________
title_input (InputLayer)        [(None, 1)]          0                                            
__________________________________________________________________________________________________
body_input (InputLayer)         [(None, 1)]          0                                            
__________________________________________________________________________________________________
dense (Dense)                   (None, 500)          6500        flatten[0][0]                    
__________________________________________________________________________________________________
text_vectorization (TextVectori (None, 500)          0           title_input[0][0]                
__________________________________________________________________________________________________
text_vectorization_1 (TextVecto (None, 500)          0           body_input[0][0]                 
__________________________________________________________________________________________________
tf_op_layer_ExpandDims (TensorF [(None, 500, 1)]     0           dense[0][0]                      
__________________________________________________________________________________________________
embedding (Embedding)           (None, 500, 100)     1000100     text_vectorization[0][0]         
__________________________________________________________________________________________________
embedding_1 (Embedding)         (None, 500, 100)     1000100     text_vectorization_1[0][0]       
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 500, 100)     200         tf_op_layer_ExpandDims[0][0]     
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 500, 300)     0           embedding[0][0]                  
                                                                 embedding_1[0][0]                
                                                                 dense_1[0][0]                    
__________________________________________________________________________________________________
priority (Dense)                (None, 500, 1)       301         concatenate[0][0]                
__________________________________________________________________________________________________
departments (Dense)             (None, 500, 4)       1204        concatenate[0][0]                
==================================================================================================
Total params: 2,008,405
Trainable params: 2,008,405
Non-trainable params: 0
__________________________________________________________________________________________________

完整代码

def MultiInputAndOutpt():
  max_features = 10000
  sequnce_length = 500
  embedding_dims = 100
  num_departments = 4
  num_tags = 12

  str = "hello"
  title_vect = TextVectorization(max_tokens=max_features, output_mode="int", output_sequence_length=sequnce_length)
  body_vect = TextVectorization(max_tokens=max_features, output_mode="int", output_sequence_length=sequnce_length)

  title_input = keras.Input(shape=(1,), dtype=tf.string, name="title_input")
  x1 = title_vect(title_input)
  x1 = layers.Embedding(input_dim=max_features + 1, output_dim=embedding_dims)(x1)

  body_input = keras.Input(shape=(1,), dtype=tf.string, name="body_input")
  x2 = body_vect(body_input)
  x2 = layers.Embedding(input_dim=max_features + 1, output_dim=embedding_dims)(x2)

  tags_input = keras.Input(shape=(num_tags,), name="tags_input")
  x3 = layers.Flatten()(tags_input)
  x3 = layers.Dense(500)(x3)
  x3 = tf.expand_dims(x3, axis=-1)
  x3 = layers.Dense(100)(x3)

  x = layers.concatenate([x1, x2, x3])

  priority_score = layers.Dense(1)(x)
  priority_score = tf.reshape(priority_score, (-1, 1), name="priority")
  departments = layers.Dense(num_departments)(x)
  departments = tf.reshape(departments, (-1, num_departments), name="departments")

  model = keras.Model(inputs=[title_input, body_input, tags_input], outputs=[priority_score, departments])
  model.summary()

  model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.1),
                loss=[keras.losses.BinaryCrossentropy(from_logits=True),
                      keras.losses.CategoricalCrossentropy(from_logits=True)],
                loss_weights=[1.0, 0.2],
                )

  # title_data = np.random.randint(num_words, size=(1280, 10))
  # body_data = np.random.randint(num_words, size=(1280, 100))
  alphabet = np.array(list(string.ascii_lowercase + ' '))
  title_data = np.random.choice(alphabet, size=(800, 1000))
  body_data = np.random.choice(alphabet, size=(800, 1000))
  tags_data = np.random.randint(2, size=(800, num_tags)).astype("float32")

  body_data = ["".join(body_data[i]) for i in range(len(body_data))]
  title_data = ["".join(title_data[i]) for i in range(len(title_data))]

  # Dummy target data
  priority_targets = np.random.random(size=(800, 1))
  dept_targets = np.random.randint(2, size=(800, num_departments))

  model.fit(
    {"title_input": title_data, "body_input": body_data, "input3": tags_data},
    {"priority": priority_targets, "departments": dept_targets},
    epochs=2,
    batch_size=32, )

【问题讨论】:

    标签: numpy tensorflow keras


    【解决方案1】:

    我自己想出来的:

    输入

    模型的输入是正确的。不过我不需要扁平化。

    tags_input (InputLayer)         [(None, 12)]          0                                            
    __________________________________________________________________________________________________
    title_input (InputLayer)        [(None, 1)]          0                                            
    __________________________________________________________________________________________________
    body_input (InputLayer)         [(None, 1)]          0                                            
    __________________________________________________________________________________________________
    

    输出

    输出不正确,我不希望 (None, 500, 1)(None, 500, 4) 作为输出。我只需要1 优先分数和4 值的1 部门列表。

    要将形状从(None, 500, 1) 更改为(None, 1),我需要删除一些值。有很多方法可以做到,这里我选择直接去掉中间的dim。

    ...
      departments = layers.Dense(num_departments)(x)  # Shape: (None, 500, 4)
      departments = tf.slice(departments, [0, 0, 0], [-1, 1, 4]) # Shape (None, 1, 4)
      departments = tf.squeeze(departments, [1]) # Shape (None, 4) but its not a squeeze type
      departments = layers.Dense(num_departments, name="departments")(departments) # Shape (None, 4)
    ...
    

    priority_score 输出相同。

    现在输出变成了

    priority_score (Dense)          (None, 1)            2           tf.compat.v1.squeeze[0][0]       
    __________________________________________________________________________________________________
    departments (Dense)             (None, 4)            20          tf.compat.v1.squeeze_1[0][0]     
    

    训练模型

    下一步是准备训练数据。我们需要的是构建

    • 标题数据:N 个字符串,形状 (N, 1)。这里1代表一个python字符串。
    • body 数据:与 tiele 数据相同
    • 标记数据:N 个浮点数组,形状 (N, 12)

    目标:

    • priority_score:N 个浮点数,形状 (N, 1)
    • 部门:N 个浮点数组,形状 (N, 4)

    N 可以是任意数字。

    然后我们调用fit函数:

      model.fit(
        {"title_input": title_data, "body_input": body_data, "tags_input": tags_data},
        {"priority_score": priority_targets, "departments": dept_targets, },
        epochs=50,
        batch_size=64, )
    

    令人惊讶的是,损失不断增加:

    Epoch 1/50
    157/157 [==============================] - 5s 28ms/step - loss: 1.3467 - priority_score_loss: 0.6938 - departments_loss: 3.2644 - priority_score_acc: 0.0000e+00 - departments_acc: 0.1267
    Epoch 2/50
    157/157 [==============================] - 4s 27ms/step - loss: 4.6381 - priority_score_loss: 0.6976 - departments_loss: 19.7023 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2483
    Epoch 3/50
    157/157 [==============================] - 4s 28ms/step - loss: 16.9411 - priority_score_loss: 0.6984 - departments_loss: 81.2137 - priority_score_acc: 0.0000e+00 - departments_acc: 0.1569
    Epoch 4/50
    157/157 [==============================] - 5s 29ms/step - loss: 23.8020 - priority_score_loss: 0.7075 - departments_loss: 115.4721 - priority_score_acc: 0.0000e+00 - departments_acc: 0.1427
    Epoch 5/50
    157/157 [==============================] - 5s 29ms/step - loss: 1.8650 - priority_score_loss: 0.7046 - departments_loss: 5.8019 - priority_score_acc: 0.0000e+00 - departments_acc: 0.1995
    Epoch 6/50
    157/157 [==============================] - 5s 30ms/step - loss: 3.0613 - priority_score_loss: 0.7025 - departments_loss: 11.7943 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2472
    Epoch 7/50
    157/157 [==============================] - 5s 30ms/step - loss: 5.2455 - priority_score_loss: 0.7032 - departments_loss: 22.7114 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2402
    Epoch 8/50
    157/157 [==============================] - 5s 30ms/step - loss: 6.0378 - priority_score_loss: 0.7013 - departments_loss: 26.6828 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2418
    Epoch 9/50
    157/157 [==============================] - 5s 30ms/step - loss: 10.8300 - priority_score_loss: 0.7033 - departments_loss: 50.6334 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2465
    Epoch 10/50
    157/157 [==============================] - 4s 27ms/step - loss: 12.1005 - priority_score_loss: 0.7019 - departments_loss: 56.9929 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2627
    Epoch 11/50
    157/157 [==============================] - 4s 27ms/step - loss: 15.8248 - priority_score_loss: 0.6983 - departments_loss: 75.6328 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2513
    Epoch 12/50
    157/157 [==============================] - 5s 29ms/step - loss: 19.3059 - priority_score_loss: 0.6940 - departments_loss: 93.0596 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2386
    Epoch 13/50
    157/157 [==============================] - 5s 29ms/step - loss: 32.6499 - priority_score_loss: 0.6937 - departments_loss: 159.7808 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2526
    Epoch 14/50
    157/157 [==============================] - 4s 28ms/step - loss: 31.1433 - priority_score_loss: 0.6936 - departments_loss: 152.2486 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2499
    Epoch 15/50
    157/157 [==============================] - 5s 29ms/step - loss: 41.9199 - priority_score_loss: 0.6932 - departments_loss: 206.1338 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2362
    Epoch 16/50
    157/157 [==============================] - 5s 30ms/step - loss: 40.2069 - priority_score_loss: 0.6931 - departments_loss: 197.5692 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2300
    Epoch 17/50
    157/157 [==============================] - 5s 30ms/step - loss: 60.4129 - priority_score_loss: 0.6932 - departments_loss: 298.5986 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2425
    Epoch 18/50
    157/157 [==============================] - 5s 30ms/step - loss: 75.8330 - priority_score_loss: 0.6932 - departments_loss: 375.6990 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2332
    Epoch 19/50
    157/157 [==============================] - 5s 29ms/step - loss: 81.5731 - priority_score_loss: 0.6931 - departments_loss: 404.4002 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2568
    Epoch 20/50
    157/157 [==============================] - 4s 28ms/step - loss: 103.4053 - priority_score_loss: 0.6932 - departments_loss: 513.5608 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2409
    Epoch 21/50
    157/157 [==============================] - 4s 28ms/step - loss: 106.4842 - priority_score_loss: 0.6932 - departments_loss: 528.9552 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2584
    Epoch 22/50
    157/157 [==============================] - 4s 28ms/step - loss: 121.2103 - priority_score_loss: 0.6932 - departments_loss: 602.5854 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2332
    Epoch 23/50
    157/157 [==============================] - 5s 29ms/step - loss: 139.4970 - priority_score_loss: 0.6932 - departments_loss: 694.0189 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2421
    Epoch 24/50
    157/157 [==============================] - 5s 29ms/step - loss: 180.7346 - priority_score_loss: 0.6933 - departments_loss: 900.2067 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2449
    Epoch 25/50
    157/157 [==============================] - 4s 28ms/step - loss: 201.8011 - priority_score_loss: 0.6932 - departments_loss: 1005.5396 - priority_score_acc: 0.0000e+00 - departments_acc: 0.2420
    Epoch 26/50
    

    我猜这是因为训练数据是随机生成的,模型构造不好。无论如何,我们现在可以用一些数据训练模型和预测。

    这是一次很好的学习经历。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-13
      • 2020-01-12
      • 1970-01-01
      • 2021-10-19
      • 2020-05-30
      • 2021-10-29
      • 1970-01-01
      • 2020-10-14
      相关资源
      最近更新 更多