我在研究不同的CNN架构来预测CIFAR10数据集时,发现了一个有趣的GitHub仓库:
https://gist.github.com/wielandbrendel/ccf1ff6f8f92139439be
我尝试运行这个模型,但它是六年前创建的,以下Keras命令已不再有效:
model.add(Convolution2D(32, 3, 3, 3, border_mode=’full’))
这个命令如何转换为现代Keras语法中的Conv2D
?
当我尝试在Convolution2D(32, 3, 3, 3, ...)
中输入一系列整数时,Keras会报错?我猜32
是通道数,然后我们指定一个3x3
的内核大小,但我对最后一个3
(第四个位置)的含义不太确定。
附注:将border_mode
改为padding = 'valid'
或'same'
会返回以下错误:
model.add(Convolution2D(32, 3, 3, 3, padding='valid'))TypeError: __init__() got multiple values for argument 'padding'
回答:
你所关注的gist
已经过时,并且存在一些问题。你现在不需要遵循这个。这里是它的更新版本。试试这个。
导入和数据集
from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import (Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D)from tensorflow.keras.optimizers import SGD, Adadelta, Adagradimport tensorflow as tf # parametersbatch_size = 32nb_classes = 10nb_epoch = 5# the data, shuffled and split between tran and test sets(X_train, y_train), (X_test, y_test) = tf.keras.datasets.cifar10.load_data()# convert class vectors to binary class matricesY_train = tf.keras.utils.to_categorical(y_train, nb_classes) Y_test = tf.keras.utils.to_categorical(y_test, nb_classes)# train modelX_train = X_train.astype("float32") / 255X_test = X_test.astype("float32") / 255X_train.shape, y_train.shape, X_test.shape, y_test.shape((50000, 32, 32, 3), (50000, 1), (10000, 32, 32, 3), (10000, 1))
建模
model = Sequential()model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), activation='relu', padding="same"))model.add(Activation('relu'))model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), activation='relu', padding="same"))model.add(Activation('relu'))model.add(MaxPooling2D((2, 2)))model.add(Dropout(0.25))model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), activation='relu', padding="same"))model.add(Activation('relu'))model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), activation='relu', padding="same"))model.add(Activation('relu'))model.add(MaxPooling2D((2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(nb_classes))model.add(Activation('softmax'))# let's train the model using SGD + momentum (how original).sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
编译和运行
model.fit(X_train, Y_train, batch_size=batch_size, epochs=nb_epoch)# test score & top 1 performancescore = model.evaluate(X_test, Y_test, batch_size=batch_size)y_hat = model.predict(X_test)yhat = np.argmax(y_hat, 1)top1 = np.mean(yhat == np.squeeze(y_test))print('Test score/Top1', score, top1)