最近,我在面试中被要求使用tensorflow
构建一个神经网络,该网络需要满足以下要求:
- 模型输入层的输入形状必须为(32,10,1)
- 模型的输出形状必须为(32,10,1)
作为回应,我提供了以下解决方案:
import tensorflow as tf
from tensorflow.keras.layers import Dense, Conv1D
model = tf.keras.models.Sequential([
Conv1D(filters=32, kernel_size=1, activation='relu', input_shape=(32, 10, 1)),
Dense(30, activation='relu'),
Dense(10, activation='relu'),
tf.keras.layers.Dense(1)
])
,为了证明我的模型可以通过要求,我用下面的代码打印了每个模型的输入形状和输出形状:
for layer in model.layers:
print('input shape: ',layer.input_shape, 'output shape: ',layer.output_shape)
,下面是我得到的输出:
input shape: (None, 32, 10, 1) output shape: (None, 32, 10, 32)
input shape: (None, 32, 10, 32) output shape: (None, 32, 10, 30)
input shape: (None, 32, 10, 30) output shape: (None, 32, 10, 10)
input shape: (None, 32, 10, 10) output shape: (None, 32, 10, 1)
遗憾的是,显然我对这个问题的回答是不正确的,我不知道如何建立这样的模型?
可以看到,我的模型有4个维度,输入和输出层从None
开始。是这个问题吗?
我不是100%确定,但对我来说,你似乎没有明确声明输入层,我真的认为在形状的命令响应中,我们不应该看到一个'None'。
我在这个源中找到了两个可能的解决方案,其中最好的一个似乎是以下的(未测试):
inputs = Input(shape=(32, 10, 1))
x = Conv1D(filters=32, kernel_size=1)(inputs)
x = Dense(30, "relu")(x)
outputs = Dense(10, "relu")(x)
model = Model(inputs=inputs, outputs=outputs, name="my_model_name")
让我们看看这是否有意义。
感谢@Pedro Silva和@AloneTogether,我提出了一个可能的解决方案如下。因此,在Input
或Conv1D
层中,input_shape
不包括输入数据的Batch_size
。input_shape
只指定每个数据点的形状。or (数据项),如果我们需要指定Batch_size
,那么我们可以在图层中使用batch_size
参数。因此,如果我们将模式开发为:
import tensorflow as tf
from tensorflow.keras.layers import Dense, Conv1D,Input
from tensorflow.keras.models import Model
model = tf.keras.models.Sequential([
Conv1D(filters=32, kernel_size=1, activation='relu', input_shape=(10, 1),batch_size=32),
Dense(30, activation='relu'),
Dense(10, activation='relu'),
tf.keras.layers.Dense(1)
])
for layer in model.layers:
print('input shape: ',layer.input_shape, 'output shape: ',layer.output_shape)
或:
inputs = Input(shape=(10, 1),batch_size=32)
x = Conv1D(filters=32, kernel_size=1)(inputs)
x = Dense(30, "relu")(x)
outputs = Dense(10, "relu")(x)
model = Model(inputs=inputs, outputs=outputs, name="my_model_name")
for layer in model.layers:
print('input shape: ',layer.input_shape, 'output shape: ',layer.output_shape)
那么在这两种情况下,模型的输入和输出形状如下:
input shape: (32, 10, 1) output shape: (32, 10, 1)
input shape: (32, 10, 1) output shape: (32, 10, 32)
input shape: (32, 10, 32) output shape: (32, 10, 30)
input shape: (32, 10, 30) output shape: (32, 10, 10)