python - 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])
解决方案
我昨天遇到了你的问题。这是为我解决的问题:
你的第一层应该是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 作为第一层的顺序模型是错误的。
推荐阅读
- swift - UICollectionView 和 FlowLayout 的单元格间距不同
- arrays - 为什么在此代码中出现数组超出范围错误?
- java - 如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口
- php - Codeigniter MY_Controller 未将变量发送到视图
- java - 如何使用 Spring Boot 配置 Selenium WebDriver 以进行 UI 测试?
- django - Python 抛出的带有 TestCase 继承的警告 - “需要更多值来解包”
- c# - 在视野内生成,但始终低于特定高度
- swift - 如何向 Firebase 数组添加另一个键/值
- maven - Maven Checkstyle 不允许导入
- node.js - 在 Mac OS 上使用带有电子的 sqlite3 的问题