输入tensorflow nn的数据格式显然不正确

2024-06-28 10:59:40 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我将.off文件加载到NN中进行分类——只是为了练习,因为我需要使用体素网格,所以我使用点云进行分类。 这是一个相当初级的东西,所以我很抱歉,如果这是显而易见的

一旦网络尝试编译(在第1个纪元中),它将因以下错误而停止:

ValueError: Input 0 of layer sequential is incompatible with the layer: 
: expected min_ndim=5, found ndim=4. Full shape received: [None, 16, 16, 16]

所以我试着用tf.reforme或tf.expand_dim设置一个“channel”值,但这失败了,因为它无法将张量切片转换为张量(它就是这么说的)

那么这里有什么问题?不知何故,我需要在向量中加入另一个维度-输入_形状需要一个通道到值,我认为这在这里没有意义,因为我没有任何RGB

def加载_系列(自):

    train_set_full = []
    train_labels_full = []

    train_set = []
    train_labels = []

    validate_set = []
    validate_labels = []

    for item in listdir(self.path):

        for obj in listdir(self.path + item + "/test"):
            test1 = PyntCloud.from_file(self.path + item + "/test/" + obj)
            cloud = test1.get_sample(
                "mesh_random",
                n=self.n,
                rgb=False,
                normals=False,
                as_PyntCloud=True)

            voxelgrid_id = cloud.add_structure("voxelgrid", n_x=16, n_y=16, n_z=16)
            voxelgrid = cloud.structures[voxelgrid_id]

            train_set_full.append(voxelgrid.get_feature_vector())
            train_labels_full.append(item)
    i = round(len(train_set_full) / 1.25)
    validate_set = train_set_full[i:]
    validate_labels = train_labels_full[i:]
    train_set = train_set_full[:i]
    train_labels = train_labels_full[:i]
    np.array(train_set)
    np.array(train_labels)
    np.array(validate_set)
    np.array(validate_labels)

    train_dataset = tf.data.Dataset.from_tensor_slices((train_set, train_labels))
    train_dataset = train_dataset.shuffle(len(train_set)).batch(32)
    validate_dataset = tf.data.Dataset.from_tensor_slices((validate_set, validate_labels))
    validate_dataset = validate_dataset.shuffle(len(validate_set)).batch(32)

    return train_dataset, validate_dataset

类别模型1:

def __init__(self):
    self.netmodel = models.Sequential()
    self.netmodel.add(layers.Conv3D(filters=16, kernel_size=[3, 3, 3], padding='same', activation=tf.nn.relu,
                                    input_shape=(16, 16, 16, 1), data_format="channels_last"))
    self.netmodel.add(layers.MaxPooling3D(pool_size=[2, 2, 2], strides=2))
    self.netmodel.add(layers.Conv3D(filters=32, kernel_size=[3, 3, 3], padding='same', activation=tf.nn.relu))

    #self.netmodel.add(layers.MaxPooling3D(pool_size=[2, 2, 2], strides=2))
    self.netmodel.add(layers.BatchNormalization(trainable=True))

    # self.netmodel.add(layers.MaxPooling3D((2, 2, 2), strides=2))
    # self.netmodel.add(layers.Conv3D(64, (3, 3, 3), activation='relu',data_format='channels_first'))
    self.netmodel.add(layers.Flatten())
    self.netmodel.add(layers.Dense(32, activation='relu'))
    self.netmodel.add(layers.Dense(10))

def build_model(self, train_data, validate_data):
    self.netmodel.compile(optimizer='adam',
                          loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                          metrics=['accuracy'])

    history = self.netmodel.fit(train_data, epochs=10,
                                validation_data=validate_data)
    return history

Tags: fromselfadddatalabelslayerstftrain
1条回答
网友
1楼 · 发布于 2024-06-28 10:59:40

tf.keras.layers.Conv3D需要输入形状为batch_shape + (channels, conv_dim1, conv_dim2, conv_dim3)的形状为5+D的张量,如果数据{U format='channels'u first'或形状为batch_shape + (conv_dim1, conv_dim2, conv_dim3, channels)的形状为batch_shape + (conv_dim1, conv_dim2, conv_dim3, channels)的形状为{U format='channels'u last'

相应地修改输入形状。 或者,如果您的输入是2D图像,您可以使用与tf.keras.layers.Conv2D相同的输入形状,这需要4D输入_形状

相关问题 更多 >