python - ValueError: 层序 7 的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 5,但接收到的形状(无,21)
问题描述
**我正在尝试在 NASA 提供的数据上使用自动编码器进行软件缺陷预测,我正在导入的数据是JM1.csv ** 但我认为解码器部分或解码器层不起作用,我想显示所有 21 CSV 文件中的列,而不是减少的 5 列。
import pandas as pd
import tensorflow as tf
# import kerastuner.tuners as kt
import matplotlib.pyplot as plt
# from tensorflow.keras import Model
# from tensorflow.keras import Sequential
from tensorflow import keras
from sklearn.preprocessing import StandardScaler
# from tensorflow.keras.layers import Dense, Dropout
from sklearn.model_selection import train_test_split
# from tensorflow.keras.losses import MeanSquaredLogarithmicError
TRAIN_DATA_PATH = 'NASA/JM1.csv'
TEST_DATA_PATH = 'NASA/JM1.csv'
TARGET_NAME = 'HALSTEAD_LEVEL'
train_data = pd.read_csv(TRAIN_DATA_PATH)
test_data = pd.read_csv(TEST_DATA_PATH)
x_train, y_train = train_data.drop(TARGET_NAME, axis=1), train_data[TARGET_NAME]
x_test, y_test = test_data.drop(TARGET_NAME, axis=1), test_data[TARGET_NAME]
from sklearn.preprocessing import MinMaxScaler
def scale_datasets(x_train, x_test):
"""
Standard Scale test and train data
"""
standard_scaler = MinMaxScaler()
x_train_scaled = pd.DataFrame(
standard_scaler.fit_transform(x_train),
columns=x_train.columns
)
x_test_scaled = pd.DataFrame(
standard_scaler.transform(x_test),
columns = x_test.columns
)
return x_train_scaled, x_test_scaled
x_train_scaled, x_test_scaled = scale_datasets(x_train, x_test)
class AutoEncoders(tf.keras.Model):
def __init__(self, output_units):
super().__init__()
self.encoder = tf.keras.Sequential(
[
tf.keras.layers.Dense(21, activation="relu"),
tf.keras.layers.Dense(10, activation="relu"),
tf.keras.layers.Dense(5, activation="relu")
]
)
self.decoder = tf.keras.Sequential(
[
tf.keras.layers.Dense(5, activation="relu"),
tf.keras.layers.Dense(10, activation="relu"),
tf.keras.layers.Dense(21, activation="relu"),
tf.keras.layers.Dense(output_units, activation="sigmoid")
]
)
def call(self, inputs):
encoded = self.encoder(inputs)
decoded = self.decoder(encoded)
return decoded
auto_encoder = AutoEncoders(len(x_train_scaled.columns))
auto_encoder.compile(
loss='mae',
metrics=['mae'],
optimizer='adam'
)
history = auto_encoder.fit(
x_train_scaled,
x_train_scaled,
epochs=15,
batch_size=32,
validation_data=(x_test_scaled, x_test_scaled)
)
encoder_layer = auto_encoder.get_layer('sequential_7')
reduced_df = pd.DataFrame(encoder_layer.predict(x_train_scaled))
reduced_df = reduced_df.add_prefix('feature_')
*here is it shows the 2 layers sequential_6 and sequential_7, If I use sequential _6 it gives me the output of only 5 features, but I want all the features like to show the 21 decoded features.*
display(reduced_df)
# for layer in auto_encoder.layers:
# print(layer.name)
我假设它只显示编码部分5
,但不显示解码部分/特征21
解决方案
推荐阅读
- c - 在没有 UAC 提示的情况下提高流程完整性
- asp.net-core - 使用 Kendo UI 实现服务器端分页的正确方法是什么?
- mysql - SQL:用假人填充有序字符串序列中的缺失
- android - 如何动态更改工具栏的背景?
- vue.js - 不能让路由器工作
- swift - 如何使用在文本字段中输入的信息正确记录 Firebase 分析事件
- ssis - SSIS 包路径 - 在执行期间确定
- java - 使用 JSoup 转到 aspx 表单的下一页
- regex - 使用 RegEx 匹配单元格中的数据,以便在 Excel 中提取新行
- arguments - 用户定义的工作表维度函数的可选参数不起作用