CNNのネットワークを組んで
MNISTを用いて画像認識をしています。
意味がわかっていない部分があり教えて欲しいです。
下記はCNNの画像分類のプログラムになります。
質問は、
・カーネルと呼ばれている特徴を叩き出すフィルターの中は乱数なのでしょうか。
・深さとは何なのか教えてもらえますか。
イメージがつかめていないのですが、
extract image features by convolution and max pooling layers
から
CNNの本格的なネットワークの構成の指示が始まっています。
そこで、
このケースではフィルタとなるカーネルサイズ(フィルター)は5×5のサイズを指定しています。
・このフィルターの中は乱数なのでしょうか。
このフィルターは1マスずつ動けば縦横23回移動するので
28×28で構成されているMNISTの画像データは
24×24のサイズになります。
この24×24のサイズのマトリックスを特徴マップと言われている。
・ここで、特徴マップと深さと言われている20はどの様な関係にあるのか
・深さとは一体何なのか理解できません
教えていただけますでしょうか。
Python
1import os 2import keras 3from keras.models import Sequential 4from keras.layers.convolutional import Conv2D 5from keras.layers.convolutional import MaxPooling2D 6from keras.layers.core import Activation 7from keras.layers.core import Flatten 8from keras.layers.core import Dense 9from keras.datasets import mnist 10from keras.optimizers import Adam 11from keras.callbacks import TensorBoard 12 13 14def lenet(input_shape, num_classes): 15 model = Sequential() 16 17 # extract image features by convolution and max pooling layers 18 model.add(Conv2D( 19 20, kernel_size=5, padding="same", 20 input_shape=input_shape, activation="relu" 21 )) 22 model.add(MaxPooling2D(pool_size=(2, 2))) 23 model.add(Conv2D(50, kernel_size=5, padding="same", activation="relu")) 24 model.add(MaxPooling2D(pool_size=(2, 2))) 25 # classify the class by fully-connected layers 26 model.add(Flatten()) 27 model.add(Dense(500, activation="relu")) 28 model.add(Dense(num_classes)) 29 model.add(Activation("softmax")) 30 return model 31 32 33class MNISTDataset(): 34 35 def __init__(self): 36 self.image_shape = (28, 28, 1) # image is 28x28x1 (grayscale) 37 self.num_classes = 10 38 39 def get_batch(self): 40 (x_train, y_train), (x_test, y_test) = mnist.load_data() 41 42 x_train, x_test = [self.preprocess(d) for d in [x_train, x_test]] 43 y_train, y_test = [self.preprocess(d, label_data=True) for d in 44 [y_train, y_test]] 45 46 return x_train, y_train, x_test, y_test 47 48 def preprocess(self, data, label_data=False): 49 if label_data: 50 # convert class vectors to binary class matrices 51 data = keras.utils.to_categorical(data, self.num_classes) 52 else: 53 data = data.astype("float32") 54 data /= 255 # convert the value to 0~1 scale 55 shape = (data.shape[0],) + self.image_shape # add dataset length 56 data = data.reshape(shape) 57 58 return data 59 60 61class Trainer(): 62 63 def __init__(self, model, loss, optimizer): 64 self._target = model 65 self._target.compile( 66 loss=loss, optimizer=optimizer, metrics=["accuracy"] 67 ) 68 self.verbose = 1 69 logdir = "logdir_lenet" 70 self.log_dir = os.path.join(os.path.dirname(__file__), logdir) 71 72 def train(self, x_train, y_train, batch_size, epochs, validation_split): 73 if os.path.exists(self.log_dir): 74 import shutil 75 shutil.rmtree(self.log_dir) # remove previous execution 76 os.mkdir(self.log_dir) 77 78 self._target.fit( 79 x_train, y_train, 80 batch_size=batch_size, epochs=epochs, 81 validation_split=validation_split, 82 callbacks=[TensorBoard(log_dir=self.log_dir)], 83 verbose=self.verbose 84 ) 85 86 87dataset = MNISTDataset() 88 89# make model 90model = lenet(dataset.image_shape, dataset.num_classes) 91 92# train the model 93x_train, y_train, x_test, y_test = dataset.get_batch() 94trainer = Trainer(model, loss="categorical_crossentropy", optimizer=Adam()) 95trainer.train( 96 x_train, y_train, batch_size=128, epochs=12, validation_split=0.2 97 ) 98 99# show result 100score = model.evaluate(x_test, y_test, verbose=0) 101print("Test loss:", score[0]) 102print("Test accuracy:", score[1]) 103
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/28 10:46
2021/01/28 10:59
2021/01/28 11:43
2021/01/28 12:15
2021/01/28 14:39
2021/01/28 15:11
2021/01/28 23:19