Cip*_*anu 27 python python-3.x keras tensorflow
我正在研究Keras中类似VGG16的模型,来自Places205的3类子集,并遇到以下错误:
ValueError: Error when checking target: expected dense_3 to have shape (3,) but got array with shape (1,)
Run Code Online (Sandbox Code Playgroud)
我读过多个类似的问题但到目前为止没有人帮助我.错误发生在最后一层,我放了3,因为这是我现在正在尝试的类数.
代码如下:
import keras from keras.datasets
import cifar10 from keras.preprocessing.image
import ImageDataGenerator from keras.models
import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K import os
# Constants used
img_width, img_height = 224, 224
train_data_dir='places\\train'
validation_data_dir='places\\validation'
save_filename = 'vgg_trained_model.h5'
training_samples = 15
validation_samples = 5
batch_size = 5
epochs = 5
if K.image_data_format() == 'channels_first':
input_shape = (3, img_width, img_height) else:
input_shape = (img_width, img_height, 3)
model = Sequential([
# Block 1
Conv2D(64, (3, 3), activation='relu', input_shape=input_shape, padding='same'),
Conv2D(64, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
# Block 2
Conv2D(128, (3, 3), activation='relu', padding='same'),
Conv2D(128, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
# Block 3
Conv2D(256, (3, 3), activation='relu', padding='same'),
Conv2D(256, (3, 3), activation='relu', padding='same'),
Conv2D(256, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
# Block 4
Conv2D(512, (3, 3), activation='relu', padding='same'),
Conv2D(512, (3, 3), activation='relu', padding='same'),
Conv2D(512, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
# Block 5
Conv2D(512, (3, 3), activation='relu', padding='same',),
Conv2D(512, (3, 3), activation='relu', padding='same',),
Conv2D(512, (3, 3), activation='relu', padding='same',),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
# Top
Flatten(),
Dense(4096, activation='relu'),
Dense(4096, activation='relu'),
Dense(3, activation='softmax') ])
model.summary()
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# no augmentation config train_datagen = ImageDataGenerator() validation_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
validation_generator = validation_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
model.fit_generator(
train_generator,
steps_per_epoch=training_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=validation_samples // batch_size)
model.save_weights(save_filename)
Run Code Online (Sandbox Code Playgroud)
小智 16
问题在于您的标签数据形状.在多类问题中,您正在预测每个可能类的可能性,因此必须提供(N,m)形状的标签数据,其中N是训练样本的数量,m是可能类的数量(在您的情况下为3) .
Keras期望y数据为(N,3)形状,而不是(N,),就像你可能提供的那样,这就是它引发错误的原因.
使用例如OneHotEncoder将标签数据转换为单热编码形式.
Pet*_*ter 11
正如其他人所提到的,Keras期望在多类问题中使用“一种热门”编码。
Keras带有方便的功能来重新编码标签:
print(train_labels)
[1. 2. 2. ... 1. 0. 2.]
print(train_labels.shape)
(2000,)
Run Code Online (Sandbox Code Playgroud)
使用to_categorical重新编码标签以获取正确的输入形状:
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
print(train_labels)
[[0. 1. 0.]
[0. 0. 1.]
[0. 0. 1.]
...
[0. 1. 0.]
[1. 0. 0.]
[0. 0. 1.]]
print(train_labels.shape)
(2000, 3) # viz. 2000 observations, 3 labels as 'one hot'
Run Code Online (Sandbox Code Playgroud)
在多类中要更改/检查的其他重要事项(与二进制分类相比):
设置class_mode='categorical'在generator()功能(S)。
不要忘记最后一个密集层必须指定标签(或类)的数量:
model.add(layers.Dense(3, activation='softmax'))
Run Code Online (Sandbox Code Playgroud)
确保选择activation=和loss=以适合多类问题,通常意味着activation='softmax'和loss='categorical_crossentropy'。
小智 9
有同样的问题.要解决这个问题,您可以简单地将validation_generator和train_generator中的类模式从"二进制"更改为"分类" - 这是因为您有3个类 - 它们不是二进制的.
问题:预期dense_3 具有形状(3,) 但得到形状为(1,) 的数组
如果您使用它进行分类,那么在添加密集层的参数中变量的数量应该是正确的。
variables_for_classification=5 #change it as per your number of categories
model.add(Dense(variables_for_classification, activation='softmax'))
model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size,validation_split=0.1,callbacks=[EarlyStopping(monitor='val_loss', patience=3, min_delta=0.0001)])
Run Code Online (Sandbox Code Playgroud)
为了更清楚。当我使用 LSTM 来预测新闻的类别时,类别是 5-商业、科技、政治、体育、娱乐
在那个密集的函数中,当我输入 5 时它工作正常。
| 归档时间: |
|
| 查看次数: |
35898 次 |
| 最近记录: |