我试图从头开始训练我的VGG16网络 . 为此,我从https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3下载了该架构

其中一位作者将代码编写为vgg-16_keras.py代码 . 在此代码中,预期的默认图像大小为224x224 . 我的输入图像也有相同的大小 . 所以,尺寸没有问题 .

接下来,我进行了一些细微的更改,以便我准备好在我手边的一些示例图像上训练我的模型 . 当我试图训练我的模型时,我得到了“负面维度”错误 . 为了调试代码,我试图获得一些功能,它给了我不同层的输出尺寸,但遗憾的是没有一个 .

我发布我的代码以及错误消息

import keras
import numpy as np
from keras import backend as K
from keras.models import Sequential
from keras.layers import Activation, ZeroPadding2D, Convolution2D, MaxPooling2D, Dropout
from keras.layers.core import Dense, Flatten
from keras.optimizers import Adam
from keras.metrics import categorical_crossentropy
from keras.preprocessing.image import ImageDataGenerator
from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import *
from matplotlib import pyplot as plt
from sklearn.metrics import confusion_matrix
import itertools
from matplotlib.pyplot import *


train_path="cats-and-dogs/train"
valid_path="cats-and-dogs/valid"
test_path="cats-and-dogs/test"

train_batches=ImageDataGenerator().flow_from_directory(train_path, target_size=(224,224), classes=['dog','cat'], batch_size=20)
valid_batches=ImageDataGenerator().flow_from_directory(valid_path, target_size=(224,224), classes=['dog','cat'], batch_size=10)
test_batches=ImageDataGenerator().flow_from_directory(test_path, target_size=(224,224), classes=['dog','cat'], batch_size=10)

imgs,labels=next(train_batches)

#Defining individual layers for oour CNN

l1=ZeroPadding2D((1,1),input_shape=(3,224,224))
l2=Convolution2D(64, 3, activation='relu')
l3=ZeroPadding2D((1,1))
l4=Convolution2D(64, 3, activation='relu')
l5=MaxPooling2D((2,2), strides=(2,2))

#
#
l6=ZeroPadding2D((1,1))
l7=Convolution2D(128, 3, activation='relu')
l8=ZeroPadding2D((1,1))
l9=Convolution2D(128, 3, activation='relu')
l10=MaxPooling2D((2,2), strides=(2,2))

l11=ZeroPadding2D((1,1))
l12=Convolution2D(256, 3, 3, activation='relu')
l13=ZeroPadding2D((1,1))
l14=Convolution2D(256, 3, 3, activation='relu')
l15=ZeroPadding2D((1,1))
l16=Convolution2D(256, 3, 3, activation='relu')
l17=MaxPooling2D((2,2), strides=(2,2))

l18=ZeroPadding2D((1,1))
l19=Convolution2D(512, 3, 3, activation='relu')
l20=ZeroPadding2D((1,1))
l21=Convolution2D(512, 3, 3, activation='relu')
l22=ZeroPadding2D((1,1))
l23=Convolution2D(512, 3, 3, activation='relu')
l24=MaxPooling2D((2,2), strides=(2,2))

l25=ZeroPadding2D((1,1))
l26=Convolution2D(512, 3, 3, activation='relu')
l27=ZeroPadding2D((1,1))
l28=Convolution2D(512, 3, 3, activation='relu')
l29=ZeroPadding2D((1,1))
l30=Convolution2D(512, 3, 3, activation='relu')
l31=MaxPooling2D((2,2), strides=(2,2))

l32=Flatten()
l33=Dense(4096, activation='relu')
l34=Dropout(0.5)
l35=Dense(4096, activation='relu')
l36=Dropout(0.5)
l37=Dense(1000, activation='softmax')

model = Sequential([l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15,l16,l17,l18,l19,l20,l21,l22,l23,l24,l25,l26,l27,l28,l29,l30,l31,l32,l33,l34,l35,l36,l37])

#model = Sequential([l1,l2,l3,l4,l5,l6,l7,l8,l9,l10])
#model = Sequential([l1,l2,l3,l4,l5,l6,l7,l8,l9,l10])
print("Now Printing the model summary \n")
print(model.summary())

请注意,我没有对代码中给出的尺寸,超参数值进行任何更改 . 我只是从文档的角度修改代码,比如命名不同的层,添加注释等 .

另外,建议自己诊断此类错误的方法 .

错误消息如下:

runfile('/ home / upendra / vgg_from_scratch',wdir ='/ home / upendra')找到属于2个类的200个图像 . 找到了100个属于2个类的图像 . 找到60个属于2个类的图像 . / home / upendra / vgg_from_scratch:53:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D(256,(3,3),activation =“relu”)l12 = Convolution2D(256,3,3,activation =' relu')/ home / upendra / vgg_from_scratch:55:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D(256,(3,3),activation =“relu”)l14 = Convolution2D(256,3,3, activation ='relu')/ home / upendra / vgg_from_scratch:57:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D(256,(3,3),activation =“relu”)l16 = Convolution2D(256,3 ,3,activation ='relu')/ home / upendra / vgg_from_scratch:61:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D(512,(3,3),activation =“relu”)l19 = Convolution2D( 512,3,3,activation ='relu')/ home / upendra / vgg_from_scratch:63:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D(512,(3,3),activation =“relu”)l21 = Convolution2D(512,3,3,activation ='relu')/ home / upendra / vgg_from_scratch:65:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D(512,( 3,3),activation =“relu”)l23 = Convolution2D(512,3,3,activation ='relu')/ home / upendra / vgg_from_scratch:69:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D( 512,(3,3),activation =“relu”)l26 = Convolution2D(512,3,3,activation ='relu')/ home / upendra / vgg_from_scratch:71:UserWarning:更新你对Keras 2 API的Conv2D调用:Conv2D(512,(3,3),activation =“relu”)l28 = Convolution2D(512,3,3,activation ='relu')/ home / upendra / vgg_from_scratch:73:UserWarning:更新你的Conv2D调用Keras 2 API:Conv2D(512,(3,3),activation =“relu”)l30 = Convolution2D(512,3,3,activation ='relu')Traceback(最近一次调用最后一次):文件“”,第1行,在runfile('/ home / upendra / vgg_from_scratch',wdir ='/ home / upendra')文件“/home/upendra/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”,第668行,在runfile execfile(文件名,命名空间)文件“/home/upendra/anaconda3/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py”,第108行,i n execfile exec(compile(f.read(),filename,'exec'),namespace)文件“/ home / upendra / vgg_from_scratch”,第83行,在model = Sequential([l1,l2,l3,l4,l5, L6,L7,L8,L9,L10,L11,L12,L13,L14,L15,L16,L17,L18,L19,L20,L21,L22,L23,L24,L25,L26,L27,L28,L29,L30, l31,l32,l33,l34,l35,l36,l37])在init self中文件“/home/upendra/anaconda3/lib/python3.6/site-packages/keras/engine/sequential.py”,第92行 . 添加(图层)文件“/home/upendra/anaconda3/lib/python3.6/site-packages/keras/engine/sequential.py”,第185行,添加output_tensor = layer(self.outputs [0])文件“ /home/upendra/anaconda3/lib/python3.6/site-packages/keras/engine/base_layer.py“,第457行,在呼叫输出= self.call(输入,** kwargs)文件”/ home / upendra / anaconda3 / lib / python3.6 / site-packages / keras / layers / pooling.py“,第157行,在调用data_format = self.data_format中)文件”/home/upendra/anaconda3/lib/python3.6/site-packages /keras/layers/pooling.py“,第220行,在_pooling_function pool_mode ='max')文件”/home/upendra/anaconda3/lib/python3.6/site-packag es / keras / backend / tensorflow_backend.py“,第3880行,在pool2d中data_format = tf_data_format)文件”/home/upendra/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/nn_ops.py“,第2153行,在max_pool name = name)文件“/home/upendra/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/gen_nn_ops.py”,第4640行,在max_pool中data_format = data_format,name =名称)文件“/home/upendra/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py”,第787行,在_apply_op_helper中op_def = op_def)文件“/ home / upendra / anaconda3 / lib / python3.6 / site-packages / tensorflow / python / framework / ops.py“,第3414行,在create_op中op_def = op_def)文件“/home/upendra/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py”,第1756行,在init control_input_ops中)文件“/home/upendra/anaconda3/lib/python3.6 /site-packages/tensorflow/python/framework/ops.py“,第1592行,在_create_c_op中引发ValueError(str(e))ValueError:通过从'max_pooling2d_9 / MaxPool'中减去2而导致的负维度大小(op:' MaxPool')输入形状:[?,1,112,128] .