Я хочу знать, как гиперпараметры CNN влияют на точность, поэтому я сделал этот код:
from numpy.random import seed
seed(1)
import tensorflow
tensorflow.random.set_seed(2)
from keras import layers
from keras import models
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.utils import to_categorical
done=[[0 for i in range(7)] for j in range(100)]
done[0][0]='filter1'
done[0][1]='filter2'
done[0][2]='noyeau1'
done[0][3]='noyeau2'
done[0][4]='epochess'
done[0][5]='batch'
done[0][6]='precision'
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
y0=1
batch=[32,64,128]
epochss=[4,10]
noyeau1=[3,5,7]
noyeau2=[3,5,7]
filterr1=[32,64,128]
filterr2=[32,64,128]
y0=1
for i in range(3):
for j in range(3):
model = models.Sequential()
model.add(layers.Conv2D(filterr1[i], (noyeau1[i], noyeau1[i]), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(filterr2[j], (noyeau2[j],noyeau2[j]), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(filterr2[j], (noyeau2[j],noyeau2[j]), activation='relu'))
model.summary()
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
for s in range(2):
for l in range(3):
history =model.fit(train_images, train_labels, epochs=epochss[s], batch_size=batch[l])
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('test_acc',test_acc)
done[y0][0]=filterr1[i]
done[y0][1]=filterr2[j]
done[y0][2]=noyeau1[i]
done[y0][3]=noyeau2[j]
done[y0][4]=epochss[s]
done[y0][5]=batch[l]
done[y0][6]=test_acc
y0=y0+1
, но когда я его запускаю, я получаю эту ошибку:
ValueError: отрицательный размерный размер, вызванный вычитанием 5 из 3 для 'conv2d_135 / convolution' (op: 'Conv2D') с входными формами: [?, 3,3,32], [5,5,32,32].
Я не понимаю, почему, похоже, что второй скрытый слой не принимает (5,5) в качестве размера ядра. спасибо