Python 将ZCA美白剂应用于keras中的VGG

Python 将ZCA美白剂应用于keras中的VGG,python,keras,deep-learning,vgg-net,Python,Keras,Deep Learning,Vgg Net,我正在使用VGG来训练我的数据: #分類するクラス 类别=['chino'、'cocoa'、'chiya'、'rize'、'syaro'] nb_类=len(类) img_宽度,img_高度=150,150 # トレーニング用とバリデーション用の画像格納先 列车数据目录='数据集/列车' 验证\数据\目录='数据集/验证' # 今回はトレーニング用に200枚、バリデーション用に50枚の画像を用意した。 nb_系列样品=200 nb_验证_样本=50 批量大小=16 nb_epoch=10 res

我正在使用VGG来训练我的数据:

#分類するクラス
类别=['chino'、'cocoa'、'chiya'、'rize'、'syaro']
nb_类=len(类)
img_宽度,img_高度=150,150
# トレーニング用とバリデーション用の画像格納先
列车数据目录='数据集/列车'
验证\数据\目录='数据集/验证'
# 今回はトレーニング用に200枚、バリデーション用に50枚の画像を用意した。
nb_系列样品=200
nb_验证_样本=50
批量大小=16
nb_epoch=10
result_dir='results'
如果操作系统路径不存在(结果目录):
os.mkdir(结果目录)
def vgg_型号_制造商():
VGG16のモデルを常设费用層以外使用。常设费用層のみ作成して結合して用意する """
#VGG16のロード。常设费用層は不要なので include_top=False
输入张量=输入(形状=(img\u宽度,img\u高度,3))
vgg16=vgg16(包括top=False、weights=imagenet、input\u tensor=input\u tensor)
#足球俱乐部層の作成
top_模型=顺序()
top_model.add(展平(输入_shape=vgg16.output_shape[1:]))
top_model.add(密集型(256,activation='relu'))
top_模型。添加(辍学(0.5))
top_model.add(密集型(nb_类,activation='softmax'))
#VGG16と常设费用層を結合してモデルを作成
模型=模型(输入=vgg16.input,输出=top_模型(vgg16.output))
回归模型
def图像_生成器():
""" ディレクトリ内の画像を読み込んでトレーニングデータとバリデーションデータの作成 """
列车\数据发生器=图像数据发生器(
重新缩放=1.0/255,
缩放范围=0.2,
水平(翻转=真)
验证\u datagen=ImageDataGenerator(重缩放=1.0/255)
train_generator=来自目录的train_datagen.flow_(
列车数据目录,
目标尺寸=(图像宽度、图像高度),
颜色模式='rgb',
类=类,
class_mode='classifical',
批次大小=批次大小,
洗牌=真)
验证\u生成器=验证\u datagen.flow\u来自\u目录(
验证\u数据\u目录,
目标尺寸=(图像宽度、图像高度),
颜色模式='rgb',
类=类,
class_mode='classifical',
批次大小=批次大小,
洗牌=真)
返回(序列发生器、验证发生器)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
开始=时间。时间()
# モデル作成
vgg_model=vgg_model_maker()
# 最後の卷积和多项式相乘層の直前までの層を冻结
对于vgg_模型中的层。层[:15]:
layer.trainable=错误
# 多クラス分類を指定
vgg_model.compile(loss='classifical_crossentropy',
优化器=优化器.SGD(lr=1e-3,动量=0.9),
指标=[‘准确度’])
# 画像のジェネレータ生成
序列生成器,验证生成器=图像生成器()
#微调
历史=vgg_model.fit_生成器(
列车发电机,
每个历元的样本数=nb列样本数,
nb_epoch=nb_epoch,
验证数据=验证生成器,
nb_val_样本=nb_验证_样本)
vgg_model.save_weights(os.path.join(result_dir,'finetunning.h5'))
进程时间=(time.time()-start)/60
打印(u'学習終了。かかった時間は', 处理时间,处理时间分です。')
如果它只是VGG一个,它工作得很好,但我想对它应用zca增白。Keras允许只使用一行代码添加zca(
zca\u whitening=True
),但问题是我们以后必须调用
fit()
函数

ImageDataGenerator#fit()
的参数是x,这是训练数据集。但是在本程序中,训练数据集将在后面定义。因此,在这种情况下如何使用zca白化

更新 我已经按照下面的评论做了,但它引发了一个错误:

需要的工作数组太大--无法使用执行计算 标准32位LAPACK


为了减少内存,我尝试只将6个图像放入训练数据集中,但没有任何更改。那么这个错误到底意味着什么呢?

实际上非常简单。创建生成器+
DirectoryIterator
,但不增白,加载一组批(包含足够的样本来表示数据集)在内存中,并使用它们安装新的发电机:

将numpy导入为np
从keras.preprocessing.image导入ImageDataGenerator
列车_dir='/datasets/train/'
gen_tr_批次=4
#网络培训生成器的生成器。
gen_序列=(图像数据生成器(重缩放=1./255)
.flow_from_目录(train_dir,
目标_大小=(256,256),
批次大小=32,
洗牌=真)
gen_tr_x=np.vstack(下一个(gen_系列)[0]用于范围内(gen_tr_批次))
#网络培训的实际发电机。
g=ImageDataGenerator(重缩放=1./255。,
zca_=真)
g、 安装(gen_tr_x)
列车=g.来自列车目录的流量(列车目录)
#网络培训。。。

注意:不要发布链接。最好在帖子中简单地写下一段可复制的代码片段。

什么意思对VGG应用白化?您通常会对输入进行白化,而不是网络本身。请澄清您的问题。白化输入是我在这里的意思。我在图像生成方面有问题。谢谢!我将尽量不这样做再次发布链接。谢谢!我试过了,但知道程序这么说“无法使用标准32位LAPACK执行计算。这意味着什么?我没有这个问题。请在此转储您的pip包列表,并向我提供有关您的设置的一些信息。此外,有人在处理非常大的矩阵时遇到了问题。请将
gen\u tr\u batches
减少到1,并将
batch\u size
减少到1。然后看看它是否有效。是的,我也会第二个问题是“类似的问题”,但我已经将所有批处理大小更改为1,但没有任何效果。我的代码与您编写的代码基本相同,只是我将目标大小更改为(100100)。是吗