def build_model(self): # 建立网络结构 # TODO:建立三层神经网络结构 print('Building multi-layer perception model...') self.fc1 = FullyConnectedLayer(self.input_size, self.hidden1) self.relu1 = ReLULayer() self.fc2 = FullyConnectedLayer(self.hidden1, self.hidden2) self.relu2 = ReLULayer() self.fc3 = FullyConnectedLayer(self.hidden2, self.out_classes) self.softmax = SoftmaxLossLayer() self.update_layer_list = [self.fc1, self.fc2, self.fc3]
def build_model(self): # TODO: 建立VGG19网络结构 # 可以通过设置 type=1 来使用优化后的卷积和池化层,如 ConvolutionalLayer(3, 3, 64, 1, 1, type=1) print('Building vgg-19 model...') self.layers = {} self.layers['conv1_1'] = ConvolutionalLayer(3, 3, 64, 1, 1) self.layers['relu1_1'] = ReLULayer() self.layers['conv1_2'] = ConvolutionalLayer(3, 64, 64, 1, 1) self.layers['relu1_2'] = ReLULayer() self.layers['pool1'] = MaxPoolingLayer(2, 2) _______________________ self.layers['conv5_4'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_4'] = ReLULayer() self.layers['pool5'] = MaxPoolingLayer(2, 2) self.update_layer_list = [] for layer_name in self.layers.keys(): if 'conv' in layer_name: self.update_layer_list.append(layer_name)
def build_model(self): # TODO:定义VGG19 的网络结构 print('Building vgg-19 model...') self.layers = {} # ConvolutionalLayer: kernel_size, channel_in, channel_out, padding, stride # MaxPoolingLayer: kernel_size, stride # FlattenLayer: input_shape, output_shape self.layers['conv1_1'] = ConvolutionalLayer(3, 3, 64, 1, 1) self.layers['relu1_1'] = ReLULayer() self.layers['conv1_2'] = ConvolutionalLayer(3, 64, 64, 1, 1) self.layers['relu1_2'] = ReLULayer() self.layers['pool1'] = MaxPoolingLayer(2, 2) self.layers['conv2_1'] = ConvolutionalLayer(3, 64, 128, 1, 1) self.layers['relu2_1'] = ReLULayer() self.layers['conv2_2'] = ConvolutionalLayer(3, 128, 128, 1, 1) self.layers['relu2_2'] = ReLULayer() self.layers['pool2'] = MaxPoolingLayer(2, 2) self.layers['conv3_1'] = ConvolutionalLayer(3, 128, 256, 1, 1) self.layers['relu3_1'] = ReLULayer() self.layers['conv3_2'] = ConvolutionalLayer(3, 256, 256, 1, 1) self.layers['relu3_2'] = ReLULayer() self.layers['conv3_3'] = ConvolutionalLayer(3, 256, 256, 1, 1) self.layers['relu3_3'] = ReLULayer() self.layers['conv3_4'] = ConvolutionalLayer(3, 256, 256, 1, 1) self.layers['relu3_4'] = ReLULayer() self.layers['pool3'] = MaxPoolingLayer(2, 2) self.layers['conv4_1'] = ConvolutionalLayer(3, 256, 512, 1, 1) self.layers['relu4_1'] = ReLULayer() self.layers['conv4_2'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu4_2'] = ReLULayer() self.layers['conv4_3'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu4_3'] = ReLULayer() self.layers['conv4_4'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu4_4'] = ReLULayer() self.layers['pool4'] = MaxPoolingLayer(2, 2) self.layers['conv5_1'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_1'] = ReLULayer() self.layers['conv5_2'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_2'] = ReLULayer() self.layers['conv5_3'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_3'] = ReLULayer() self.layers['conv5_4'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_4'] = ReLULayer() self.layers['pool5'] = MaxPoolingLayer(2, 2) self.layers['flatten'] = FlattenLayer(input_shape=[512, 7, 7], output_shape=[25088]) self.layers['fc6'] = FullyConnectedLayer(25088, 4096) self.layers['relu6'] = ReLULayer() self.layers['fc7'] = FullyConnectedLayer(4096, 4096) self.layers['relu7'] = ReLULayer() self.layers['fc8'] = FullyConnectedLayer(4096, 1000) self.layers['softmax'] = SoftmaxLossLayer() self.update_layer_list = [] for layer_name in self.layers.keys(): if 'conv' in layer_name or 'fc' in layer_name: self.update_layer_list.append(layer_name)
class MNIST_MLP(object): def __init__(self, batch_size=100, input_size=784, hidden1=32, hidden2=16, out_classes=10, lr=0.01, max_epoch=1, print_iter=100): self.batch_size = batch_size self.input_size = input_size self.hidden1 = hidden1 self.hidden2 = hidden2 self.out_classes = out_classes self.lr = lr self.max_epoch = max_epoch self.print_iter = print_iter def load_mnist(self, file_dir, is_images = 'True'): # Read binary data bin_file = open(file_dir, 'rb') bin_data = bin_file.read() bin_file.close() # Analysis file header if is_images: # Read images fmt_header = '>iiii' magic, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, bin_data, 0) else: # Read labels fmt_header = '>ii' magic, num_images = struct.unpack_from(fmt_header, bin_data, 0) num_rows, num_cols = 1, 1 data_size = num_images * num_rows * num_cols mat_data = struct.unpack_from('>' + str(data_size) + 'B', bin_data, struct.calcsize(fmt_header)) mat_data = np.reshape(mat_data, [num_images, num_rows * num_cols]) print('Load images from %s, number: %d, data shape: %s' % (file_dir, num_images, str(mat_data.shape))) return mat_data def load_data(self): # TODO: 调用函数 load_mnist 读取和预处理 MNIST 中训练数据和测试数据的图像和标记 print('Loading MNIST data from files...') train_images = self.load_mnist(os.path.join(MNIST_DIR, TRAIN_DATA), True) train_labels = self.load_mnist(os.path.join(MNIST_DIR, TRAIN_LABEL), False) test_images = self.load_mnist(os.path.join(MNIST_DIR, TEST_DATA), True) test_labels = self.load_mnist(os.path.join(MNIST_DIR, TEST_LABEL), False) self.train_data = np.append(train_images, train_labels, axis=1) self.test_data = np.append(test_images, test_labels, axis=1) # self.test_data = np.concatenate((self.train_data, self.test_data), axis=0) def shuffle_data(self): print('Randomly shuffle MNIST data...') np.random.shuffle(self.train_data) def build_model(self): # 建立网络结构 # TODO:建立三层神经网络结构 print('Building multi-layer perception model...') self.fc1 = FullyConnectedLayer(self.input_size, self.hidden1) self.relu1 = ReLULayer() self.fc2 = FullyConnectedLayer(self.hidden1, self.hidden2) self.relu2 = ReLULayer() self.fc3 = FullyConnectedLayer(self.hidden2, self.out_classes) self.softmax = SoftmaxLossLayer() self.update_layer_list = [self.fc1, self.fc2, self.fc3] def init_model(self): print('Initializing parameters of each layer in MLP...') for layer in self.update_layer_list: layer.init_param() def load_model(self, param_dir): print('Loading parameters from file ' + param_dir) params = np.load(param_dir).item() self.fc1.load_param(params['w1'], params['b1']) self.fc2.load_param(params['w2'], params['b2']) self.fc3.load_param(params['w3'], params['b3']) def save_model(self, param_dir): print('Saving parameters to file ' + param_dir) params = {} params['w1'], params['b1'] = self.fc1.save_param() params['w2'], params['b2'] = self.fc2.save_param() params['w3'], params['b3'] = self.fc3.save_param() np.save(param_dir, params) def forward(self, input): # 神经网络的前向传播 # TODO:神经网络的前向传播 h1 = self.fc1.forward(input) h1 = self.relu1.forward(h1) h2 = self.fc2.forward(h1) h2 = self.relu2.forward(h2) h3 = self.fc3.forward(h2) prob = self.softmax.forward(h3) return prob def backward(self): # 神经网络的反向传播 # TODO:神经网络的反向传播 dloss = self.softmax.backward() dh3 = self.fc3.backward(dloss) dh2 = self.relu2.backward(dh3) dh2 = self.fc2.backward(dh2) dh1 = self.relu1.backward(dh2) dh1 = self.fc1.backward(dh1) def update(self, lr): for layer in self.update_layer_list: layer.update_param(lr) def train(self): max_batch = self.train_data.shape[0] / self.batch_size print('Start training...') for idx_epoch in range(self.max_epoch): self.shuffle_data() for idx_batch in range(max_batch): batch_images = self.train_data[idx_batch*self.batch_size:(idx_batch+1)*self.batch_size, :-1] batch_labels = self.train_data[idx_batch*self.batch_size:(idx_batch+1)*self.batch_size, -1] prob = self.forward(batch_images) loss = self.softmax.get_loss(batch_labels) self.backward() self.update(self.lr) if idx_batch % self.print_iter == 0: print('Epoch %d, iter %d, loss: %.6f' % (idx_epoch, idx_batch, loss)) def evaluate(self): pred_results = np.zeros([self.test_data.shape[0]]) for idx in range(self.test_data.shape[0]/self.batch_size): batch_images = self.test_data[idx*self.batch_size:(idx+1)*self.batch_size, :-1] start = time.time() prob = self.forward(batch_images) end = time.time() print("inferencing time: %f"%(end-start)) pred_labels = np.argmax(prob, axis=1) pred_results[idx*self.batch_size:(idx+1)*self.batch_size] = pred_labels accuracy = np.mean(pred_results == self.test_data[:,-1]) print('Accuracy in test set: %f' % accuracy)
def build_model(self): # TODO:定义VGG19 的网络结构 print('Building vgg-19 model...') self.layers = {} self.layers['conv1_1'] = ConvolutionalLayer(3, 3, 64, 1, 1) self.layers['relu1_1'] = ReLULayer() self.layers['conv1_2'] = ConvolutionalLayer(3, 64, 64, 1, 1) self.layers['relu1_2'] = ReLULayer() self.layers['pool1'] = MaxPoolingLayer(2, 2) self.layers['conv2_1'] = ConvolutionalLayer(3, 64, 128, 1, 1) self.layers['relu2_1'] = ReLULayer() self.layers['conv2_2'] = ConvolutionalLayer(3, 128, 128, 1, 1) self.layers['relu2_2'] = ReLULayer() self.layers['pool2'] = MaxPoolingLayer(2, 2) self.layers['conv3_1'] = ConvolutionalLayer(3, 128, 256, 1, 1) self.layers['relu3_1'] = ReLULayer() self.layers['conv3_2'] = ConvolutionalLayer(3, 256, 256, 1, 1) self.layers['relu3_2'] = ReLULayer() self.layers['conv3_3'] = ConvolutionalLayer(3, 256, 256, 1, 1) self.layers['relu3_3'] = ReLULayer() self.layers['conv3_4'] = ConvolutionalLayer(3, 256, 256, 1, 1) self.layers['relu3_4'] = ReLULayer() self.layers['pool3'] = MaxPoolingLayer(2, 2) self.layers['conv4_1'] = ConvolutionalLayer(3, 256, 512, 1, 1) self.layers['relu4_1'] = ReLULayer() self.layers['conv4_2'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu4_2'] = ReLULayer() self.layers['conv4_3'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu4_3'] = ReLULayer() self.layers['conv4_4'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu4_4'] = ReLULayer() self.layers['pool4'] = MaxPoolingLayer(2, 2) self.layers['conv5_1'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_1'] = ReLULayer() self.layers['conv5_2'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_2'] = ReLULayer() self.layers['conv5_3'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_3'] = ReLULayer() self.layers['conv5_4'] = ConvolutionalLayer(3, 512, 512, 1, 1) self.layers['relu5_4'] = ReLULayer() self.layers['pool5'] = MaxPoolingLayer(2, 2) self.layers['flatten'] = FlattenLayer([512, 7, 7], [512 * 7 * 7]) self.layers['fc6'] = FullyConnectedLayer(512 * 7 * 7, 4096) self.layers['relu6'] = ReLULayer() self.layers['fc7'] = FullyConnectedLayer(4096, 4096) self.layers['relu7'] = ReLULayer() self.layers['fc8'] = FullyConnectedLayer(4096, 1000) self.layers['softmax'] = SoftmaxLossLayer() self.update_layer_list = [] for layer_name in self.layers.keys(): if 'conv' in layer_name or 'fc' in layer_name: self.update_layer_list.append(layer_name)