我是机器学习的新手。我有一个包含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的数组中,但是如何在热编码向量上正确地使用它呢?在
目前没有回答
相关问题 更多 >
编程相关推荐