Digamos que você tenha um conjunto de dados com imagens e alguns dados em um .csv
para cada imagem. Seu objetivo é criar um NN que tenha um ramo de convolução e outro (no meu caso, um MLP).
Agora, existem muitos guias ( um aqui , outro ) sobre como criar a rede, esse não é o problema.
O problema aqui é como criar um iterador na forma de [[convolution_input, other_features], target]
quando convolution_input
é de um fluxo Keras que adiciona imagens aumentadas.ImageDataGenerator
Mais especificamente, quando a n-ésima imagem (que pode ser uma imagem aumentada ou não) é alimentada para o NN, quero que seus recursos sejam originais other_features
.
Encontrei poucas tentativas ( aqui e aqui , a segunda parecia promissora, mas não consegui descobrir como lidar com imagens aumentadas) ao fazer exatamente isso, mas elas não parecem levar em conta a possível manipulação de conjunto de dados que o gerador Keras faz.
fonte
flow
ou precisaflow_from_directory
? (flow
significa que você pode manter todas as imagens carregadas na memória)flow_from_dataframe
já que tenho nomes de arquivos, recursos e classesRespostas:
Digamos que você tenha um csv, de modo que suas imagens e outros recursos estejam no arquivo.
em que id representa o nome da imagem, seguido pelos recursos e seguido pelo seu destino (classe para classificação, número para regeressão)
primeiro vamos definir um gerador de dados e depois podemos substituí-lo.
vamos ler os dados do csv em um dataframe do pandas e usar o flow_from_dataframe de keras para ler o dataframe.
Você sempre pode adicionar seu aumento no ImageDataGenerator.
O que deve ser observado no código acima em flow_from_dataframe é
x_col = o nome da imagem
y_col = normalmente colunas com o nome da classe, mas vamos substituí-lo mais tarde fornecendo primeiro todas as outras colunas no csv. ou seja, feat_1, feat_2 .... até o class_label
class_mode = raw, sugira que o gerador retorne todos os valores em y como estão.
Agora, vamos substituir / herdar o gerador acima e criar um novo, de forma que ele retorne [img, otherfeatures], [target]
Aqui está o código com comentários como explicações
crie função semelhante para o seu gerador de validação. Use train_test_split para dividir seu quadro de dados, se necessário, e criar 2 geradores e substituí-los.
passe a função no model.fit_generator como este
fonte
if(count==len(df.index))
acompanhar a época se o conjunto de dados aumentado é muito mais numeroso que o original?