【问题标题】:Converting code from TFLearn to work in Keras将代码从 TFLearn 转换为在 Keras 中工作
【发布时间】:2017-06-14 16:10:23
【问题描述】:

我正在使用一些用 TFLearn 编写的代码作为参考,并尝试使用 Keras 重写它。我对这两个包都很陌生,我不确定我是否写得正确。

我已经尝试了我的代码 - 它有效 - 但我没有得到预期的结果(超过 20 多个时期的准确性没有提高),我想知道我是否在某个地方犯了错误。

就我的数据而言,我有一个“数据”目录,其中包含“培训”和“验证”目录。在其中的每一个里面是我的 3 个图像类中的每一个的 3 个目录。

TFLearn 原代码:

import numpy as np
import tflearn
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.estimator import regression

def createModel(nbClasses,imageSize):

    convnet = input_data(shape=[None, imageSize, imageSize, 1], name='input')

    convnet = conv_2d(convnet, 64, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = conv_2d(convnet, 128, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = conv_2d(convnet, 256, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = conv_2d(convnet, 512, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = fully_connected(convnet, 1024, activation='elu')
    convnet = dropout(convnet, 0.5)

    convnet = fully_connected(convnet, nbClasses, activation='softmax')
    convnet = regression(convnet, optimizer='rmsprop', loss='categorical_crossentropy')

    model = tflearn.DNN(convnet)
return model

我使用 Keras 的代码:

from keras import backend as K
from keras.layers.core import Flatten, Dense, Dropout, Activation
from keras.optimizers import rmsprop
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D
import numpy as np

num_classes = 3
image_size = 256
nb_epoch = 80
batch_size = 32
nb_train_samples = 7994
nb_validation_samples = 2000

if K.image_data_format() == 'channels_first':
    input_shape = (3, image_size, image_size)
else:
    input_shape = (image_size, image_size, 3)

model = Sequential()

model.add(ZeroPadding2D((1,1), input_shape=input_shape))

model.add(Conv2D(64, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(256, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(512, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('elu'))
model.add(Dropout(0.5))

model.add(Dense(num_classes))
model.add(Activation('softmax'))
opt = rmsprop()
model.compile(loss='categorical_crossentropy',
         optimizer = opt,
         metrics = ['accuracy'])

train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
train_datagen = ImageDataGenerator(rescale= 1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(image_size, image_size),
    batch_size=batch_size,
    class_mode='categorical'
    )

validation_generator = validation_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(image_size, image_size),
    batch_size=batch_size,
    class_mode='categorical'
    )



model.fit_generator(train_generator,
                steps_per_epoch=(nb_train_samples // batch_size),
                epochs=nb_epoch,
                validation_data=validation_generator,
                validation_steps=(nb_validation_samples // batch_size)
               )

model.save_weights('first_try.h5')

【问题讨论】:

  • 如何批量处理数据以及如何训练?您可以为此添加代码吗?
  • 刚刚添加了我的其余代码
  • 我用三类 MNIST 数据集尝试了你的代码,并且可以很好地训练。正如预期的那样,精度在第一个时期增加。至少对于 MNIST,我可以通过仅使用前两个 Conv 层和一个 64 的密集层来更快地训练。根据您的数据,我建议您尝试使用更简单的模型(即 2 个 Conv 层),检查模型是否正在学习和然后从那里改进。
  • 感谢您检查我的代码。我正在使用此代码使用 256x256 频谱图在 3 种音乐流派之间进行分类,但准确度始终在 0.33 左右(不比随机更好)。 TFlearn 代码来自github.com/despoisj/DeepAudioClassification,他尝试了一个类似的项目,显然取得了成功。我不知道为什么我不能复制相同的
  • 更新:我按照您的建议做了,并将其带回仅 2 个卷积层,并且 val_acc 在 8 个 epoch 后从最初的 0.3571 稳步上升到 0.6417。感谢您的帮助

标签: python keras tflearn


【解决方案1】:

我用三类 MNIST 数据集尝试了您的代码,并且可以很好地训练。正如预期的那样,精度在第一个时期增加。

至少对于 MNIST,我可以通过仅使用前两个 Conv 层和一个 64 的 Dense Layer 进行更快的训练。根据您的数据,我建议您尝试使用更简单的模型(即 2 个 Conv 层),检查模型是否正在学习,然后从那里改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2022-01-14
    • 2020-07-31
    • 2019-07-03
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多