如何使用来自另一个数组的标签来标记数组

How to label arrays with labels from another array

我是 Tensorflow 和深度学习的新手,我的第一个任务是对灰度图像的数组进行二元分类。我在这段代码中的数组(array_a 到 array_h)应该作为一个例子。

我有很多数组(array_a 到 array_h),形状为 (300x300) 并且有 0 和 1。这些数组应该是我的输入 training_data (x_train)。 我想用形状为 (8x1) 的另一个数组 (label_array_train) 标记这些数组。这个数组应该是我的输入 y_train 或目标数据。

我的想法是用 np.concatenate 将我的数组连接成一个数组,将其转换为张量并将其提供给我的神经网络。我还在 label_array_train 上使用 tf.convert_to_tensor 来获得另一个张量。 我想用 label_array_train(0 或 1)中的一个标签来标记每个数组。包含 0 的数组应标记为 0,包含 1 的数组应标记为 1。 由于我的数据大小不同,我收到错误消息。但我不知道如何正确处理或准备我的输入数据以获得我的 tran_data 和标签的完美形状和大小。

我收到这个错误:

Data cardinality is ambiguous:
  x sizes: 2400
  y sizes: 8
Make sure all arrays contain the same number of samples.
  File "C:\Users\Niklas\Desktop\Python\Versuch 3.py", line 94, in <module>
    model.fit(train_data,...

我的代码:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, AvgPool2D
from tensorflow.keras.optimizers import Adam
import numpy as np

我的训练数组,其中 0 和 1 的形状为 300,300

array_a= np.zeros((300,300))
array_b= np.ones((300,300))
array_c= np.ones((300,300))
array_d= np.zeros((300,300))
array_e= np.zeros((300,300))
array_f= np.zeros((300,300))
array_g= np.zeros((300,300))
array_h= np.ones((300,300))

我的数组用于标记train_data

的所有数组
label_array_train = np.array([0,1,1,0,0,0,0,1], dtype = np.float)

将所有数组连接成一个

train_array = np.concatenate((array_a,array_b,array_c,array_d,array_e,array_f,array_g,array_h), axis=0)

将其转换为张量以与 Tensorflow 兼容

train_data = tf.convert_to_tensor(train_array, np.float32)

labels = tf.convert_to_tensor(label_array_train, np.float32)

我的模型

model = Sequential([Conv2D(filters= 32, kernel_size= (3, 3), activation= 'relu', input_shape = (300,300,1)),
                            AvgPool2D(2, 2),
                            Conv2D(filters= 32, kernel_size= (3, 3), activation= 'relu'),
                            AvgPool2D(2, 2),
                            Conv2D(filters= 64, kernel_size= (3, 3), activation= 'relu'),
                            AvgPool2D(2, 2),
                            Conv2D(filters= 64, kernel_size= (3, 3), activation= 'relu'),
                            AvgPool2D(2, 2),
                            Flatten(),
                            Dense(units= 512, activation= 'relu'),
                            Dense(units= 1, activation= 'sigmoid')])


model.compile(optimizer=Adam (learning_rate= 0.0005),
                    loss= 'binary_crossentropy',
                    metrics= ['accuracy'])


model.fit(train_data,
         labels,
          epochs=5,
          verbose=1)

我的 training_data 打印形状 (train_array):

[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]], shape=(2400, 300), dtype=float32) 

我的打印标签的形状(labels):

tf.Tensor([0. 1. 1. 0. 0. 0. 0. 1.], shape=(8,), dtype=float32)

我希望有人能帮助我并指出我在代码中的错误或告诉我如何正确地做。

from tensorflow.keras.utils import to_categoritcal
...
model.fit(train_data,
         to_categorical(labels),
          epochs=5,
          verbose=1)

使用 np.stack 而不是 np.concatenate 一切都应该有效:

train_array = np.stack((array_a,array_b,array_c,array_d,array_e,array_f,array_g,array_h), axis=0)
print(train_array.shape)
# (8, 300, 300)

X 形状是问题所在。您必须将数组初始化为:

array_a= np.zeros((1,300,300))
array_b= np.ones((1,300,300))
array_c= np.ones((1,300,300))
array_d= np.zeros((1,300,300))
array_e= np.zeros((1,300,300))
array_f= np.zeros((1,300,300))
array_g= np.zeros((1,300,300))
array_h= np.ones((1,300,300))*