首页 > 解决方案 > ValueError:将字典输入传递给没有 FeatureLayer 作为第一层的顺序模型是错误的

问题描述

我尝试运行以下代码,但出现此错误:

文件“C:\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training.py”,第 819 行,适合
use_multiprocessing=use_multiprocessing)
文件“C :\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py”,第 235 行,适合
use_multiprocessing=use_multiprocessing)
文件“C:\Users \TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py",第 593 行,在 _process_training_inputs
use_multiprocessing=use_multiprocessing)
文件“C:\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py”,第 706 行,_process_inputs
use_multiprocessing=use_multiprocessing)
文件“C :\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py”,第 702 行,在init
x = standardize_function(x)
文件“C: \Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py”,第 660 行,在 standardize_function
标准化(数据集,extract_tensors_from_dataset=False)
文件“C:\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training.py”,第 2346 行,在 _standardize_user_data
all_inputs, y_input, dict_inputs = self ._build_model_with_inputs(x, y) 文件“C:\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training.py”,第 2572 行,在 _build_model_with_inputs
self._set_inputs(cast_inputs)
文件“C:\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training.py”,第 2647 行,在 _set_inputs
输入中= self._set_input_attrs(输入)
_method_wrapper
结果 = 方法(self,* args, **kwargs)
文件“C:\Users\TomerK\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training.py”,第 2681 行,在 _set_input_attrs
raise ValueError('将字典输入传递给序列模型'
ValueError: 将字典输入传递给没有 FeatureLayer 作为第一层的序列模型是错误的。

代码:

# -*- coding: utf-8 -*-
import os
#os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

import tensorflow as tf
import tensorflow_datasets as tfds

try:
    model = keras.models.load_model("passrockmodel.h5")
except:
    print('\nDownloading Train Dataset...\n')
    train_dataset = tfds.load(name="rock_you", split="train[:75%]")
    assert isinstance(train_dataset, tf.data.Dataset)

    print('\nDownloading Test Dataset...\n')
    test_dataset = tfds.load("rock_you", split='train[-25%:]')
    assert isinstance(test_dataset, tf.data.Dataset)

    model = tf.keras.Sequential([
      tf.keras.layers.Dense(128, activation='relu'),
      tf.keras.layers.Dense(128, activation='relu'),
      tf.keras.layers.Dense(1, activation='sigmoid'),
    ])

    model.compile(
        loss='binary_crossentropy',
        optimizer='adam',
        metrics=['accuracy'])


    model.fit(train_dataset, epochs=20)

    model.save("passrockmodel.h5")


test_loss, test_accuracy = model.evaluate(test_dataset)

print('\nPredicting...\n')

predictions = model.predict(test_dataset)

print(predictions[0])

标签: pythonpython-3.xtensorflowkerastf.keras

解决方案


我昨天遇到了你的问题。这是为我解决的问题:

你的第一层应该是tf.keras.layers.DenseFeatures类型

必须使用tf.feature_column对象数组来实例化第一层。碰巧我所有的列都是数字的,所以我的数组是:

featureColumns = [tf.feature_column.numeric_column(columnNames[i], normalizer_fn= lambda x: (x - mean[i])/std[i]) for i in range(len(columnNames[:-1]))]

注意:如您所见,normalizer_fn参数也非常有用。如果您需要,它可以消除任何额外的规范化预处理层的需要。

所以我的层变成了:

layers.DenseFeatures(feature_columns=featureColumns, trainable=True)

我相信这应该可以解决您问题中提到的错误。引用为

ValueError:将字典输入传递给没有 FeatureLayer 作为第一层的顺序模型是错误的。


推荐阅读