ValueError:检查目标时出错:预期 activation_17 具有 2 维,但得到的数组形状为 (1, 256, 256, 3)
Posted
技术标签:
【中文标题】ValueError:检查目标时出错:预期 activation_17 具有 2 维,但得到的数组形状为 (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) 【发布时间】:2018-06-03 08:57:20 【问题描述】:我正在构建一个基于 VGG-16 预测人类年龄的 CNN,并输入两个 RGB 图像。 (文件类型:jpg)。我在 Python 2.7 的 anaconda 环境中使用 tensorflow 后端。
但是,它总是会引发错误:
Traceback(最近一次调用最后一次):
文件“train2.py”,第 167 行,在 洗牌=真)
文件“/Users/name/anaconda/lib/python2.7/sitepackages/keras/models.py”,第 973 行,适合 validation_steps=validation_steps)
文件“/Users/name/anaconda/lib/python2.7/sitepackages/keras/engine/training.py”,第 1581 行,适合 batch_size=batch_size)
文件“/Users/name/anaconda/lib/python2.7/sitepackages/keras/engine/training.py”,第 1418 行,在 _standardize_user_data exception_prefix='target')
文件“/Users/name/anaconda/lib/python2.7/sitepackages/keras/engine/training.py”,第 141 行,在 _standardize_input_data str(array.shape))
ValueError:检查目标时出错:预期activation_17 到
有 2 个维度,但得到了形状为 (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)
【问题讨论】:
请按照此处所述格式化您的代码:***.com/editing-help#comment-formatting 还请对您使用的平台进行更多描述并相应地标记它们 @raurunner 感谢您帮助安排代码! 有人可以帮我检查一下吗?有点紧急。我必须在下周进行演示...... 【参考方案1】:我假设“activation_17”是指最后一个激活层,即“softmax”层。由于您的图像可以毫无问题地通过图层传播,我认为标签的尺寸存在问题。
在检查了documentation 中的sklearn.model_selection.train_test_split
之后,您似乎在分配train_test_split()
的返回值时犯了一个错误。
像这样尝试:
train_data, test_data, train_label, test_label= train_test_split(X, y, test_size=0.5, random_state=4)
【讨论】:
是的!它似乎工作!虽然它引发了另一个错误,但我认为这只是不正确的 CNN 结构错误。我可以自己解决。非常感谢:) @NickChao 如果答案令人满意,请考虑接受。以上是关于ValueError:检查目标时出错:预期 activation_17 具有 2 维,但得到的数组形状为 (1, 256, 256, 3)的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:检查目标时出错:预期activation_6 的形状为(70,)但得到的数组形状为(71,)
ValueError:检查目标时出错:预期dense_4的形状为(4,)但得到的数组形状为(1,)
ValueError:检查目标时出错:预期dense_3的形状为(1,)但得到的数组形状为(2,)
ValueError:检查目标时出错:预期activation_6具有形状(无,2)但得到的数组具有形状(5760,1)
ValueError:检查目标时出错:预期 activation_17 具有 2 维,但得到的数组形状为 (1, 256, 256, 3)
ValueError:检查目标时出错:预期 main_prediction 有 3 个维度,但得到了形状为 (1128, 1) 的数组