【问题标题】:Fitting 3d Image to Deep Learning Model将 3d 图像拟合到深度学习模型
【发布时间】:2019-08-14 15:29:51
【问题描述】:

我正在将图像预处理为形状为 (28,28, 3) 的 Numpy 数组。当我尝试拟合我的数据时,我得到了错误。如果我传递整个准备好的数据框,我会收到错误 ValueError: Error when checks input: expected conv2d_20_input to have 4 dimension, but got array with shape (360, 1)

当我传递单个值时,我得到的错误是:检查输入时出错:预期 conv2d_16_input 有 4 个维度,但得到的数组形状为 (28、28、3

我已尝试重新处理数据。我已经尝试单独放入模型并以 1:1 进行训练,但仍然无法正常工作。

预处理代码

from tensorflow.python.keras.preprocessing.image import load_img, img_to_array
def read_and_prep_images(img_paths):
    z = load_img(img_paths, target_size=(28,28))
    z= img_to_array(z)
    return z
df['arrays'] = df['filepath'].apply(read_and_prep_images)

模型创建

model = Sequential()

添加模型层

model.add(Conv2D(filters = 24, kernel_size = (5),padding = 'Same', 
              activation ='relu', input_shape = (28, 28,3)))

model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', 
                 activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation = "relu"))
model.add(Dropout(0.5))
model.add(Dense(10, activation = "softmax"))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

仔细检查形状

np.shape(df['arrays'].iloc[0])

(28, 28, 3)

准备数据

X_train, X_test, y_train, y_test = train_test_split(df.arrays, df.label, test_size=0.4, random_state=101)

拟合模型

model.fit(X_train, y_train, batch_size=100, epochs=4, validation_split=0.2)

模型应该是合适的,我可以对模型以前没有见过的新图像使用 model.predict。

【问题讨论】:

    标签: image tensorflow keras deep-learning


    【解决方案1】:

    如果我传递整个准备好的数据框,我会收到错误 ValueError: Error when checks input: expected conv2d_20_input to have 4 dimension, but got array with shape (360, 1)

    发生错误是因为 df.arrays 返回一个数组数组。因此,在您的情况下,如果您检查 df.arrays.shape,它将是 (360,) 而不是 (360,28,28,3)。因此,您需要先删除嵌套。一种方法是:

    X = np.zeros((len(df.arrays), *df.arrays[0].shape))
    for i in range(len(df.arrays)):
        X[i] = df.arrays[i]
    

    X 现在可以传递给 model.fit。

    当我传递单个值时,我得到的错误是:检查输入时出错:预期 conv2d_16_input 有 4 个维度,但得到的数组形状为 (28, 28, 3)

    这很简单,只需添加一个批次维度。传递 df.arrays[0][None] 而不是 df.arrays[0]。

    >>> df.arrays[0].shape
    (28, 28, 3)
    >>> df.arrays[0][None].shape
    (1, 28, 28, 3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-03
      • 2021-10-02
      • 2017-02-16
      • 2018-10-27
      • 2021-11-07
      • 1970-01-01
      • 2020-11-27
      • 2021-12-30
      相关资源
      最近更新 更多