如何通过特定的输入输出形状层构建神经网络?



最近,我在面试中被要求使用tensorflow构建一个神经网络,该网络需要满足以下要求:

  1. 模型输入层的输入形状必须为(32,10,1)
  2. 模型的输出形状必须为(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,我提出了一个可能的解决方案如下。因此,在InputConv1D层中,input_shape不包括输入数据的Batch_sizeinput_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)

相关内容

  • 没有找到相关文章

最新更新