python - keras 模型中出现 'only size-1 arrays can be converted to python scalars' 错误

标签 python keras

我正在使用此代码:

import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten,\
 Conv2D, MaxPooling2D
from keras.layers.normalization import BatchNormalization
import numpy as np
np.random.seed(1000)


# (3) Create a sequential model
model = Sequential()

# 1st Convolutional Layer

model.add(Conv2D(kernel_size=96, filters=(11, 11), input_shape=(64,64,3), activation='relu', strides=(4,4), padding='valid'))
# Pooling 
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation before passing it to the next layer
model.add(BatchNormalization())

# 2nd Convolutional Layer
model.add(Conv2D(256, 11, 11, activation='relu', strides=(1,1), padding='valid'))

# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())

# 3rd Convolutional Layer
model.add(Conv2D(384, 3, 3, activation='relu', strides=(1,1), padding='valid'))

# Batch Normalisation
model.add(BatchNormalization())

# 4th Convolutional Layer
model.add(Conv2D(384, 3, 3, activation='relu', strides=(1,1), padding='valid'))

# Batch Normalisation
model.add(BatchNormalization())

# 5th Convolutional Layer
model.add(Conv2D(256, 3, 3, activation='relu', strides=(1,1), padding='valid'))

# Pooling
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))
# Batch Normalisation
model.add(BatchNormalization())

# Passing it to a dense layer
model.add(Flatten())
# 1st Dense Layer
model.add(Dense(4096, input_shape=(224*224*3,)))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())

# 2nd Dense Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())

# 3rd Dense Layer
model.add(Dense(1000))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Batch Normalisation
model.add(BatchNormalization())

output_node=109
# Output Layer
model.add(Dense(output_node.shape, activation='softmax'))


model.summary()

# (4) Compile 
model.compile(loss='categorical_crossentropy', optimizer='adam',\
 metrics=['accuracy'])

#Fitting dataset

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'categorical')

test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'categorical')
#steps_per_epoch = number of images in training set / batch size (which is 55839/32)
#validation_steps = number of images in test set / batch size (which is 18739/32)

classifier.fit_generator(
        training_set,
        steps_per_epoch=55839/32,
        epochs=5,
        validation_data=test_set,
        validation_steps=18739/32)

我收到此错误:

TypeError: only size-1 arrays can be converted to Python scalars

我尝试查找此解决方案:Keras Model giving TypeError: only size-1 arrays can be converted to Python scalars 但是,正如您所看到的,我在输出层中使用了 .shape 方法,但它仍然不起作用。我没有看到在哪里创建了一个数组,该数组需要是该行中大小为 1 的数组

model.add(Conv2D(kernel_size=96, filters=(11, 11), input_shape=(64,64,3), activation='relu', strides=(4,4), padding='valid'))

因为这就是触发错误的地方。

编辑:我尝试按照@TavoGLC的建议为“过滤器”设置一个整数值:

model.add(Conv2D(filters=11, kernel_size=96, input_shape=(224,224,3), activation='relu', strides=(4,4), padding='valid', data_format='channels_last'))

我添加了 data_format='channels_last' 来克服负值问题。这使得这行代码正常运行,但是第二个卷积层开始给我带来问题。

# 2nd Convolutional Layer
model.add(Conv2D(filters=11, kernel_size=256, strides=(1,1), padding='valid', activation='relu'))

错误:

ValueError: Negative dimension size caused by subtracting 256 from 16 for 'conv2d_77/convolution' (op: 'Conv2D') with input shapes: [?,33,16,5], [256,256,33,11].

我再次尝试了此处给出的解决方案:Negative dimension size caused by subtracting 3 from 1 for 'conv2d_2/convolution' 似乎什么都不起作用。

最佳答案

更改这些:

  • 过滤器 - 使用单个整数(卷积的输出过滤器数量)。
  • kernel_size - 使用较小的尺寸,因为内核必须在输入形状中移动(对于更深的层,形状可能会减小,因此您必须了解输入层的形状才能获得尺寸)
  • 其他卷积层 - 您必须使用元组(例如 Conv2D(256, (11, 11))),否则它将被视为另一个变量,对于所有 Conv2D 层,遵循前面关于过滤器和 kernel_size 的过程
  • 对于输出形状使用
output_node=109
# Output Layer
model.add(Dense(output_node, activation='softmax'))

关于python - keras 模型中出现 'only size-1 arrays can be converted to python scalars' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56830017/

相关文章:

python-3.x - 如何制定正确的训练和测试维度以适合 elmo 嵌入模型

python - keras 无法多次调用 model.predict_classes

Python创建用户名密码程序

c++ - 基准测试(python 与使用 BLAS 的 c++)和(numpy)

python - TensorFlow 优化器中的 _get_hyper 和 _set_hyper 是什么?

python - 方法对象在神经网络代码中不可下标

python - numpy 数组输入到 tensorflow/keras 神经网络的 dtype 有什么关系吗?

python - Tensorflow:ValueError:应定义 `Dense` 输入的最后一个维度。发现 `None`

python - 为什么正则表达式在 Python 2.7 中匹配一个额外的空格?

python - 从 Spyder 中的命令行调试 Python 函数(或类)