所以,我将.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
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输入_形状相关问题 更多 >
编程相关推荐