关于形状不匹配的 Tensorflow2 警告,仍在训练
Tensorflow2 Warning on Shape Mismatch, Still Training
我正在尝试使用 Keras/TF2.3.0 进行多标签分类,其中我有 50 个特征并在五个 类 之间进行分类。我收到以下警告,尽管模型仍在训练,这让我很困惑。
>>> model.fit(train_dataset, epochs=5, validation_data=val_dataset)
Epoch 1/5 WARNING:tensorflow:Model was constructed with shape (128, 1,
50) for input Tensor("input_1:0", shape=(128, 1, 50), dtype=float32),
but it was called on an input with incompatible shape (None, 50).
WARNING:tensorflow:Model was constructed with shape (128, 1, 50) for
input Tensor("input_1:0", shape=(128, 1, 50), dtype=float32), but it
was called on an input with incompatible shape (None, 50).
1/5[..............................] - ETA: 0s - loss:
0.6996WARNING:tensorflow:Model was constructed with shape (128, 1, 50) for input Tensor("input_1:0", shape=(128, 1, 50), dtype=float32), but
it was called on an input with incompatible shape (None, 50). 59/59
[==============================] - 0s 2ms/step - loss: 0.6941 -
val_loss: 0.6935
Epoch 2/5 59/59 [==============================]...
我的完整代码以及用于重现错误的随机数据如下。我搞砸了我的 NN 架构(或者可能是我的 dfs_to_tfds
函数?)以接受具有 num_vars
特征的输入记录和分布在 TF 中的 num_classes
类 之间的输出值?
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Input, Dense, Flatten, Conv1D, AveragePooling1D
from tensorflow.keras.models import Model
import tensorflow as tf
# setup example input data and labels
num_rows = 10_000
num_vars = 50
num_classes = 5
data = np.random.rand(num_rows, num_vars)
labels = np.random.rand(num_rows, num_classes)
# convert input data to TF.data datasets
bs=128
def dfs_to_tfds(features, targets, bs):
return tf.data.Dataset.from_tensor_slices((features, targets)).batch(bs)
X_train, X_val, y_train, y_val = train_test_split(data, labels)
train_dataset = dfs_to_tfds(X_train, y_train, bs)
val_dataset = dfs_to_tfds(X_val, y_val, bs)
# setup model
inputs = Input(shape = (1, num_vars), batch_size=bs)
h = Dense(units=32, activation='relu')(inputs)
h = Dense(units=32, activation='relu')(h)
h = Dense(units=32, activation='relu')(h)
outputs = Dense(units=num_classes, activation='sigmoid')(h)
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop',
loss=['binary_crossentropy'], #tf.keras.losses.MSLE
metrics=None,
loss_weights=None,
run_eagerly=None)
# train model
model.fit(train_dataset, epochs=5, validation_data=val_dataset)
使用
inputs = Input(shape=num_vars)
并在拟合模型时指定批量大小:
model.fit(train_dataset, epochs=5, validation_data=val_dataset, batch_size=bs)
您的数据未按子批次预先组织,因此您不必将其与输入形状一起指定,而是在拟合时指定。因此 model.fit 在拟合模型时自动从输入数据中提取 batch_size
批次
我正在尝试使用 Keras/TF2.3.0 进行多标签分类,其中我有 50 个特征并在五个 类 之间进行分类。我收到以下警告,尽管模型仍在训练,这让我很困惑。
>>> model.fit(train_dataset, epochs=5, validation_data=val_dataset)
Epoch 1/5 WARNING:tensorflow:Model was constructed with shape (128, 1, 50) for input Tensor("input_1:0", shape=(128, 1, 50), dtype=float32), but it was called on an input with incompatible shape (None, 50).
WARNING:tensorflow:Model was constructed with shape (128, 1, 50) for input Tensor("input_1:0", shape=(128, 1, 50), dtype=float32), but it was called on an input with incompatible shape (None, 50).
1/5[..............................] - ETA: 0s - loss: 0.6996WARNING:tensorflow:Model was constructed with shape (128, 1, 50) for input Tensor("input_1:0", shape=(128, 1, 50), dtype=float32), but it was called on an input with incompatible shape (None, 50). 59/59 [==============================] - 0s 2ms/step - loss: 0.6941 - val_loss: 0.6935
Epoch 2/5 59/59 [==============================]...
我的完整代码以及用于重现错误的随机数据如下。我搞砸了我的 NN 架构(或者可能是我的 dfs_to_tfds
函数?)以接受具有 num_vars
特征的输入记录和分布在 TF 中的 num_classes
类 之间的输出值?
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Input, Dense, Flatten, Conv1D, AveragePooling1D
from tensorflow.keras.models import Model
import tensorflow as tf
# setup example input data and labels
num_rows = 10_000
num_vars = 50
num_classes = 5
data = np.random.rand(num_rows, num_vars)
labels = np.random.rand(num_rows, num_classes)
# convert input data to TF.data datasets
bs=128
def dfs_to_tfds(features, targets, bs):
return tf.data.Dataset.from_tensor_slices((features, targets)).batch(bs)
X_train, X_val, y_train, y_val = train_test_split(data, labels)
train_dataset = dfs_to_tfds(X_train, y_train, bs)
val_dataset = dfs_to_tfds(X_val, y_val, bs)
# setup model
inputs = Input(shape = (1, num_vars), batch_size=bs)
h = Dense(units=32, activation='relu')(inputs)
h = Dense(units=32, activation='relu')(h)
h = Dense(units=32, activation='relu')(h)
outputs = Dense(units=num_classes, activation='sigmoid')(h)
model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer='rmsprop',
loss=['binary_crossentropy'], #tf.keras.losses.MSLE
metrics=None,
loss_weights=None,
run_eagerly=None)
# train model
model.fit(train_dataset, epochs=5, validation_data=val_dataset)
使用
inputs = Input(shape=num_vars)
并在拟合模型时指定批量大小:
model.fit(train_dataset, epochs=5, validation_data=val_dataset, batch_size=bs)
您的数据未按子批次预先组织,因此您不必将其与输入形状一起指定,而是在拟合时指定。因此 model.fit 在拟合模型时自动从输入数据中提取 batch_size
批次