首页 > 解决方案 > 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

标签: pythondeep-learningneural-networkjupyter-notebookautoencoder

解决方案


推荐阅读