WARNING:tensorflow:Model 是用形状构造的 (None, ....)

WARNING:tensorflow:Model was constructed with shape (None, ....)

我有一个包含 78 个特征的分类问题(0 或 1)。 假设我在一个包含 78 列和 202 行的数据框中拥有该数据,每个单元格值都包含 [0,无穷大] 范围内的整数。

尝试使用 TensorFlow 实现预测,当我拟合模型时收到以下警告:

WARNING:tensorflow:Model was constructed with shape (None, 101, 78) for input Tensor("input_2:0", shape=(None, 101, 78), dtype=float32), but it was called on an input with incompatible shape (101, 78).

我本以为我的形状定义是正确的,但为什么会收到此警告?也许我误解了如何使用框架。

X_train, X_test, y_train, y_test = train_test_split(df_x, series_y, random_state=1, test_size=0.5)
numpy_x_train = X_train.to_numpy()
numpy_y_train = y_train.to_numpy()
numpy_x_test = X_test.to_numpy()

shape_x = len(X_train)
shape_y = len(X_train.columns)
inputs = keras.Input(shape=(shape_x, shape_y))

x = Rescaling(scale=1.0 / 255)(inputs)

num_classes = 1
outputs = layers.Dense(num_classes, activation="softmax")(x)

model = keras.Model(inputs=inputs, outputs=outputs)
processed_data = model(numpy_x_train)

optimiser = keras.optimizers.RMSprop(learning_rate=1e-3)
loss = keras.losses.CategoricalCrossentropy()

model.compile(optimizer=optimiser, loss=loss)

history = model.fit(numpy_x_train, numpy_y_train, batch_size=32, epochs=10)

这里有一个基于您的问题的完整示例。您有 2D 数据,因此在输入层中您必须仅指定特征维度而不是样本维度。您还正在执行二进制 classification 任务,因此最好的选择是使用具有 1 维的最终致密层、S 形激活函数和二进制交叉熵作为损失。如果概率 > 0.5,则预测的 class 将为 1,否则为 0

from tensorflow import keras
import numpy as np

# create dummy data
train_size, test_size = 101, 101
n_features = 78
num_classes = 2 # 0 or 1

numpy_x_train = np.random.uniform(0,256, (train_size,n_features))
numpy_y_train = np.random.randint(0,num_classes,train_size)
numpy_x_test = np.random.uniform(0,256, (test_size,n_features))
numpy_y_test = np.random.randint(0,num_classes,test_size)

# rescaling data
numpy_x_train = numpy_x_train / 255
numpy_x_test = numpy_x_test / 255

# define model
inputs = keras.layers.Input(shape=(numpy_x_train.shape[1],))
outputs = keras.layers.Dense(1, activation="sigmoid")(inputs)

optimiser = keras.optimizers.RMSprop(learning_rate=1e-3)
loss = keras.losses.BinaryCrossentropy()

model = keras.Model(inputs=inputs, outputs=outputs)
model.compile(optimizer=optimiser, loss=loss)

history = model.fit(numpy_x_train, numpy_y_train, batch_size=32, epochs=10)

# get test predictions
test_prob = model.predict(numpy_x_test).ravel()
test_class = (test_prob>0.5)+0 # if prob > 0.5 is 1 else is 0