Keras 输入形状错误 - 传递整个数组而不是每一行

Keras input shape error - passing the whole array not each line

我正在从 csv 文件加载图像。图像为 300 x 300 像素但展平为 90000。输入形状时出现错误。我正在使用 tensorflow 后端。我附上了我的 csv 文件的图像以及错误的图像。看起来它传递了整个数组列表而不是传递每一行。

"ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 arrays but instead got the following list of 380 arrays:[array([ 43., 45., 46., ..., 161., 152., 146.]), array([ 211., 222., 224., ..., 212., 213., 213.]), array([ 201., 201., "

csv file

error

            import numpy as np
            from keras.models import Sequential
            from keras.layers import Dense, Dropout
            import csv
            import cv2
            import re

            loaded_images_train = []
            loaded_labels_train = []

            loaded_images_test = []
            loaded_labels_test = []

            with open('images_train.csv') as f:
                csvReader = csv.reader(f, lineterminator = '\n')
                for row in csvReader:
                    row = np.asarray(row, dtype='float')
                    loaded_images_train.append(row)

            with open('labels_train.csv') as f:
                csvReader = csv.reader(f, lineterminator = '\n')
                for row in csvReader:
                    row = str(row)
                    row = row.strip(',')
                    loaded_labels_train.append(row)

            with open('images_test.csv') as f:
                csvReader = csv.reader(f, lineterminator = '\n')
                for row in csvReader:
                    row = np.asarray(row, dtype='float')
                    loaded_images_test.append(row)

            with open('labels_test.csv') as f:
                csvReader = csv.reader(f, lineterminator = '\n')
                for row in csvReader:
                    row = str(row)
                    row = row.strip(',')
                    loaded_labels_test.append(row)



            # load data
            x_train = loaded_images_train
            y_train = loaded_labels_train
            print("Loaded Training Data")

            x_test = loaded_images_test
            y_test = loaded_labels_test
            print("Loaded Testing Data")

            model = Sequential()
            model.add(Dense(64, input_shape=(90000,), activation='relu'))
            model.add(Dropout(0.5))
            model.add(Dense(64, activation='relu'))
            model.add(Dropout(0.5))
            model.add(Dense(1, activation='sigmoid'))

            model.compile(loss='binary_crossentropy',
                           optimizer='rmsprop',
                           metrics=['accuracy'])
            model.fit(x_train, y_train,
                        epochs=20,
                        batch_size=128)
            #score = model.evaluate(x_test, y_test, batch_size=128)
            print(score)

您遇到问题的原因是您的数据集类型为list,但Keras模型可接受的类型仅为numpy array

您需要使用 np.asarray(loaded_images_train) 将列表转换为 numpy array,并确保数据的形状为 (n,90000)

你用 asarray 转换每一行然后用 list 数组喂养 keras 的方式是行不通的。

我用一种截然不同的方法测试了你的代码,它 运行 完美地使用了你在评论中提供的 csv(将 input_size 更改为 400)。

从文件中读取所有行到 loaded_images_train。这将是一个列表列表:

input_size = 90000

with open('images_train.csv') as f:
    csvReader = csv.reader(f, lineterminator = '\n')
    for row in csvReader:
        assert len(row) == input_size
        loaded_images_train.append(row)

根据您对我的评论的反馈,我已经包含了断言。 您还可以 assert len(row) == output_size 作为标签。

另一方面,如果您非常确定行的大小,则可以用一个简单的循环代替循环:

loaded_images_train = list(csvReader)

无论您选择哪个,都对图像进行相同的测试。

然后在声明 x_train 时转换为 numpy.ndarray:

x_train = np.asarray(loaded_images_train, dtype=float)  # you don't really need the quotes here

最后,打印加载数据的形状可以帮助您知道一切正常。例如:

print("Loaded Training Data", x_train.shape)