【问题标题】:ValueError: Input arrays should have the same number of samples as target arraysValueError:输入数组应具有与目标数组相同数量的样本
【发布时间】:2018-07-10 13:20:32
【问题描述】:

使用带有 Tensorflow 后端的 Keras DL 库,我尝试从 VGG-16 的中间层提取特征,以对我感兴趣的任务执行二进制分类。

数据集包含 1000 个(每个类别 500 个)训练样本和 200 个(每个类别 100 个)测试样本。我正在提取的特征之上训练一个小的全连接模型。在运行代码时,我可以看到 train_data 的大小是 (10000,6,6,512),validation_data 是 (2000,6,6,512) (float32),train_labels 是 (1000,2),validation_labels 是 (200,2) ) (int32)。

代码如下:

########################load libraries#########################################
import numpy as np
import time
from keras.layers import Dense, Dropout, Flatten
from keras.models import Model
from keras import applications
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator
#########################image characteristics#################################
img_rows=100 #dimensions of image, to be varied suiting the input requirements of the pre-trained model
img_cols=100
channel = 3 #RGB
num_classes = 2
batch_size = 10 
nb_epoch = 10
###############################################################################
''' This code uses VGG-16 as a feature extractor'''

feature_model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_rows, img_cols, 3))
#get the model summary
feature_model.summary()
#extract feature from the intermediate layer
feature_model = Model(input=feature_model.input, output=feature_model.get_layer('block5_conv2').output) 
#get the model summary
feature_model.summary()

#declaring image data generators

train_datagen = ImageDataGenerator()
val_datagen = ImageDataGenerator()

generator = train_datagen.flow_from_directory(
        'f1_100/train',
        target_size=(img_rows, img_cols),
        batch_size=batch_size,
        class_mode=None,  
        shuffle=False)  

train_data = feature_model.predict_generator(generator, 1000)
train_labels = np.array([[1, 0]] * 500 + [[0, 1]] * 500)

generator = val_datagen.flow_from_directory(
        'f1_100/test',
        target_size=(img_rows, img_cols),
        batch_size=batch_size,
        class_mode=None,
        shuffle=False)

validation_data = feature_model.predict_generator(generator, 200)
validation_labels = np.array([[1,0]] * 100 + [[0,1]] * 100)

###############################################################################
#addding the top layers and training them on the extracted features
from keras.models import Sequential

model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

sgd = SGD(lr=0.0001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd,
              loss='categorical_crossentropy',
              metrics=['accuracy'])
print('-'*30)
print('Start Training the top layers on the extracted features...')
print('-'*30)

#measure the time and train the model
t=time.time() 
hist = model.fit(train_data, train_labels, nb_epoch=nb_epoch, batch_size=batch_size,
                      validation_data=(validation_data, validation_labels),
                      verbose=2)
#print the history of the trained model
print(hist.history)
print('Training time: %s' % (time.time()-t))
###############################################################################

但是,在运行代码时,我收到以下错误:

Traceback (most recent call last):

  File "<ipython-input-14-cc5b1b34cc67>", line 46, in <module>
    verbose=2)

  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\models.py", line 960, in fit
    validation_steps=validation_steps)

  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py", line 1581, in fit
    batch_size=batch_size)

  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py", line 1426, in _standardize_user_data
    _check_array_lengths(x, y, sample_weights)

  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py", line 250, in _check_array_lengths
    'and ' + str(list(set_y)[0]) + ' target samples.')

ValueError: Input arrays should have the same number of samples as target arrays. Found 10000 input samples and 1000 target samples.

【问题讨论】:

  • train_labels 应该是 (10000,2) 并且 validation_labels 应该是 (2000,2) 匹配您的训练数据,这样对于每个输入,您都有一个预期的输出。

标签: deep-learning keras classification


【解决方案1】:

你看,你的 batch_size 是 10。

feature_model.predict_generator() 使用 steps 参数(在您的情况下为 1000)总共 10 (batch_size) 次。所以总共生成了10000个训练样本。

但在下一行中,您声明标签仅为 1000。(500 个 1 和 500 个 0)。

所以你有两个选择:

1) 像这样更改predict_generator() 中的steps(我相信这是您想要的,在训练中生成 1000 个样本,在验证中生成 200 个样本):

train_data = feature_model.predict_generator(generator, 100)
validation_data = feature_model.predict_generator(generator, 20)

2) 或者您可以更改标签中的数字:

train_labels = np.array([[1, 0]] * 5000 + [[0, 1]] * 5000)
validation_labels = np.array([[1,0]] * 1000 + [[0,1]] * 1000)

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2023-03-10
    • 2019-05-30
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多