![](/img/trans.png)
[英]ValueError: Error when checking target: expected dense_2 to have shape (1,) but got array with shape (50,)
[英]ValueError: Error when checking target: expected dense_2 to have 4 dimensions, but got array with shape (64, 50) (Keras)
使用Keras以這種方式訓練預訓練模型時:
baseModel = keras.applications.resnet50.ResNet50(include_top=False, weights='imagenet')
t = baseModel.output
t = MaxPooling2D()(t)
t = Dense(1000, activation='relu', kernel_regularizer=regularizers.l2(0.01))(t)
predictions = Dense(NUMCLASSES, activation='softmax')(t)
model = Model(inputs=baseModel.input, outputs=predictions)
for layer in baseModel.layers:
layer.trainable = False
model.compile(loss=losses.categorical_crossentropy, optimizer=keras.optimizers.Adam())
# loading the data
files = np.array(list(train_gt.keys()))
np.random.shuffle(files)
pics = [resize(io.imread(join(trainImgDir, f)), INPUTSHAPE, mode='reflect') for f in files]
pics = np.array(pics)
classes = np.array([train_gt[f] for f in files])
classes = to_categorical(classes, NUMCLASSES)
train = pics[: int(pics.shape[0] * ((SPLITDATA - 1) / SPLITDATA))]
classesTr = classes[: int(classes.shape[0] * ((SPLITDATA - 1) / SPLITDATA))]
# training
fIn = open("Error", 'w')
batchSize = 64
for ep in range(1000):
# train data
trLosses = np.array([], dtype='Float64')
for s in range(train.shape[0] // batchSize + (train.shape[0] % batchSize != 0)):
batch = train[s * batchSize : (s + 1) * batchSize]
batchClasses = classesTr[s * batchSize : (s + 1) * batchSize]
trLosses = np.append(trLosses, model.train_on_batch(batch, batchClasses))
我有一個錯誤:
File "/home/mark/miniconda3/lib/python3.6/site-packages/keras/engine/training.py", line 1636, in train_on_batch
check_batch_axis=True)
File "/home/mark/miniconda3/lib/python3.6/site-packages/keras/engine/training.py", line 1315, in _standardize_user_data
exception_prefix='target')
File "/home/mark/miniconda3/lib/python3.6/site-packages/keras/engine/training.py", line 127, in _standardize_input_data
str(array.shape))
ValueError: Error when checking target: expected dense_2 to have 4 dimensions, but got array with shape (64, 50)
我嘗試了其他損失,但這沒有幫助。 batchClasses具有形狀(batchSize,NUMCLASSES)=(64,50),我希望在Dense的輸出中出現這種形狀。
MaxPooling2D()
不會刪除寬度和高度尺寸,因此t = MaxPooling2D()(t)
的輸出將是形狀的張量(batch_size, w, h, 2048)
。 這就是為什么下面的“ Dense
層為您提供4D張量的原因。
另外,由於沒有為MaxPooling2D()
提供任何參數,默認參數pool_size=(2, 2)
,因此w
和h
都可能大於1。
因此,您基本上有兩種選擇,取決於您認為更適合自己的問題的方式:
在MaxPooling2D()
Flatten()
之后添加Flatten()
:我不確定這是否是您想要的,因為如果w
和h
較大,則將其展平將導致相當大的向量。
刪除t = MaxPooling2D()(t)
並使用以下任一方法:
ResNet50(..., pooling='max')
(推薦),或 t = GlobalMaxPooling2D()(t)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.