Tensorflow:应定义输入的通道维度

Lin*_*Guo 8 python machine-learning deep-learning keras tensorflow

我是 Tensorflow 新手,正在尝试训练特定的深度学习神经网络。我正在使用 Tensorflow (2.11.0) 来获取深度神经网络模型,如下所述。我使用的数据也给出如下:

数据:

这是一些示例数据。为了方便起见,我们可以考虑数据中的 10 个样本。在这里,每个样本都有形状:(128,128)

可以将以下代码视为示例训练数据。

x_train = np.random.rand(10, 128, 128, 1)
Run Code Online (Sandbox Code Playgroud)

归一化层:

normalizer = tf.keras.layers.Normalization(axis=-1)
normalizer.adapt(x_train)
Run Code Online (Sandbox Code Playgroud)

构建模型:

def build_and_compile_model(norm):
    model = tf.keras.Sequential([
      norm,
      layers.Conv2D(128, 128, activation='relu'),
      layers.Conv2D(3, 3, activation='relu'),
      layers.Flatten(),
      layers.Dense(units=32, activation='relu'),
      layers.Dense(units=1)
    ])

    model.compile(loss='mean_absolute_error', optimizer=tf.keras.optimizers.Adam(0.001))
    
    return model
Run Code Online (Sandbox Code Playgroud)

当我做

dnn_model = build_and_compile_model(normalizer)
dnn_model.summary()
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ValueError: The channel dimension of the inputs should be defined. The input_shape received is (None, None, None, None), where axis -1 (0-based) is the channel dimension, which found to be `None`.
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

我试图从这个这个这个这个中获得见解。但是,我还没有找到可行的解决方案。

我应该怎样做才能消除错误并使模型正常工作?

我将不胜感激任何帮助。

Alo*_*her 1

直接在归一化层中定义输入形状(或添加Input层),因为它无法直接推断:

import numpy as np
import tensorflow as tf

x_train = np.random.rand(10, 128, 128, 1)
normalizer = tf.keras.layers.Normalization(input_shape=[128, 128, 1], axis=-1)
normalizer.adapt(x_train)


def build_and_compile_model(norm):
    model = tf.keras.Sequential([
        norm,
        tf.keras.layers.Conv2D(64, 64, activation='relu'),
        tf.keras.layers.Conv2D(3, 3, activation='relu'),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(units=32, activation='relu'),
        tf.keras.layers.Dense(units=1)
    ])

    model.compile(loss='mean_absolute_error', optimizer=tf.keras.optimizers.Adam(0.001))

    return model


dnn_model = build_and_compile_model(normalizer)
dnn_model.summary()
Run Code Online (Sandbox Code Playgroud)

此外,您的模型无法按原样工作,您在第一Conv2D层中使用内核大小为 128,然后在另一层Conv2D中使用内核大小为 3,但您的数据具有形状(10, 128, 128, 1)。我更改了它以使您的代码可执行。