在Keras中使用One-hot编码输出向量和密集层来训练模型的方法

2024-04-25 22:03:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我是机器学习的新手。我有一个包含6个类的图像数据集,每个类有800个序列和200个验证图像。我用keras来训练模特儿。以前,我使用sparse_categorical_crossentropy作为loss参数来编译模型,因为我提供了一个运行没有问题的整数(类的总数)。代码如下:

import numpy as np
from keras import applications
from keras import Model
from keras.models import Sequential
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Input
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
from keras import backend as K
from keras import optimizers
from numpy import array
import cv2
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder


img_width, img_height = 150, 150

class_indics = 'class_indices.npy'
bottleneck_train_path = 'bottleneck_features_train.npy'
bottleneck_validation_path = 'bottleneck_features_validation.npy'
top_model_weights_path = 'bottleneck_fc_model.h5'
train_data_dir = 'data/train'
validation_data_dir = 'data/validation/'

nb_train_samples = 4800
nb_validation_samples = 1200

epochs = 50
batch_size = 15


def generate_class_indics():
    datagen = ImageDataGenerator(rescale=1. / 255)

    generator_top = datagen.flow_from_directory(train_data_dir,
                                                    target_size=(img_width, img_height),
                                                    batch_size=batch_size,
                                                    class_mode='categorical',
                                                    shuffle=False)

    # save the class indices to use later in predictions
    np.save(class_indics, generator_top.class_indices)


def train_top_model():
    print('Training of top model started.')
    train_data = np.load(open(bottleneck_train_path, 'rb'))
    train_labels = np.array(
        [0] * (nb_train_samples // 2) + [1] * (nb_train_samples // 2))

    validation_data = np.load(open(bottleneck_validation_path, 'rb'))
    validation_labels = np.array(
        [0] * (nb_validation_samples // 2) + [1] * (nb_validation_samples // 2))

    class_dictionary = np.load('class_indices.npy').item()
    num_classes = len(class_dictionary)

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

    model.compile(optimizer='rmsprop',
                  loss='sparse_categorical_crossentropy', metrics=['accuracy'])

    model.fit(train_data, train_labels,
              epochs=epochs,
              batch_size=batch_size,
              validation_data=(validation_data, validation_labels))
    model.save_weights(top_model_weights_path)
    print('Training of top model completed & saved as: ',top_model_weights_path)

现在我想用分类熵的热编码向量来编译模型。在

^{pr2}$

但每当我要使用onehot编码的输出到Dense时,就像:

model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(generate_one_hot_encoded(), activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

它给出错误:

scale /= max(1., float(fan_in + fan_out) / 2) TypeError: only size-1 arrays can be converted to Python scalars

我想我正在尝试将多维数组放入大小为1的数组中,但是如何在热编码向量上正确地使用它呢?在


Tags: pathfromimportadddatasizemodeltop