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" 层。当您的图像毫无问题地通过图层传播时,我认为您的标签尺寸存在问题。
在检查 documentation 与 sklearn.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)
我正在构建一个基于 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" 层。当您的图像毫无问题地通过图层传播时,我认为您的标签尺寸存在问题。
在检查 documentation 与 sklearn.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)