我对tensorflow还比较新手,正在尝试将这个keras cnn迁移到tensorflow上。
inputs = Input(shape=(1, BANDS, 500)) x = Conv2D(100, kernel_size=(BANDS, 50), kernel_initializer='he_uniform')(inputs) x = BatchNormalization(axis=1)(x) x = LeakyReLU()(x) x = Dropout(0.25)(x) x = Conv2D(100, kernel_size=(1, 1), kernel_initializer='he_uniform')(x) x = BatchNormalization(axis=1)(x) x = LeakyReLU()(x) x = Dropout(0.25)(x) x = Conv2D(15, kernel_size=(1, 1), kernel_initializer='he_uniform')(x) x = Lambda(softmax, arguments={'axis': 1}, name='softmax')(x) x = GlobalAveragePooling2D()(x) model = Model(inputs=inputs, outputs=x) model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.001), metrics=['accuracy'])
这是TensorFlow的代码
def sai_net( ): network = input_data(shape=[None, NUM_OF_BANDS, 500, 1 ], name='features') network = conv_2d(network, 100 , [NUM_OF_BANDS,50 ], activation='relu') network = local_response_normalization(network) network = dropout(network, 0.25) network = conv_2d(network, 100 , [1,1], activation='relu') network = local_response_normalization(network) network = dropout(network, 0.25) network = conv_2d(network, 15, [1,1], activation='relu') network = fully_connected(network, 15, activation='softmax') network = regression(network, optimizer='momentum', loss='categorical_crossentropy', learning_rate=LEARNING_RATE, name='labels') model = tflearn.DNN(network, checkpoint_path=MODEL_PATH + MODEL_NAME, tensorboard_dir=TRAIN_PATH, tensorboard_verbose=3, max_checkpoints=1) return model
首先,我在如何在tensorflow中使用GlobalAveragePooling时遇到了麻烦,当我尝试使用全连接层时,它会出现bad:alloc错误,可能是因为内存过大所致。
基本上,输入是一个Bands*500的矩阵,在以下情况下bands == 200,输出是15个场景标签中的一个。有三个问题:
1) 如何在这个网络中应用GlobalAveragePooling层
2) std:bad alloc是否是由于全连接层引起的(8GB的内存,256GB的SSD)
3) 如何在这个网络中在激活之前应用归一化
回答:
由于没有人回答这个问题,所以我自己解决了。bad:alloc确实是由于内存开销过大引起的。使用tflearn库在tensorflow中实现这个模型的正确网络实现如下:
def sai_net( ): network = input_data(shape=[None, NUM_OF_BANDS, 500, 1 ], name='features') print(network.shape) network = conv_2d(network, 100 , [NUM_OF_BANDS,50 ] , strides = [NUM_OF_BANDS,1] ) print(network.shape) network = tflearn.layers.batch_normalization(network) print(network.shape ) network = tflearn.activations.relu(network) print(network.shape ) network = dropout(network, 0.25) print(network.shape ) network = conv_2d(network, 100 , [1,1]) print(network.shape ) network = tflearn.layers.batch_normalization(network) network = tflearn.activations.relu(network) network = dropout(network, 0.25) network = conv_2d(network, 15, [1,1], activation='softmax') print(network.shape ) network = tflearn.layers.conv.global_avg_pool (network, name='GlobalAvgPool') print(network.shape) network = regression(network, optimizer='momentum', loss='categorical_crossentropy', learning_rate=LEARNING_RATE, name='labels') model = tflearn.DNN( network,tensorboard_dir=TRAIN_PATH, tensorboard_verbose=3 ) return model