tensorflow - ValueError: Input 0 is in compatible with layer model: expected shape=(None, 14999, 7), found shape=(None, 7)
问题描述
我正在尝试将 Conv1D 层应用于具有数字数据集的分类模型。我的模型的神经网络如下:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv1D(8,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu',input_shape = (14999,7)))
model.add(tf.keras.layers.Conv1D(16,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu'))
model.add(tf.keras.layers.MaxPooling1D(2))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv1D(32,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu'))
model.add(tf.keras.layers.Conv1D(64,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu'))
model.add(tf.keras.layers.MaxPooling1D(2))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv1D(128,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu'))
model.add(tf.keras.layers.Conv1D(256,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu'))
model.add(tf.keras.layers.MaxPooling1D(2))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(512,activation = 'relu'))
model.add(tf.keras.layers.Dense(128,activation = 'relu'))
model.add(tf.keras.layers.Dense(32,activation = 'relu'))
model.add(tf.keras.layers.Dense(3, activation = 'softmax'))
模型的输入形状为 (14999, 7)。
model.summary() 给出以下输出
Model: "sequential_8"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d_24 (Conv1D) (None, 14997, 8) 176
_________________________________________________________________
conv1d_25 (Conv1D) (None, 14995, 16) 400
_________________________________________________________________
max_pooling1d_10 (MaxPooling (None, 7497, 16) 0
_________________________________________________________________
dropout_9 (Dropout) (None, 7497, 16) 0
_________________________________________________________________
conv1d_26 (Conv1D) (None, 7495, 32) 1568
_________________________________________________________________
conv1d_27 (Conv1D) (None, 7493, 64) 6208
_________________________________________________________________
max_pooling1d_11 (MaxPooling (None, 3746, 64) 0
_________________________________________________________________
dropout_10 (Dropout) (None, 3746, 64) 0
_________________________________________________________________
conv1d_28 (Conv1D) (None, 3744, 128) 24704
_________________________________________________________________
conv1d_29 (Conv1D) (None, 3742, 256) 98560
_________________________________________________________________
max_pooling1d_12 (MaxPooling (None, 1871, 256) 0
_________________________________________________________________
dropout_11 (Dropout) (None, 1871, 256) 0
_________________________________________________________________
flatten_3 (Flatten) (None, 478976) 0
_________________________________________________________________
dense_14 (Dense) (None, 512) 245236224
_________________________________________________________________
dense_15 (Dense) (None, 128) 65664
_________________________________________________________________
dense_16 (Dense) (None, 32) 4128
_________________________________________________________________
dense_17 (Dense) (None, 3) 99
=================================================================
Total params: 245,437,731
Trainable params: 245,437,731
Non-trainable params: 0
模型拟合的代码是:
model.compile(loss = 'sparse_categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
history = model.fit(xtrain_scaled, ytrain_scaled, epochs = 30, batch_size = 5, validation_data = (xval_scaled, yval_scaled))
执行时,我面临以下错误:
ValueError: Input 0 is incompatible with layer model: expected shape=(None, 14999, 7), found shape=(None, 7)
任何人都可以帮助解决这个问题吗?
解决方案
TL;博士:
改变
model.add(tf.keras.layers.Conv1D(8,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu',input_shape = (14999,7)))
至
model.add(tf.keras.layers.Conv1D(8,kernel_size = 3, strides = 1,padding = 'valid', activation = 'relu',input_shape = (7)))
完整答案:
假设:我猜您选择在输入形状中写入 14999 的原因是因为这是您的批量大小/训练数据的总大小
这个问题:
- Tensorflow 假设输入形状不包括批量大小
- 通过指定 2D
input_shape
,您可以让 Tensorflow 期待 shape 的 3D 输入(Batch_size, 14999, 7)
。但是您的输入显然是大小(Batch_size, 7)
- 通过指定 2D
解决方案:
将形状从更改(14999, 7)
为刚刚(7)
- TF 现在将期待您提供的相同形状
PS:不要担心告诉你的模型你在数据集中有多少训练样例。TF Keras 假设它可以显示无限的训练示例。
推荐阅读
- shell - 如何运行序列化的ansible任务
- actionscript-3 - 双击时,玩家会在整个区域内飞溅
- python - 如何覆盖另一个库中的现有记录器?
- angular - 菜单打开关闭按钮将页面重定向到角度的本地主机页面
- javascript - 使用 Moment JS 的时间可用性
- python - 为什么我收到此错误“ValueError:无法从重复轴重新索引”?
- gradle - Gradle maven-publish 不更新元数据
- android - 在 APK 中包含 .txt 文件
- google-sheets - 如何使用谷歌脚本将数据验证从一个电子表格复制到另一个电子表格
- java - 如何实现关键监听器?