警告:tensorflow:模型是用形状构造的(无,..)

时间:2020-07-02 12:23:48

标签: python tensorflow keras tf.keras

我有一个具有78个功能的分类问题(0或1)。 假设我的数据框中有78列202行的数据,每个像元值都保存着[0,infinity)范围内的整数。

尝试使用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)

1 个答案:

答案 0 :(得分:2)

此处是根据您的问题提供的完整示例。您拥有2D数据,因此在输入层中,您仅需指定要素尺寸,而无需指定样本尺寸。您还正在执行二进制分类任务,因此最好的选择是使用具有1维,S型激活函数和二进制交叉熵作为损失的最终致密层。如果概率> 0.5,则预测类别将为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