我有一个数据集,我对其应用了train_test_split
。X的形状如下:
print(X_train.shape)print(X_test.shape)
输出:
(1945, 10000)(487, 10000)
由于X是numpy数组,需要将其转换为图像(3D),以便稍后应用神经网络。因此,我应用了以下操作:
X_train_3d = X_train.reshape(X_train.shape[0],100,100).astype('float32') # X_train.shape[1] = 10000 ; # 其中10000 = 100*100;X_test_3d = X_test.reshape(X_test.shape[0],100,100).astype('float32')print(X_train_3d.shape)print(X_test_3d.shape)
于是,我得到了预期的结果:
(1945, 100, 100)(487, 100, 100)
然后我按照这种方式构建了神经网络:
model = keras.Sequential([ keras.layers.Flatten(input_shape=(100, 100)), # 图像的宽度和高度为100,100 keras.layers.Dense(128, activation='relu'), keras.layers.Dense(39) # 目标总数为39])model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])model.fit(X_train_3d, y_train, epochs=10)
现在,我正在处理另一个数据集,并试图应用类似的逻辑。分割后:
print(X_train.shape)print(X_test.shape)
输出:
(1945, 1800)(487, 1800)
现在,我不明白如何定义reshape操作,如下所示:
X_train_3d = X_train.reshape(X_train.shape[0],?,?).astype('float32')
因为1800的平方根不是整数。如何将其转换为3D,以便我能够像之前一样构建神经网络?
回答:
唯一能让它运行的方法是不使用CNN。然后,你就不需要重塑。推测性的重塑只会产生随机像素。
import numpy as npimport tensorflow as tffrom tensorflow.keras.layers import Densefrom tensorflow.keras.models import SequentialX = np.random.randint(0, 256, (1945, 1800)) # 伪数据y = np.random.randint(0, 38, 1945)model = Sequential([ Dense(128, activation='relu', input_shape=(1800,)), Dense(39)])model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy( from_logits=True), metrics=['accuracy'])hist = model.fit(X, y, epochs=10)
理想情况下,你应该修正你的数据,然后你就可以运行CNN,这是这个任务的最佳模型。CNN能够保持像素之间的2D关系,这将非常棒,但如果你不知道正确的形状,你的像素之间就没有关系。