ValueError: Error when checking target: expected activation_17 to have 2 dimensions, but got array with shape (1, 256, 256, 3)

ValueError: Error when checking target: expected activation_17 to have 2 dimensions, but got array with shape (1, 256, 256, 3)

我正在构建一个基于 VGG-16 预测人类年龄的 CNN,并提供两张 RGB 图像。 (文件类型:jpg)。我在 anaconda 环境中使用 tensorflow 后端 Python 2.7.

但是,它总是会引发错误:

Traceback (most recent call last):

File "train2.py", line 167, in shuffle=True)

File "/Users/name/anaconda/lib/python2.7/sitepackages/keras/models.py",line 973, in fit validation_steps=validation_steps)

File "/Users/name/anaconda/lib/python2.7/sitepackages/keras/engine/training.py", line 1581, in fit batch_size=batch_size)

File "/Users/name/anaconda/lib/python2.7/sitepackages/keras/engine/training.py", line 1418, in _standardize_user_data exception_prefix='target')

File "/Users/name/anaconda/lib/python2.7/sitepackages/keras/engine/training.py", line 141, in _standardize_input_data str(array.shape))

ValueError: Error when checking target: expected activation_17 to

have 2 dimensions, but got array with shape (1, 256, 256, 3)

如何解决这个错误?这是代码:

import keras

from keras.preprocessing.image import ImageDataGenerator

from keras.models import Sequential

from keras.layers import Dense

from keras.layers import Dropout

from keras.layers import Activation

from keras.layers import Flatten

from keras.layers import Conv2D

from keras.layers import MaxPooling2D

from keras.layers import BatchNormalization

from keras.utils import np_utils

import cv2

from PIL import Image

import numpy as np

from sklearn.cross_validation import train_test_split

from sklearn.model_selection import train_test_split

name_path = ["pathname"]

new_age_list=[45,52]

img_rows=256

img_cols=256

img_array = 
np.array([np.array(Image.open(i).resize((img_rows,img_cols),Image.BILINEAR)) for i in name_path[0:2]],"f")

(X, y) = (img_array[0:2],new_age_list[0:2])

y=np.asarray(y)

X=X.reshape(2,256,256,3)

# STEP 1: split X and y into training and testing sets

train_data, train_label,test_data, test_label= train_test_split(X, y, 
test_size=0.5, random_state=4)

train_data = train_data.astype('float32')

test_data = test_data.astype('float32')

train_data = train_data / 255

test_data = test_data / 255

""" Model """

model = Sequential()

""" Block 1 """

model.add(Conv2D(64, (3,3), padding='same', 
border_mode='valid',input_shape=(256,256,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(64, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2,2)))

""" Block 2 """

model.add(Conv2D(128, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(128, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2,2)))

""" Block 3 """

model.add(Conv2D(256, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(256, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(256, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2,2)))

""" Block 4 """
model.add(Conv2D(512, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(512, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(512, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2,2)))

""" Block 5 """

model.add(Conv2D(512, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(512, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Conv2D(512, (3,3)))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Dropout(0.25))

""" Flatten """

model.add(Flatten())

model.add(Dense(512))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Dense(128))

model.add(BatchNormalization())
model.add(Activation('relu'))

model.add(Dense(32))

model.add(BatchNormalization())

model.add(Activation('relu'))

model.add(Dense(1))

model.add(BatchNormalization())

model.add(Activation('softmax'))

""" Optimizer """

opt = keras.optimizers.rmsprop(lr=config.learning_rate, 

decay=config.decay)

print model.summary()

model.compile(loss='mean_squared_error', optimizer=opt, metrics=
['accuracy'])

""" Fit Data """

batch_size = 512

epoch = 1000

learning_rate = 1e-4

decay = 1e-7

for i in range(epoch):

    model.fit(train_data, train_label,

              batch_size=batch_size,

              epochs=int(epoch/epoch),

              validation_data=(test_data, test_label),

              shuffle=True)

我假设 "activation_17" 指的是最后一个激活层,即 "softmax" 层。当您的图像毫无问题地通过图层传播时,我认为您的标签尺寸存在问题。

在检查 documentationsklearn.model_selection.train_test_split 之后,您似乎错误地分配了 train_test_split() 的 return 值。

试试看:

train_data, test_data, train_label, test_label= train_test_split(X, y, test_size=0.5, random_state=4)