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)
我正在从 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)