结合 CNN 和 LSTM
Combine CNN with LSTM
我正在寻求与 CNN 一起实施 RNN,以便根据两张图像而不是单独使用 CNN 进行预测。
我正在尝试修改 alexnet 模型代码:
def alexnet(width, height, lr, output=3):
network = input_data(shape=[None, width, height, 1], name='input')
network = conv_2d(network, 96, 11, strides=4, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 256, 5, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 256, 3, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, output, activation='softmax')
network = regression(network, optimizer='momentum',
loss='categorical_crossentropy',
learning_rate=lr, name='targets')
model = tflearn.DNN(network, checkpoint_path='model_alexnet',
max_checkpoints=1, tensorboard_verbose=0, tensorboard_dir='log')
return model
我的图像在一个 np 数组中,其中每个元素都是一个图像的像素数据。我在使用 RNN 实现使用两个图像的功能时遇到问题。
我看过 tflearn 的 reshape 和 lstm 方法,我认为它们应该放在最终的全连接层之前,但不确定如何指定要使用的图像数量。
此外,使用 Keras 会更容易实现吗?
如果我理解正确,您需要执行以下操作。设 model
是将一系列图像作为输入并返回预测的网络。使用函数 API,其示意图如下所示:
def create_model():
input_data = keras.Input(shape=(number-of-images,shape-of-images))
### processing part ###
model = keras.Model(input_images, your-predictions)
return model
model = create_model()
在 processing part
中,您想获得每个图像的编码,然后使用 RNN 将它们作为序列进行分析。
第一步,您需要获取所有图像的编码。设 encoder
为对单个图像进行编码的网络,返回 enc_dim
维编码。为了有效地获得所有图像的编码,请注意在训练期间 model
处理形状为 (batch-size,number-of-images,shape-of-images)
的数据。因此,总共有 total-number-of-images
=(batch-size) x (number-of-images) 个图像。要处理它们,请将 input_data
重塑为维度 (total-number-of-images,shape-of-images) 如下:
input_data_reshaped = tf.reshape(input_data, (-1,shape-of-images)),
并通过 encoder
:
image_encodings_flatterned = encoder(input_data_reshaped).
这将产生形式为 (total-number-of-images,enc_dim) 的输出。要处理编码,您需要恢复 batch-size 维度。这可以很容易地完成:
image_encodings = tf.reshape(image_encodings_flatterned, (-1,number-of-images,enc_dim))
正如预期的那样,它将数据重塑为 (batch-size,number-of-images,enc_dim)。该数据可以很容易地由 RNN 层或其组合处理。例如,对于单个 LSTM 层,
rnn_analyzer = tf.keras.layers.LSTM(parameters)
预测结果如下:
rnn_encodings = rnn_analyzer(image_encodings).
rnn_encodings
可以进一步被密集层用来进行最终预测。
将以上内容放在 model
的 processing part
中,您将达到目标。
我正在寻求与 CNN 一起实施 RNN,以便根据两张图像而不是单独使用 CNN 进行预测。 我正在尝试修改 alexnet 模型代码:
def alexnet(width, height, lr, output=3):
network = input_data(shape=[None, width, height, 1], name='input')
network = conv_2d(network, 96, 11, strides=4, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 256, 5, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 384, 3, activation='relu')
network = conv_2d(network, 256, 3, activation='relu')
network = max_pool_2d(network, 3, strides=2)
network = local_response_normalization(network)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, 4096, activation='tanh')
network = dropout(network, 0.5)
network = fully_connected(network, output, activation='softmax')
network = regression(network, optimizer='momentum',
loss='categorical_crossentropy',
learning_rate=lr, name='targets')
model = tflearn.DNN(network, checkpoint_path='model_alexnet',
max_checkpoints=1, tensorboard_verbose=0, tensorboard_dir='log')
return model
我的图像在一个 np 数组中,其中每个元素都是一个图像的像素数据。我在使用 RNN 实现使用两个图像的功能时遇到问题。
我看过 tflearn 的 reshape 和 lstm 方法,我认为它们应该放在最终的全连接层之前,但不确定如何指定要使用的图像数量。
此外,使用 Keras 会更容易实现吗?
如果我理解正确,您需要执行以下操作。设 model
是将一系列图像作为输入并返回预测的网络。使用函数 API,其示意图如下所示:
def create_model():
input_data = keras.Input(shape=(number-of-images,shape-of-images))
### processing part ###
model = keras.Model(input_images, your-predictions)
return model
model = create_model()
在 processing part
中,您想获得每个图像的编码,然后使用 RNN 将它们作为序列进行分析。
第一步,您需要获取所有图像的编码。设 encoder
为对单个图像进行编码的网络,返回 enc_dim
维编码。为了有效地获得所有图像的编码,请注意在训练期间 model
处理形状为 (batch-size,number-of-images,shape-of-images)
的数据。因此,总共有 total-number-of-images
=(batch-size) x (number-of-images) 个图像。要处理它们,请将 input_data
重塑为维度 (total-number-of-images,shape-of-images) 如下:
input_data_reshaped = tf.reshape(input_data, (-1,shape-of-images)),
并通过 encoder
:
image_encodings_flatterned = encoder(input_data_reshaped).
这将产生形式为 (total-number-of-images,enc_dim) 的输出。要处理编码,您需要恢复 batch-size 维度。这可以很容易地完成:
image_encodings = tf.reshape(image_encodings_flatterned, (-1,number-of-images,enc_dim))
正如预期的那样,它将数据重塑为 (batch-size,number-of-images,enc_dim)。该数据可以很容易地由 RNN 层或其组合处理。例如,对于单个 LSTM 层,
rnn_analyzer = tf.keras.layers.LSTM(parameters)
预测结果如下:
rnn_encodings = rnn_analyzer(image_encodings).
rnn_encodings
可以进一步被密集层用来进行最终预测。
将以上内容放在 model
的 processing part
中,您将达到目标。